Skip to content

Instantly share code, notes, and snippets.

@Lightnet
Last active October 15, 2022 06:01
Show Gist options
  • Save Lightnet/0fccfc0cab19108a67c60a826b1693e4 to your computer and use it in GitHub Desktop.
Save Lightnet/0fccfc0cab19108a67c60a826b1693e4 to your computer and use it in GitHub Desktop.
surrealdb inquirer http rest api

Work in progress!

By using the inquirer and surrealDB for http rest api testing builds.

To test the builds.

simple setup user and scope test.

/*
Information:
Basic setup test for http rest admin root and set up user table and scope.
User sign in and sign up. Simple SQL text query.
Programs:
- SurrealDB
- Nodejs
Packages:
- inquirer
- node-fetch
Admin:
user:root
pass:root
user:
SC:allusers
alias:test
pass:test
Note there some different access for admin and user.
```
DEFINE TABLE user SCHEMALESS;
DEFINE INDEX idx_alias ON user COLUMNS alias UNIQUE;--make sure the no same name
DEFINE FIELD update ON TABLE user TYPE datetime VALUE $before OR time::now();
DEFINE FIELD created ON TABLE user TYPE datetime VALUE time::now();
```
```
DEFINE SCOPE allusers
SESSION 14d
SIGNUP ( CREATE user SET alias = $alias, pass = crypto::argon2::generate($pass) )
SIGNIN ( SELECT * FROM user WHERE alias = $alias AND crypto::argon2::compare(pass, $pass) );
```
*/
// https://www.digitalocean.com/community/tutorials/nodejs-interactive-command-line-prompts
import inquirer from 'inquirer';
import fetch from 'node-fetch';
function textToBase64(_data){
//note this is nodejs not browser support
return Buffer.from(_data).toString('base64');
}
let root_user = 'root';
let root_pass = 'root';
let root_NS = 'test';
let root_DB = 'test';
let user_name = 'guest';
let user_pass = 'guest';
let user_scope = 'allusers';
let host = 'http://localhost:8000';
let token = '';
async function fetchQuerySQL(query){
//console.log(textToBase64(`${root_user}:${root_pass}`))
let response = await fetch(`${host}/sql`, {
method: 'POST',
headers:{
'Accept': 'application/json',
'NS': root_NS, // Specify the namespace
'DB': root_DB, // Specify the database
//"Authorization": 'Basic ' + textToBase64('root'+':'+'root') ,
"Authorization": 'Basic ' + textToBase64(`${root_user}:${root_pass}`) ,
},
body: query,
})
//console.log(response)
let data = await response.json();
//console.log(data);
return data;
}
async function signUp(options){
if(!options){
options={}
}
let response = await fetch(`${host}/signup`, {
method: 'POST',
headers:{
'Accept': 'application/json'
},
body: JSON.stringify({
NS:root_NS,
DB:root_DB,
SC:user_scope,
alias: options?.alias || 'test',
pass: options?.pass || "pass"
}),
})
let data = await response.json();
//console.log(data);
return data;
}
async function signIn(options){
if(!options){
options={};
}
let response = await fetch(`${host}/signin`, {
method: 'POST',
headers:{
'Accept': 'application/json'
},
body: JSON.stringify({
NS:root_NS,
DB:root_DB,
SC:user_scope,
alias: options.alias ||'test',
pass: options.pass || "pass"
}),
})
let data = await response.json();
//console.log(data);
return data;
}
async function tokenQuerySQL(token, query){
let response = await fetch(`${host}/sql`, {
method: 'POST',
headers:{
'Accept': 'application/json',
'NS': root_NS, // Specify the namespace
'DB': root_DB, // Specify the database
"Authorization": 'Bearer ' + token ,
},
body: query,
})
let data = await response.json();
//console.log(data);
return data;
}
async function setupUser(){
let query =
`DEFINE TABLE user SCHEMALESS;
DEFINE INDEX idx_alias ON user COLUMNS alias UNIQUE;
DEFINE FIELD update ON TABLE user TYPE datetime VALUE $before OR time::now();
DEFINE FIELD created ON TABLE user TYPE datetime VALUE time::now();
`;
let data = await fetchQuerySQL(query)
console.log(data)
}
async function setupScopeUser(){
let query = `
DEFINE SCOPE allusers
SESSION 14d
SIGNUP ( CREATE user SET alias = $alias, pass = crypto::argon2::generate($pass) )
SIGNIN ( SELECT * FROM user WHERE alias = $alias AND crypto::argon2::compare(pass, $pass) )
`;
let data = await fetchQuerySQL(query)
console.log(data)
}
async function setupMessage(){
let data;
let query;
query =
`DEFINE TABLE message SCHEMALESS;
DEFINE FIELD update ON TABLE message TYPE datetime VALUE $before OR time::now();
DEFINE FIELD created ON TABLE message TYPE datetime VALUE time::now();
`;
//query = `SELECT * FROM user;`
data = await fetchQuerySQL(query)
console.log(data)
}
function setupAdmin(){
inquirer
.prompt([{
name:'user',
message:"User Name:",
default:'root'
},{
name:'pass',
message:"Password:",
default:'root'
},{
name:'url',
message:"SurrealDB Url:",
default:'http://localhost:8000'
},{
name:'NS',
message:"Name Space",
default:'test'
},{
name:'DB',
message:"Database",
default:'test'
},{
name:'scope',
message:"scope access for signin and signup",
default:'allusers'
}])
.then( async (answers) => {
root_user = answers.user;
root_pass = answers.pass;
root_NS = answers.NS;
root_DB = answers.DB;
user_scope = answers.scope;
mainEntry()
})
.catch((error) => {
if (error.isTtyError) {
// Prompt couldn't be rendered in the current environment
} else {
// Something else went wrong
}
});
}
function isignup(){
inquirer
.prompt([{
name:'user',
message:"User Name:",
default:'test'
},{
name:'pass',
message:"Password:",
default:'pass'
}])
.then( async (answers) => {
//console.info('answers:', answers);
user_name = answers.user;
user_pass = answers.pass;
const data = await signUp({alias:user_name,pass:user_pass})
console.log(data)
if(data?.token){
token = data.token;
}
mainEntry()
})
.catch((error) => {
console.log(error)
if (error.isTtyError) {
// Prompt couldn't be rendered in the current environment
} else {
// Something else went wrong
}
});
}
function isignin(){
inquirer
.prompt([{
name:'user',
message:"User Name:",
default:'test'
},{
name:'pass',
message:"Password:",
default:'pass'
}])
.then( async (answers) => {
//console.info('answers:', answers);
user_name = answers.user;
user_pass = answers.pass;
//console.log("signin???")
const data = await signIn({alias:user_name,pass:user_pass})
console.log(data)
if(data?.token){
token = data.token;
}
mainEntry()
})
.catch((error) => {
//console.log(error)
if (error.isTtyError) {
// Prompt couldn't be rendered in the current environment
} else {
// Something else went wrong
}
});
}
function iquery(){
inquirer
.prompt([{
name:'sql',
message:"SurrealDB TEXT SQL:",
default:'SELECT * FROM user;'
}])
.then( async (answers) => {
// Use user feedback for... whatever!!
console.info('answers:', answers);
//console.info('user:', answers.user);
//console.info('pass:', answers.pass);
//user_name = answers.user;
let data = await tokenQuerySQL(token,answers.sql)
console.log(data)
mainEntry();
})
.catch((error) => {
console.log(error)
if (error.isTtyError) {
// Prompt couldn't be rendered in the current environment
} else {
// Something else went wrong
}
});
}
function setupDatabase(){
inquirer
.prompt([
/* Pass your questions in here */
{
name: 'select',
message: 'setup DEFINE:',
//type:'rawlist',
type:'list',
choices:[
{
name:'Set up Table User',
value:1
},
{
name:'Set Up Scope allusers (for sign up and sign in )',
value:2
},
{
name:'set up Message',
value:3
},
{
name:'set up all',
value:4
},
{
name:'Back',
value:5
}
],
default:0,
},
])
.then( async (answers) => {
// Use user feedback for... whatever!!
console.info('answers:', answers);
console.info('Select:', answers.select);
if(answers.select == 1){
await setupUser();
setupDatabase();
}
if(answers.select == 2){
await setupScopeUser();
setupDatabase();
}
if(answers.select == 3){
await setupMessage();
setupDatabase();
}
if(answers.select == 4){
await setupScopeUser();
await setupScopeUser();
await setupMessage();
setupDatabase();
}
if(answers.select == 5){
mainEntry();
}
})
.catch((error) => {
console.log(error)
if (error.isTtyError) {
// Prompt couldn't be rendered in the current environment
} else {
// Something else went wrong
}
});
}
function adminquery(){
inquirer
.prompt([{
name:'sql',
message:"Admin TEXT SQL:",
default:'SELECT * FROM user;'
}])
.then( async (answers) => {
console.info('SurrealQL:', answers);
let data = await fetchQuerySQL(answers.sql)
console.log(data)
if(data[0]?.result){
console.log(data[0].result)
}
mainEntry();
})
.catch((error) => {
console.log(error)
if (error.isTtyError) {
// Prompt couldn't be rendered in the current environment
} else {
// Something else went wrong
}
});
}
function mainEntry(){
inquirer
.prompt([
{
name: 'select',
message: 'SurrealDB http REST API:',
//type:'rawlist',
type:'list',
choices:[
{
name:'Set Up Database (default empty scope access and table)',
value:1
},
{
name:'Set up Admin & Access',
value:2
},
{
name:'Admin Query',
value:3
},
new inquirer.Separator(),
{
name:'Sign Up',
value:4
},
{
name:'Sign In',
value:5
},
{
name:'Token from (sign in/up)',
value:6
},
{
name:'Token Query',
value:7
},
new inquirer.Separator(),
{
name:'Show Config',
value:8
},
{
name:'Quit',
value:9
},
new inquirer.Separator()
],
default:0,
},
])
.then( async (answers) => {
console.info('answers:', answers);
console.info('Select:', answers.select);
if(answers.select == 1){
await setupDatabase();
}
if(answers.select == 2){
setupAdmin();
}
if(answers.select == 3){
adminquery();
}
if(answers.select == 4){
isignup();
}
if(answers.select == 5){
isignin();
}
if(answers.select == 6){
if(token){
console.log(token)
}else{
console.log("TOKEN EMPTY")
}
mainEntry()
}
if(answers.select == 7){
iquery();
}
if(answers.select == 8){
console.log("root_user: ",root_user)
console.log("root_pass: ",root_pass)
console.log("root_NS: ",root_NS)
console.log("root_DB: ",root_DB)
console.log("user_name: ",user_name)
console.log("user_pass: ",user_pass)
console.log("user_scope: ",user_scope)
console.log("host: ",host)
mainEntry();
}
})
.catch((error) => {
console.log(error)
if (error.isTtyError) {
// Prompt couldn't be rendered in the current environment
} else {
// Something else went wrong
}
});
}
//start script
(()=>{
mainEntry();
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment