fase(9): auth module with casl rbac and session management
This commit is contained in:
81
dist/db/migrations/004_auth_tables.js
vendored
Normal file
81
dist/db/migrations/004_auth_tables.js
vendored
Normal file
@@ -0,0 +1,81 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.up = up;
|
||||
exports.down = down;
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
async function up(db) {
|
||||
await db.schema
|
||||
.createTable('users')
|
||||
.ifNotExists()
|
||||
.addColumn('id', 'text', (col) => col.primaryKey())
|
||||
.addColumn('email', 'text', (col) => col.notNull().unique())
|
||||
.addColumn('name', 'text', (col) => col.notNull())
|
||||
.addColumn('password_hash', 'text', (col) => col.notNull())
|
||||
.addColumn('role', 'text', (col) => col.notNull().defaultTo('member'))
|
||||
.addColumn('org_id', 'text')
|
||||
.addColumn('created_at', 'integer', (col) => col.notNull())
|
||||
.addColumn('updated_at', 'integer', (col) => col.notNull())
|
||||
.execute();
|
||||
await db.schema
|
||||
.createTable('organizations')
|
||||
.ifNotExists()
|
||||
.addColumn('id', 'text', (col) => col.primaryKey())
|
||||
.addColumn('name', 'text', (col) => col.notNull())
|
||||
.addColumn('slug', 'text', (col) => col.notNull().unique())
|
||||
.addColumn('created_at', 'integer', (col) => col.notNull())
|
||||
.execute();
|
||||
await db.schema
|
||||
.createTable('org_members')
|
||||
.ifNotExists()
|
||||
.addColumn('id', 'text', (col) => col.primaryKey())
|
||||
.addColumn('org_id', 'text', (col) => col.notNull().references('organizations.id'))
|
||||
.addColumn('user_id', 'text', (col) => col.notNull().references('users.id'))
|
||||
.addColumn('role', 'text', (col) => col.notNull().defaultTo('member'))
|
||||
.addColumn('joined_at', 'integer', (col) => col.notNull())
|
||||
.execute();
|
||||
await db.schema
|
||||
.createTable('api_keys')
|
||||
.ifNotExists()
|
||||
.addColumn('id', 'text', (col) => col.primaryKey())
|
||||
.addColumn('user_id', 'text', (col) => col.notNull().references('users.id'))
|
||||
.addColumn('org_id', 'text', (col) => col.notNull())
|
||||
.addColumn('name', 'text', (col) => col.notNull())
|
||||
.addColumn('key_hash', 'text', (col) => col.notNull().unique())
|
||||
.addColumn('key_prefix', 'text', (col) => col.notNull())
|
||||
.addColumn('permissions', 'text', (col) => col.notNull().defaultTo('["member"]'))
|
||||
.addColumn('expires_at', 'integer')
|
||||
.addColumn('last_used_at', 'integer')
|
||||
.addColumn('created_at', 'integer', (col) => col.notNull())
|
||||
.execute();
|
||||
await db.schema
|
||||
.createTable('auth_sessions')
|
||||
.ifNotExists()
|
||||
.addColumn('id', 'text', (col) => col.primaryKey())
|
||||
.addColumn('user_id', 'text', (col) => col.notNull().references('users.id'))
|
||||
.addColumn('token', 'text', (col) => col.notNull().unique())
|
||||
.addColumn('expires_at', 'integer', (col) => col.notNull())
|
||||
.addColumn('created_at', 'integer', (col) => col.notNull())
|
||||
.execute();
|
||||
await db.schema
|
||||
.createIndex('idx_auth_sessions_token')
|
||||
.ifNotExists()
|
||||
.on('auth_sessions')
|
||||
.columns(['token'])
|
||||
.execute();
|
||||
await db.schema
|
||||
.createIndex('idx_users_email')
|
||||
.ifNotExists()
|
||||
.on('users')
|
||||
.columns(['email'])
|
||||
.execute();
|
||||
}
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
async function down(db) {
|
||||
await db.schema.dropIndex('idx_users_email').ifExists().execute();
|
||||
await db.schema.dropIndex('idx_auth_sessions_token').ifExists().execute();
|
||||
await db.schema.dropTable('auth_sessions').ifExists().execute();
|
||||
await db.schema.dropTable('api_keys').ifExists().execute();
|
||||
await db.schema.dropTable('org_members').ifExists().execute();
|
||||
await db.schema.dropTable('organizations').ifExists().execute();
|
||||
await db.schema.dropTable('users').ifExists().execute();
|
||||
}
|
||||
Reference in New Issue
Block a user