hts/internal/db/src/schema/rbac.ts

214 lines
6.7 KiB
TypeScript

import { relations } from "drizzle-orm";
import {
bigint,
datetime,
index,
mysqlTable,
primaryKey,
unique,
uniqueIndex,
varchar,
} from "drizzle-orm/mysql-core";
import { keys } from "./keys";
import { workspaces } from "./workspaces";
export const permissions = mysqlTable(
"permissions",
{
id: varchar("id", { length: 256 }).primaryKey(),
workspaceId: varchar("workspace_id", { length: 256 })
.notNull()
.references(() => workspaces.id, { onDelete: "cascade" }),
name: varchar("name", { length: 512 }).notNull(),
description: varchar("description", { length: 512 }),
createdAt: datetime("created_at", { mode: "date", fsp: 3 })
.notNull()
.$defaultFn(() => new Date()),
updatedAt: datetime("updated_at", { mode: "date", fsp: 3 }),
},
(table) => {
return {
workspaceIdIdx: index("workspace_id_idx").on(table.workspaceId),
uniqueNamePerWorkspaceIdx: unique("unique_name_per_workspace_idx").on(
table.name,
table.workspaceId,
),
};
},
);
export const permissionsRelations = relations(permissions, ({ one, many }) => ({
workspace: one(workspaces, {
fields: [permissions.workspaceId],
references: [workspaces.id],
}),
keys: many(keysPermissions, {
relationName: "permissions_keys_permissions_relations",
}),
roles: many(rolesPermissions, {
relationName: "roles_permissions",
}),
}));
export const keysPermissions = mysqlTable(
"keys_permissions",
{
tempId: bigint("temp_id", { mode: "number" }).autoincrement().notNull(),
keyId: varchar("key_id", { length: 256 }).notNull(),
permissionId: varchar("permission_id", { length: 256 })
.notNull()
.references(() => permissions.id, { onDelete: "cascade" }),
workspaceId: varchar("workspace_id", { length: 256 })
.notNull()
.references(() => workspaces.id, { onDelete: "cascade" }),
createdAt: datetime("created_at", { mode: "date", fsp: 3 })
.notNull()
.$defaultFn(() => new Date()),
updatedAt: datetime("updated_at", { mode: "date", fsp: 3 }),
},
(table) => {
return {
keysPermissionsKeyIdPermissionIdWorkspaceId: primaryKey({
columns: [table.keyId, table.permissionId, table.workspaceId],
name: "keys_permissions_key_id_permission_id_workspace_id",
}),
keysPermissionsTempIdUnique: unique("keys_permissions_temp_id_unique").on(table.tempId),
keyIdPermissionIdIdx: unique("key_id_permission_id_idx").on(table.keyId, table.permissionId),
};
},
);
export const keysPermissionsRelations = relations(keysPermissions, ({ one }) => ({
key: one(keys, {
fields: [keysPermissions.keyId],
references: [keys.id],
relationName: "keys_keys_permissions_relations",
}),
permission: one(permissions, {
fields: [keysPermissions.permissionId],
references: [permissions.id],
relationName: "permissions_keys_permissions_relations",
}),
}));
export const roles = mysqlTable(
"roles",
{
id: varchar("id", { length: 256 }).primaryKey(),
workspaceId: varchar("workspace_id", { length: 256 })
.notNull()
.references(() => workspaces.id, { onDelete: "cascade" }),
name: varchar("name", { length: 512 }).notNull(),
description: varchar("description", { length: 512 }),
createdAt: datetime("created_at", { mode: "date", fsp: 3 })
.notNull()
.$defaultFn(() => new Date()),
updatedAt: datetime("updated_at", { mode: "date", fsp: 3 }),
},
(table) => {
return {
workspaceIdIdx: index("workspace_id_idx").on(table.workspaceId),
uniqueNamePerWorkspaceIdx: unique("unique_name_per_workspace_idx").on(
table.name,
table.workspaceId,
),
};
},
);
export const rolesRelations = relations(roles, ({ one, many }) => ({
workspace: one(workspaces, {
fields: [roles.workspaceId],
references: [workspaces.id],
}),
keys: many(keysRoles, {
relationName: "keys_roles_roles_relations",
}),
permissions: many(rolesPermissions, {
relationName: "roles_rolesPermissions",
}),
}));
export const rolesPermissions = mysqlTable(
"roles_permissions",
{
roleId: varchar("role_id", { length: 256 })
.notNull()
.references(() => roles.id, { onDelete: "cascade" }),
permissionId: varchar("permission_id", { length: 256 })
.notNull()
.references(() => permissions.id, { onDelete: "cascade" }),
workspaceId: varchar("workspace_id", { length: 256 })
.notNull()
.references(() => workspaces.id, { onDelete: "cascade" }),
updatedAt: datetime("updated_at", { mode: "date", fsp: 3 }),
createdAt: datetime("created_at", { mode: "date", fsp: 3 })
.notNull()
.$defaultFn(() => new Date()),
},
(table) => {
return {
rolesPermissionsRoleIdPermissionIdWorkspaceId: primaryKey({
columns: [table.roleId, table.permissionId, table.workspaceId],
name: "roles_permissions_role_id_permission_id_workspace_id",
}),
uniqueTuplePermissionIdRoleId: unique("unique_tuple_permission_id_role_id").on(
table.permissionId,
table.roleId,
),
};
},
);
export const rolesPermissionsRelations = relations(rolesPermissions, ({ one }) => ({
role: one(roles, {
fields: [rolesPermissions.roleId],
references: [roles.id],
relationName: "roles_rolesPermissions",
}),
permission: one(permissions, {
fields: [rolesPermissions.permissionId],
references: [permissions.id],
relationName: "roles_permissions",
}),
}));
export const keysRoles = mysqlTable(
"keys_roles",
{
keyId: varchar("key_id", { length: 256 })
.notNull()
.references(() => keys.id, { onDelete: "cascade" }),
roleId: varchar("role_id", { length: 256 })
.notNull()
.references(() => roles.id, { onDelete: "cascade" }),
workspaceId: varchar("workspace_id", { length: 256 })
.notNull()
.references(() => workspaces.id, { onDelete: "cascade" }),
createdAt: datetime("created_at", { mode: "date", fsp: 3 })
.notNull()
.$defaultFn(() => new Date()),
updatedAt: datetime("updated_at", { mode: "date", fsp: 3 }),
},
(table) => {
return {
keysRolesRoleIdKeyIdWorkspaceId: primaryKey({
columns: [table.roleId, table.keyId, table.workspaceId],
name: "keys_roles_role_id_key_id_workspace_id",
}),
uniqueKeyIdRoleId: uniqueIndex("unique_key_id_role_id").on(table.keyId, table.roleId),
};
},
);
export const keysRolesRelations = relations(keysRoles, ({ one }) => ({
role: one(roles, {
fields: [keysRoles.roleId],
references: [roles.id],
relationName: "keys_roles_roles_relations",
}),
key: one(keys, {
fields: [keysRoles.keyId],
references: [keys.id],
relationName: "keys_roles_key_relations",
}),
}));