import Surreal from 'surrealdb'; import { argv } from 'process'; const auth = { username: 'root', password: 'root', } const db_url = "http://localhost:8000"; const db_name = { namespace: "ts_test", database: "access_test" }; async function main() { // Extract username and password from command-line arguments const db = new Surreal(); try { await db.connect(db_url, { auth }); await db.use(db_name); } catch (err) { console.error("Could not connect to SurrealDB server: ", err instanceof Error ? err.message : String(err)); throw (err); } try { await db.query(` define table if not exists user schemafull; `); await db.query(` define field if not exists username on user type string; define field if not exists password on user type string; define field if not exists roles on user type set<string>; `); await db.query(` define index if not exists idx_username on user fields username unique; `); } catch (err) { console.error("Could not create table user or its fields: ", err instanceof Error ? err.message : String(err)); throw (err); } try { await db.query(` insert into user [ { username: "test1", password: crypto::argon2::generate("test"), roles: [] }, { username: "test2", password: crypto::argon2::generate("test"), roles: ['product_manager'] } ]; `) } catch (err) { console.error("Could not create user entries: ", err instanceof Error ? err.message : String(err)); } try { await db.query(` define table if not exists product schemafull permissions for select where $auth.roles contains 'product_manager'; define field if not exists code on product type string; define field if not exists available on product type bool; define index if not exists idx_code on product fields code; `); } catch (err) { console.error("Could not create table product: ", err instanceof Error ? err.message : String(err)); throw (err); } try { await db.query(` insert into product { code: "test_product1", available: true }; `) } catch (err) { console.error("Could not create user entries: ", err instanceof Error ? err.message : String(err)); } try { await db.query(` define access overwrite user on database type record signup (create user set username = $username, password = crypto::argon2::generate($password), roles=[]) signin (select * from user where username = $username and crypto::argon2::compare(password, $password)); `) } catch (err) { console.error("Could not define access: ", err instanceof Error ? err.message : String(err)); } } main();