214 lines
6.7 KiB
TypeScript
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",
|
|
}),
|
|
}));
|