Newer
Older
surreal_access_control_system / backend / src / init_db.ts
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();