import { relations } from 'drizzle-orm'; import { int, text, sqliteTable, type SQLiteTableExtraConfig, primaryKey, blob } from 'drizzle-orm/sqlite-core'; export const usersTable = sqliteTable("users", { id: int().primaryKey({ autoIncrement: true }), username: text().notNull().unique(), email: text().notNull().unique(), hash: text().notNull().unique(), state: int().notNull().default(0), }); export const usersDataTable = sqliteTable("users_data", { id: int().primaryKey().references(() => usersTable.id, { onDelete: 'cascade', onUpdate: 'cascade' }), signin: int({ mode: 'timestamp' }).notNull().$defaultFn(() => new Date()), lastTimestamp: int({ mode: 'timestamp' }).notNull().$defaultFn(() => new Date()), logCount: int().notNull().default(0), }); export const userSessionsTable = sqliteTable("user_sessions", { id: int().notNull(), user_id: int().notNull().references(() => usersTable.id, { onDelete: 'cascade', onUpdate: 'cascade' }), timestamp: int({ mode: 'timestamp' }).notNull().$defaultFn(() => new Date()), }, (table): SQLiteTableExtraConfig => { return { pk: primaryKey({ columns: [table.id, table.user_id] }), } }); export const userPermissionsTable = sqliteTable("user_permissions", { id: int().notNull().references(() => usersTable.id, { onDelete: 'cascade', onUpdate: 'cascade' }), permission: text().notNull(), }, (table): SQLiteTableExtraConfig => { return { pk: primaryKey({ columns: [table.id, table.permission] }), } }); export const explorerContentTable = sqliteTable("explorer_content", { path: text().primaryKey(), owner: int().notNull().references(() => usersTable.id, { onDelete: 'cascade', onUpdate: 'cascade' }), title: text().notNull(), type: text({ enum: ['file', 'folder', 'markdown', 'canvas', 'map'] }).notNull(), content: blob({ mode: 'buffer' }), navigable: int({ mode: 'boolean' }).notNull().default(true), private: int({ mode: 'boolean' }).notNull().default(false), order: int().notNull(), visit: int().notNull().default(0), timestamp: int({ mode: 'timestamp' }).notNull().$defaultFn(() => new Date()), }); export const emailValidationTable = sqliteTable("email_validation", { id: text().primaryKey(), timestamp: int({ mode: 'timestamp' }).notNull(), }) export const characterTable = sqliteTable("character", { id: int().primaryKey({ autoIncrement: true }), name: text().notNull(), owner: int().notNull().references(() => usersTable.id, { onDelete: 'cascade', onUpdate: 'cascade' }), progress: text({ mode: 'json' }).notNull(), values: text({ mode: 'json' }).notNull().default({}), visibility: text({ enum: ['private', 'public'] }).notNull().default('private'), thumbnail: blob(), }) export const usersRelation = relations(usersTable, ({ one, many }) => ({ data: one(usersDataTable, { fields: [usersTable.id], references: [usersDataTable.id], }), session: many(userSessionsTable), permission: many(userPermissionsTable), content: many(explorerContentTable), })); export const usersDataRelation = relations(usersDataTable, ({ one }) => ({ users: one(usersTable, { fields: [usersDataTable.id], references: [usersTable.id], }), })); export const userSessionsRelation = relations(userSessionsTable, ({ one }) => ({ users: one(usersTable, { fields: [userSessionsTable.user_id], references: [usersTable.id], }), })); export const userPermissionsRelation = relations(userPermissionsTable, ({ one }) => ({ users: one(usersTable, { fields: [userPermissionsTable.id], references: [usersTable.id], }), })); export const explorerContentRelation = relations(explorerContentTable, ({ one }) => ({ users: one(usersTable, { fields: [explorerContentTable.owner], references: [usersTable.id], }), })); export const characterRelation = relations(characterTable, ({ one }) => ({ users: one(usersTable, { fields: [characterTable.owner], references: [usersTable.id], }), }));