|
@@ -0,0 +1,96 @@
|
|
|
|
+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();
|