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(); | |
})(); |