diff --git a/src/server/database/migrations/0005_lean_the_executioner.sql b/src/server/database/migrations/0005_clumsy_korg.sql similarity index 88% rename from src/server/database/migrations/0005_lean_the_executioner.sql rename to src/server/database/migrations/0005_clumsy_korg.sql index 8aa3fda2..315ed5ed 100644 --- a/src/server/database/migrations/0005_lean_the_executioner.sql +++ b/src/server/database/migrations/0005_clumsy_korg.sql @@ -19,4 +19,5 @@ INSERT INTO `__new_users_table`("id", "username", "password", "email", "name", " DROP TABLE `users_table`;--> statement-breakpoint ALTER TABLE `__new_users_table` RENAME TO `users_table`;--> statement-breakpoint PRAGMA foreign_keys=ON;--> statement-breakpoint -CREATE UNIQUE INDEX `users_table_username_unique` ON `users_table` (`username`); \ No newline at end of file +CREATE UNIQUE INDEX `users_table_username_unique` ON `users_table` (`username`);--> statement-breakpoint +CREATE UNIQUE INDEX `oauth_provider_id_unique` ON `users_table` (`oauth_provider`,`oauth_id`); \ No newline at end of file diff --git a/src/server/database/migrations/meta/0005_snapshot.json b/src/server/database/migrations/meta/0005_snapshot.json index c8f139e5..acb5a605 100644 --- a/src/server/database/migrations/meta/0005_snapshot.json +++ b/src/server/database/migrations/meta/0005_snapshot.json @@ -1,7 +1,7 @@ { "version": "6", "dialect": "sqlite", - "id": "8cfd2b7c-5483-4b98-b95e-f9c741f32821", + "id": "d41b21e2-3977-4e94-8250-d26a26678703", "prevId": "0f072f91-cd10-4702-ae7b-245255d69d1e", "tables": { "clients_table": { @@ -832,6 +832,14 @@ "username" ], "isUnique": true + }, + "oauth_provider_id_unique": { + "name": "oauth_provider_id_unique", + "columns": [ + "oauth_provider", + "oauth_id" + ], + "isUnique": true } }, "foreignKeys": {}, diff --git a/src/server/database/migrations/meta/_journal.json b/src/server/database/migrations/meta/_journal.json index 991a31f8..4650fa31 100644 --- a/src/server/database/migrations/meta/_journal.json +++ b/src/server/database/migrations/meta/_journal.json @@ -40,8 +40,8 @@ { "idx": 5, "version": "6", - "when": 1779865249257, - "tag": "0005_lean_the_executioner", + "when": 1780035570366, + "tag": "0005_clumsy_korg", "breakpoints": true } ] diff --git a/src/server/database/repositories/user/schema.ts b/src/server/database/repositories/user/schema.ts index 5aba80cd..ede3d577 100644 --- a/src/server/database/repositories/user/schema.ts +++ b/src/server/database/repositories/user/schema.ts @@ -1,29 +1,38 @@ import { sql, relations } from 'drizzle-orm'; -import { int, sqliteTable, text } from 'drizzle-orm/sqlite-core'; +import { int, sqliteTable, text, uniqueIndex } from 'drizzle-orm/sqlite-core'; import { client } from '../../schema'; -export const user = sqliteTable('users_table', { - id: int().primaryKey({ autoIncrement: true }), - username: text().notNull().unique(), - /** `password == null` means password login disabled */ - password: text(), - email: text(), - name: text().notNull(), - role: int().$type().notNull(), - totpKey: text('totp_key'), - totpVerified: int('totp_verified', { mode: 'boolean' }).notNull(), - enabled: int({ mode: 'boolean' }).notNull(), - oauthProvider: text('oauth_provider').$type(), - oauthId: text('oauth_id'), - createdAt: text('created_at') - .notNull() - .default(sql`(CURRENT_TIMESTAMP)`), - updatedAt: text('updated_at') - .notNull() - .default(sql`(CURRENT_TIMESTAMP)`) - .$onUpdate(() => sql`(CURRENT_TIMESTAMP)`), -}); +export const user = sqliteTable( + 'users_table', + { + id: int().primaryKey({ autoIncrement: true }), + username: text().notNull().unique(), + /** `password == null` means password login disabled */ + password: text(), + email: text(), + name: text().notNull(), + role: int().$type().notNull(), + totpKey: text('totp_key'), + totpVerified: int('totp_verified', { mode: 'boolean' }).notNull(), + enabled: int({ mode: 'boolean' }).notNull(), + oauthProvider: text('oauth_provider').$type(), + oauthId: text('oauth_id'), + createdAt: text('created_at') + .notNull() + .default(sql`(CURRENT_TIMESTAMP)`), + updatedAt: text('updated_at') + .notNull() + .default(sql`(CURRENT_TIMESTAMP)`) + .$onUpdate(() => sql`(CURRENT_TIMESTAMP)`), + }, + (table) => [ + uniqueIndex('oauth_provider_id_unique').on( + table.oauthProvider, + table.oauthId + ), + ] +); export const usersRelations = relations(user, ({ many }) => ({ clients: many(client),