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