mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-14 22:01:09 +02:00
fix(db): use TEXT for user_id columns across entire codebase
Better Auth generates non-UUID user IDs (32-char base62 format like
'otUe1YrfENPdHnrF3g1vSBfpkQfambCZ'). Changed all `uuid('user_id')` to
`text('user_id')` in Drizzle schemas for consistency with auth system.
Affected packages/apps:
- apps/calendar, clock, picture, zitare
- games/figgos, voxelava
- packages/manadeck-database, news-database, uload-database
- services/mana-core-auth (feedback schema)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
4e63f3f74b
commit
f440ca2a8d
33 changed files with 73 additions and 53 deletions
|
|
@ -1,4 +1,4 @@
|
||||||
import { pgTable, uuid, timestamp, varchar, text, boolean, jsonb } from 'drizzle-orm/pg-core';
|
import { pgTable, uuid, text, timestamp, varchar, boolean, jsonb } from 'drizzle-orm/pg-core';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calendar settings stored in JSONB
|
* Calendar settings stored in JSONB
|
||||||
|
|
@ -16,7 +16,7 @@ export interface CalendarSettings {
|
||||||
*/
|
*/
|
||||||
export const calendars = pgTable('calendars', {
|
export const calendars = pgTable('calendars', {
|
||||||
id: uuid('id').primaryKey().defaultRandom(),
|
id: uuid('id').primaryKey().defaultRandom(),
|
||||||
userId: uuid('user_id').notNull(),
|
userId: text('user_id').notNull(),
|
||||||
name: varchar('name', { length: 255 }).notNull(),
|
name: varchar('name', { length: 255 }).notNull(),
|
||||||
description: text('description'),
|
description: text('description'),
|
||||||
color: varchar('color', { length: 7 }).default('#3B82F6'),
|
color: varchar('color', { length: 7 }).default('#3B82F6'),
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
import {
|
import {
|
||||||
pgTable,
|
pgTable,
|
||||||
uuid,
|
uuid,
|
||||||
|
text,
|
||||||
timestamp,
|
timestamp,
|
||||||
varchar,
|
varchar,
|
||||||
text,
|
|
||||||
boolean,
|
boolean,
|
||||||
jsonb,
|
jsonb,
|
||||||
index,
|
index,
|
||||||
|
|
@ -41,7 +41,7 @@ export const events = pgTable(
|
||||||
calendarId: uuid('calendar_id')
|
calendarId: uuid('calendar_id')
|
||||||
.notNull()
|
.notNull()
|
||||||
.references(() => calendars.id, { onDelete: 'cascade' }),
|
.references(() => calendars.id, { onDelete: 'cascade' }),
|
||||||
userId: uuid('user_id').notNull(),
|
userId: text('user_id').notNull(),
|
||||||
|
|
||||||
// Basic info
|
// Basic info
|
||||||
title: varchar('title', { length: 500 }).notNull(),
|
title: varchar('title', { length: 500 }).notNull(),
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
import {
|
import {
|
||||||
pgTable,
|
pgTable,
|
||||||
uuid,
|
uuid,
|
||||||
|
text,
|
||||||
timestamp,
|
timestamp,
|
||||||
varchar,
|
varchar,
|
||||||
text,
|
|
||||||
boolean,
|
boolean,
|
||||||
jsonb,
|
jsonb,
|
||||||
integer,
|
integer,
|
||||||
|
|
@ -27,7 +27,7 @@ export interface ExternalCalendarProviderData {
|
||||||
*/
|
*/
|
||||||
export const externalCalendars = pgTable('external_calendars', {
|
export const externalCalendars = pgTable('external_calendars', {
|
||||||
id: uuid('id').primaryKey().defaultRandom(),
|
id: uuid('id').primaryKey().defaultRandom(),
|
||||||
userId: uuid('user_id').notNull(),
|
userId: text('user_id').notNull(),
|
||||||
|
|
||||||
// Calendar identification
|
// Calendar identification
|
||||||
name: varchar('name', { length: 255 }).notNull(),
|
name: varchar('name', { length: 255 }).notNull(),
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,13 @@
|
||||||
import { pgTable, uuid, timestamp, varchar, integer, boolean, index } from 'drizzle-orm/pg-core';
|
import {
|
||||||
|
pgTable,
|
||||||
|
uuid,
|
||||||
|
text,
|
||||||
|
timestamp,
|
||||||
|
varchar,
|
||||||
|
integer,
|
||||||
|
boolean,
|
||||||
|
index,
|
||||||
|
} from 'drizzle-orm/pg-core';
|
||||||
import { events } from './events.schema';
|
import { events } from './events.schema';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -11,7 +20,7 @@ export const reminders = pgTable(
|
||||||
eventId: uuid('event_id')
|
eventId: uuid('event_id')
|
||||||
.notNull()
|
.notNull()
|
||||||
.references(() => events.id, { onDelete: 'cascade' }),
|
.references(() => events.id, { onDelete: 'cascade' }),
|
||||||
userId: uuid('user_id').notNull(),
|
userId: text('user_id').notNull(),
|
||||||
|
|
||||||
// Timing
|
// Timing
|
||||||
minutesBefore: integer('minutes_before').notNull(),
|
minutesBefore: integer('minutes_before').notNull(),
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,17 @@
|
||||||
import { pgTable, uuid, varchar, time, boolean, integer, timestamp } from 'drizzle-orm/pg-core';
|
import {
|
||||||
|
pgTable,
|
||||||
|
uuid,
|
||||||
|
text,
|
||||||
|
varchar,
|
||||||
|
time,
|
||||||
|
boolean,
|
||||||
|
integer,
|
||||||
|
timestamp,
|
||||||
|
} from 'drizzle-orm/pg-core';
|
||||||
|
|
||||||
export const alarms = pgTable('alarms', {
|
export const alarms = pgTable('alarms', {
|
||||||
id: uuid('id').primaryKey().defaultRandom(),
|
id: uuid('id').primaryKey().defaultRandom(),
|
||||||
userId: uuid('user_id').notNull(),
|
userId: text('user_id').notNull(),
|
||||||
label: varchar('label', { length: 255 }),
|
label: varchar('label', { length: 255 }),
|
||||||
time: time('time').notNull(),
|
time: time('time').notNull(),
|
||||||
enabled: boolean('enabled').default(true).notNull(),
|
enabled: boolean('enabled').default(true).notNull(),
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { pgTable, uuid, varchar, integer, jsonb, timestamp } from 'drizzle-orm/pg-core';
|
import { pgTable, uuid, text, varchar, integer, jsonb, timestamp } from 'drizzle-orm/pg-core';
|
||||||
|
|
||||||
export interface PresetSettings {
|
export interface PresetSettings {
|
||||||
// For pomodoro presets
|
// For pomodoro presets
|
||||||
|
|
@ -12,7 +12,7 @@ export interface PresetSettings {
|
||||||
|
|
||||||
export const presets = pgTable('presets', {
|
export const presets = pgTable('presets', {
|
||||||
id: uuid('id').primaryKey().defaultRandom(),
|
id: uuid('id').primaryKey().defaultRandom(),
|
||||||
userId: uuid('user_id').notNull(),
|
userId: text('user_id').notNull(),
|
||||||
type: varchar('type', { length: 20 }).notNull(), // 'timer' | 'pomodoro'
|
type: varchar('type', { length: 20 }).notNull(), // 'timer' | 'pomodoro'
|
||||||
name: varchar('name', { length: 255 }).notNull(),
|
name: varchar('name', { length: 255 }).notNull(),
|
||||||
durationSeconds: integer('duration_seconds').notNull(),
|
durationSeconds: integer('duration_seconds').notNull(),
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
import { pgTable, uuid, varchar, integer, timestamp } from 'drizzle-orm/pg-core';
|
import { pgTable, uuid, text, varchar, integer, timestamp } from 'drizzle-orm/pg-core';
|
||||||
|
|
||||||
export const timers = pgTable('timers', {
|
export const timers = pgTable('timers', {
|
||||||
id: uuid('id').primaryKey().defaultRandom(),
|
id: uuid('id').primaryKey().defaultRandom(),
|
||||||
userId: uuid('user_id').notNull(),
|
userId: text('user_id').notNull(),
|
||||||
label: varchar('label', { length: 255 }),
|
label: varchar('label', { length: 255 }),
|
||||||
durationSeconds: integer('duration_seconds').notNull(),
|
durationSeconds: integer('duration_seconds').notNull(),
|
||||||
remainingSeconds: integer('remaining_seconds'),
|
remainingSeconds: integer('remaining_seconds'),
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
import { pgTable, uuid, varchar, integer, timestamp } from 'drizzle-orm/pg-core';
|
import { pgTable, uuid, text, varchar, integer, timestamp } from 'drizzle-orm/pg-core';
|
||||||
|
|
||||||
export const worldClocks = pgTable('world_clocks', {
|
export const worldClocks = pgTable('world_clocks', {
|
||||||
id: uuid('id').primaryKey().defaultRandom(),
|
id: uuid('id').primaryKey().defaultRandom(),
|
||||||
userId: uuid('user_id').notNull(),
|
userId: text('user_id').notNull(),
|
||||||
timezone: varchar('timezone', { length: 100 }).notNull(), // IANA timezone e.g. 'America/New_York'
|
timezone: varchar('timezone', { length: 100 }).notNull(), // IANA timezone e.g. 'America/New_York'
|
||||||
cityName: varchar('city_name', { length: 255 }).notNull(),
|
cityName: varchar('city_name', { length: 255 }).notNull(),
|
||||||
sortOrder: integer('sort_order').default(0).notNull(),
|
sortOrder: integer('sort_order').default(0).notNull(),
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ export const batchStatusEnum = pgEnum('batch_status', [
|
||||||
|
|
||||||
export const batchGenerations = pgTable('batch_generations', {
|
export const batchGenerations = pgTable('batch_generations', {
|
||||||
id: uuid('id').primaryKey().defaultRandom(),
|
id: uuid('id').primaryKey().defaultRandom(),
|
||||||
userId: uuid('user_id').notNull(),
|
userId: text('user_id').notNull(),
|
||||||
name: text('name'),
|
name: text('name'),
|
||||||
|
|
||||||
totalCount: integer('total_count').notNull(),
|
totalCount: integer('total_count').notNull(),
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ import { pgTable, uuid, text, timestamp, boolean, integer } from 'drizzle-orm/pg
|
||||||
|
|
||||||
export const boards = pgTable('boards', {
|
export const boards = pgTable('boards', {
|
||||||
id: uuid('id').primaryKey().defaultRandom(),
|
id: uuid('id').primaryKey().defaultRandom(),
|
||||||
userId: uuid('user_id').notNull(),
|
userId: text('user_id').notNull(),
|
||||||
|
|
||||||
name: text('name').notNull(),
|
name: text('name').notNull(),
|
||||||
description: text('description'),
|
description: text('description'),
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ export const generationStatusEnum = pgEnum('generation_status', [
|
||||||
|
|
||||||
export const imageGenerations = pgTable('image_generations', {
|
export const imageGenerations = pgTable('image_generations', {
|
||||||
id: uuid('id').primaryKey().defaultRandom(),
|
id: uuid('id').primaryKey().defaultRandom(),
|
||||||
userId: uuid('user_id').notNull(),
|
userId: text('user_id').notNull(),
|
||||||
modelId: uuid('model_id'),
|
modelId: uuid('model_id'),
|
||||||
batchId: uuid('batch_id'),
|
batchId: uuid('batch_id'),
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { pgTable, uuid, timestamp, unique } from 'drizzle-orm/pg-core';
|
import { pgTable, uuid, text, timestamp, unique } from 'drizzle-orm/pg-core';
|
||||||
import { images } from './images.schema';
|
import { images } from './images.schema';
|
||||||
|
|
||||||
export const imageLikes = pgTable(
|
export const imageLikes = pgTable(
|
||||||
|
|
@ -8,7 +8,7 @@ export const imageLikes = pgTable(
|
||||||
imageId: uuid('image_id')
|
imageId: uuid('image_id')
|
||||||
.notNull()
|
.notNull()
|
||||||
.references(() => images.id, { onDelete: 'cascade' }),
|
.references(() => images.id, { onDelete: 'cascade' }),
|
||||||
userId: uuid('user_id').notNull(),
|
userId: text('user_id').notNull(),
|
||||||
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
||||||
},
|
},
|
||||||
(table) => ({
|
(table) => ({
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ import { pgTable, uuid, text, timestamp, boolean, integer } from 'drizzle-orm/pg
|
||||||
|
|
||||||
export const images = pgTable('images', {
|
export const images = pgTable('images', {
|
||||||
id: uuid('id').primaryKey().defaultRandom(),
|
id: uuid('id').primaryKey().defaultRandom(),
|
||||||
userId: uuid('user_id').notNull(),
|
userId: text('user_id').notNull(),
|
||||||
generationId: uuid('generation_id'),
|
generationId: uuid('generation_id'),
|
||||||
sourceImageId: uuid('source_image_id'),
|
sourceImageId: uuid('source_image_id'),
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
import { pgTable, uuid, timestamp, unique, varchar } from 'drizzle-orm/pg-core';
|
import { pgTable, uuid, text, timestamp, unique, varchar } from 'drizzle-orm/pg-core';
|
||||||
|
|
||||||
export const favorites = pgTable(
|
export const favorites = pgTable(
|
||||||
'favorites',
|
'favorites',
|
||||||
{
|
{
|
||||||
id: uuid('id').primaryKey().defaultRandom(),
|
id: uuid('id').primaryKey().defaultRandom(),
|
||||||
userId: uuid('user_id').notNull(),
|
userId: text('user_id').notNull(),
|
||||||
quoteId: varchar('quote_id', { length: 100 }).notNull(), // References static quote ID from shared package
|
quoteId: varchar('quote_id', { length: 100 }).notNull(), // References static quote ID from shared package
|
||||||
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ import { pgTable, uuid, text, timestamp, jsonb } from 'drizzle-orm/pg-core';
|
||||||
|
|
||||||
export const userLists = pgTable('user_lists', {
|
export const userLists = pgTable('user_lists', {
|
||||||
id: uuid('id').primaryKey().defaultRandom(),
|
id: uuid('id').primaryKey().defaultRandom(),
|
||||||
userId: uuid('user_id').notNull(),
|
userId: text('user_id').notNull(),
|
||||||
name: text('name').notNull(),
|
name: text('name').notNull(),
|
||||||
description: text('description'),
|
description: text('description'),
|
||||||
quoteIds: jsonb('quote_ids').$type<string[]>().default([]), // References static quote IDs from shared package
|
quoteIds: jsonb('quote_ids').$type<string[]>().default([]), // References static quote IDs from shared package
|
||||||
|
|
|
||||||
|
|
@ -246,7 +246,7 @@ import { pgTable, uuid, varchar, text, boolean, timestamp, jsonb } from 'drizzle
|
||||||
|
|
||||||
export const decks = pgTable('decks', {
|
export const decks = pgTable('decks', {
|
||||||
id: uuid('id').primaryKey().defaultRandom(),
|
id: uuid('id').primaryKey().defaultRandom(),
|
||||||
userId: uuid('user_id').notNull(),
|
userId: text('user_id').notNull(), // text, not uuid - Better Auth uses non-UUID IDs
|
||||||
title: varchar('title', { length: 255 }).notNull(),
|
title: varchar('title', { length: 255 }).notNull(),
|
||||||
description: text('description'),
|
description: text('description'),
|
||||||
coverImageUrl: text('cover_image_url'),
|
coverImageUrl: text('cover_image_url'),
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { pgTable, uuid, timestamp, unique } from 'drizzle-orm/pg-core';
|
import { pgTable, uuid, text, timestamp, unique } from 'drizzle-orm/pg-core';
|
||||||
import { relations } from 'drizzle-orm';
|
import { relations } from 'drizzle-orm';
|
||||||
import { figures } from './figures.schema';
|
import { figures } from './figures.schema';
|
||||||
|
|
||||||
|
|
@ -9,7 +9,7 @@ export const figureLikes = pgTable(
|
||||||
figureId: uuid('figure_id')
|
figureId: uuid('figure_id')
|
||||||
.notNull()
|
.notNull()
|
||||||
.references(() => figures.id, { onDelete: 'cascade' }),
|
.references(() => figures.id, { onDelete: 'cascade' }),
|
||||||
userId: uuid('user_id').notNull(),
|
userId: text('user_id').notNull(),
|
||||||
createdAt: timestamp('created_at').defaultNow(),
|
createdAt: timestamp('created_at').defaultNow(),
|
||||||
},
|
},
|
||||||
(table) => ({
|
(table) => ({
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ export const figures = pgTable('figures', {
|
||||||
isPublic: boolean('is_public').default(true),
|
isPublic: boolean('is_public').default(true),
|
||||||
isArchived: boolean('is_archived').default(false),
|
isArchived: boolean('is_archived').default(false),
|
||||||
likes: integer('likes').default(0),
|
likes: integer('likes').default(0),
|
||||||
userId: uuid('user_id').notNull(),
|
userId: text('user_id').notNull(),
|
||||||
createdAt: timestamp('created_at').defaultNow(),
|
createdAt: timestamp('created_at').defaultNow(),
|
||||||
updatedAt: timestamp('updated_at').defaultNow(),
|
updatedAt: timestamp('updated_at').defaultNow(),
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { pgTable, uuid, timestamp, unique } from 'drizzle-orm/pg-core';
|
import { pgTable, uuid, text, timestamp, unique } from 'drizzle-orm/pg-core';
|
||||||
import { relations } from 'drizzle-orm';
|
import { relations } from 'drizzle-orm';
|
||||||
import { levels } from './levels.schema';
|
import { levels } from './levels.schema';
|
||||||
|
|
||||||
|
|
@ -9,7 +9,7 @@ export const levelLikes = pgTable(
|
||||||
levelId: uuid('level_id')
|
levelId: uuid('level_id')
|
||||||
.notNull()
|
.notNull()
|
||||||
.references(() => levels.id, { onDelete: 'cascade' }),
|
.references(() => levels.id, { onDelete: 'cascade' }),
|
||||||
userId: uuid('user_id').notNull(),
|
userId: text('user_id').notNull(),
|
||||||
createdAt: timestamp('created_at').defaultNow(),
|
createdAt: timestamp('created_at').defaultNow(),
|
||||||
},
|
},
|
||||||
(table) => ({
|
(table) => ({
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { pgTable, uuid, timestamp, real, integer, boolean } from 'drizzle-orm/pg-core';
|
import { pgTable, uuid, text, timestamp, real, integer, boolean } from 'drizzle-orm/pg-core';
|
||||||
import { relations } from 'drizzle-orm';
|
import { relations } from 'drizzle-orm';
|
||||||
import { levels } from './levels.schema';
|
import { levels } from './levels.schema';
|
||||||
|
|
||||||
|
|
@ -7,7 +7,7 @@ export const levelPlays = pgTable('level_plays', {
|
||||||
levelId: uuid('level_id')
|
levelId: uuid('level_id')
|
||||||
.notNull()
|
.notNull()
|
||||||
.references(() => levels.id, { onDelete: 'cascade' }),
|
.references(() => levels.id, { onDelete: 'cascade' }),
|
||||||
userId: uuid('user_id'),
|
userId: text('user_id'),
|
||||||
completionTime: real('completion_time'),
|
completionTime: real('completion_time'),
|
||||||
attempts: integer('attempts').default(1),
|
attempts: integer('attempts').default(1),
|
||||||
completed: boolean('completed').default(false),
|
completed: boolean('completed').default(false),
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ export const levels = pgTable('levels', {
|
||||||
id: uuid('id').primaryKey().defaultRandom(),
|
id: uuid('id').primaryKey().defaultRandom(),
|
||||||
name: text('name').notNull(),
|
name: text('name').notNull(),
|
||||||
description: text('description'),
|
description: text('description'),
|
||||||
userId: uuid('user_id').notNull(),
|
userId: text('user_id').notNull(),
|
||||||
voxelData: jsonb('voxel_data').notNull(),
|
voxelData: jsonb('voxel_data').notNull(),
|
||||||
spawnPoint: jsonb('spawn_point').notNull(),
|
spawnPoint: jsonb('spawn_point').notNull(),
|
||||||
worldSize: jsonb('world_size').notNull(),
|
worldSize: jsonb('world_size').notNull(),
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { pgTable, uuid, varchar, text, timestamp, jsonb, index, pgEnum } from 'drizzle-orm/pg-core';
|
import { pgTable, uuid, text, varchar, timestamp, jsonb, index, pgEnum } from 'drizzle-orm/pg-core';
|
||||||
import { relations } from 'drizzle-orm';
|
import { relations } from 'drizzle-orm';
|
||||||
import { decks } from './decks.js';
|
import { decks } from './decks.js';
|
||||||
|
|
||||||
|
|
@ -25,7 +25,7 @@ export const aiGenerations = pgTable(
|
||||||
'ai_generations',
|
'ai_generations',
|
||||||
{
|
{
|
||||||
id: uuid('id').primaryKey().defaultRandom(),
|
id: uuid('id').primaryKey().defaultRandom(),
|
||||||
userId: uuid('user_id').notNull(),
|
userId: text('user_id').notNull(),
|
||||||
deckId: uuid('deck_id').references(() => decks.id, { onDelete: 'set null' }),
|
deckId: uuid('deck_id').references(() => decks.id, { onDelete: 'set null' }),
|
||||||
functionName: varchar('function_name', { length: 100 }).notNull(),
|
functionName: varchar('function_name', { length: 100 }).notNull(),
|
||||||
prompt: text('prompt').notNull(),
|
prompt: text('prompt').notNull(),
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import {
|
import {
|
||||||
pgTable,
|
pgTable,
|
||||||
uuid,
|
uuid,
|
||||||
|
text,
|
||||||
integer,
|
integer,
|
||||||
timestamp,
|
timestamp,
|
||||||
index,
|
index,
|
||||||
|
|
@ -23,7 +24,7 @@ export const cardProgress = pgTable(
|
||||||
'card_progress',
|
'card_progress',
|
||||||
{
|
{
|
||||||
id: uuid('id').primaryKey().defaultRandom(),
|
id: uuid('id').primaryKey().defaultRandom(),
|
||||||
userId: uuid('user_id').notNull(),
|
userId: text('user_id').notNull(),
|
||||||
cardId: uuid('card_id')
|
cardId: uuid('card_id')
|
||||||
.notNull()
|
.notNull()
|
||||||
.references(() => cards.id, { onDelete: 'cascade' }),
|
.references(() => cards.id, { onDelete: 'cascade' }),
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
import {
|
import {
|
||||||
pgTable,
|
pgTable,
|
||||||
uuid,
|
uuid,
|
||||||
|
text,
|
||||||
date,
|
date,
|
||||||
integer,
|
integer,
|
||||||
decimal,
|
decimal,
|
||||||
text,
|
|
||||||
timestamp,
|
timestamp,
|
||||||
index,
|
index,
|
||||||
unique,
|
unique,
|
||||||
|
|
@ -14,7 +14,7 @@ export const dailyProgress = pgTable(
|
||||||
'daily_progress',
|
'daily_progress',
|
||||||
{
|
{
|
||||||
id: uuid('id').primaryKey().defaultRandom(),
|
id: uuid('id').primaryKey().defaultRandom(),
|
||||||
userId: uuid('user_id').notNull(),
|
userId: text('user_id').notNull(),
|
||||||
date: date('date').notNull(),
|
date: date('date').notNull(),
|
||||||
cardsStudied: integer('cards_studied').default(0).notNull(),
|
cardsStudied: integer('cards_studied').default(0).notNull(),
|
||||||
timeSpentMinutes: integer('time_spent_minutes').default(0).notNull(),
|
timeSpentMinutes: integer('time_spent_minutes').default(0).notNull(),
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
import {
|
import {
|
||||||
pgTable,
|
pgTable,
|
||||||
uuid,
|
uuid,
|
||||||
varchar,
|
|
||||||
text,
|
text,
|
||||||
|
varchar,
|
||||||
boolean,
|
boolean,
|
||||||
timestamp,
|
timestamp,
|
||||||
jsonb,
|
jsonb,
|
||||||
|
|
@ -17,7 +17,7 @@ export const decks = pgTable(
|
||||||
'decks',
|
'decks',
|
||||||
{
|
{
|
||||||
id: uuid('id').primaryKey().defaultRandom(),
|
id: uuid('id').primaryKey().defaultRandom(),
|
||||||
userId: uuid('user_id').notNull(),
|
userId: text('user_id').notNull(),
|
||||||
title: varchar('title', { length: 255 }).notNull(),
|
title: varchar('title', { length: 255 }).notNull(),
|
||||||
description: text('description'),
|
description: text('description'),
|
||||||
coverImageUrl: text('cover_image_url'),
|
coverImageUrl: text('cover_image_url'),
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { pgTable, uuid, integer, timestamp, index, pgEnum } from 'drizzle-orm/pg-core';
|
import { pgTable, uuid, text, integer, timestamp, index, pgEnum } from 'drizzle-orm/pg-core';
|
||||||
import { relations } from 'drizzle-orm';
|
import { relations } from 'drizzle-orm';
|
||||||
import { decks } from './decks.js';
|
import { decks } from './decks.js';
|
||||||
|
|
||||||
|
|
@ -12,7 +12,7 @@ export const studySessions = pgTable(
|
||||||
deckId: uuid('deck_id')
|
deckId: uuid('deck_id')
|
||||||
.notNull()
|
.notNull()
|
||||||
.references(() => decks.id, { onDelete: 'cascade' }),
|
.references(() => decks.id, { onDelete: 'cascade' }),
|
||||||
userId: uuid('user_id').notNull(),
|
userId: text('user_id').notNull(),
|
||||||
mode: studyModeEnum('mode').notNull(),
|
mode: studyModeEnum('mode').notNull(),
|
||||||
totalCards: integer('total_cards').notNull().default(0),
|
totalCards: integer('total_cards').notNull().default(0),
|
||||||
completedCards: integer('completed_cards').notNull().default(0),
|
completedCards: integer('completed_cards').notNull().default(0),
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
import { pgTable, uuid, integer, decimal, date, timestamp, index } from 'drizzle-orm/pg-core';
|
import { pgTable, text, integer, decimal, date, timestamp, index } from 'drizzle-orm/pg-core';
|
||||||
|
|
||||||
export const userStats = pgTable(
|
export const userStats = pgTable(
|
||||||
'user_stats',
|
'user_stats',
|
||||||
{
|
{
|
||||||
userId: uuid('user_id').primaryKey(),
|
userId: text('user_id').primaryKey(),
|
||||||
totalWins: integer('total_wins').default(0).notNull(),
|
totalWins: integer('total_wins').default(0).notNull(),
|
||||||
totalSessions: integer('total_sessions').default(0).notNull(),
|
totalSessions: integer('total_sessions').default(0).notNull(),
|
||||||
totalCardsStudied: integer('total_cards_studied').default(0).notNull(),
|
totalCardsStudied: integer('total_cards_studied').default(0).notNull(),
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ export const articles = pgTable(
|
||||||
summary: text('summary'),
|
summary: text('summary'),
|
||||||
|
|
||||||
// For user-saved articles
|
// For user-saved articles
|
||||||
userId: uuid('user_id').references(() => users.id, { onDelete: 'cascade' }),
|
userId: text('user_id').references(() => users.id, { onDelete: 'cascade' }),
|
||||||
originalUrl: text('original_url'),
|
originalUrl: text('original_url'),
|
||||||
parsedContent: text('parsed_content'),
|
parsedContent: text('parsed_content'),
|
||||||
isArchived: boolean('is_archived').default(false),
|
isArchived: boolean('is_archived').default(false),
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ import { users } from './users';
|
||||||
// Better Auth Sessions
|
// Better Auth Sessions
|
||||||
export const sessions = pgTable('sessions', {
|
export const sessions = pgTable('sessions', {
|
||||||
id: uuid('id').primaryKey().defaultRandom(),
|
id: uuid('id').primaryKey().defaultRandom(),
|
||||||
userId: uuid('user_id')
|
userId: text('user_id')
|
||||||
.references(() => users.id, { onDelete: 'cascade' })
|
.references(() => users.id, { onDelete: 'cascade' })
|
||||||
.notNull(),
|
.notNull(),
|
||||||
token: text('token').notNull().unique(),
|
token: text('token').notNull().unique(),
|
||||||
|
|
@ -18,7 +18,7 @@ export const sessions = pgTable('sessions', {
|
||||||
// Better Auth Accounts (for OAuth providers)
|
// Better Auth Accounts (for OAuth providers)
|
||||||
export const accounts = pgTable('accounts', {
|
export const accounts = pgTable('accounts', {
|
||||||
id: uuid('id').primaryKey().defaultRandom(),
|
id: uuid('id').primaryKey().defaultRandom(),
|
||||||
userId: uuid('user_id')
|
userId: text('user_id')
|
||||||
.references(() => users.id, { onDelete: 'cascade' })
|
.references(() => users.id, { onDelete: 'cascade' })
|
||||||
.notNull(),
|
.notNull(),
|
||||||
providerId: text('provider_id').notNull(), // 'credential', 'google', 'apple', etc.
|
providerId: text('provider_id').notNull(), // 'credential', 'google', 'apple', etc.
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import {
|
import {
|
||||||
pgTable,
|
pgTable,
|
||||||
uuid,
|
uuid,
|
||||||
|
text,
|
||||||
timestamp,
|
timestamp,
|
||||||
boolean,
|
boolean,
|
||||||
real,
|
real,
|
||||||
|
|
@ -15,7 +16,7 @@ export const userArticleInteractions = pgTable(
|
||||||
'user_article_interactions',
|
'user_article_interactions',
|
||||||
{
|
{
|
||||||
id: uuid('id').primaryKey().defaultRandom(),
|
id: uuid('id').primaryKey().defaultRandom(),
|
||||||
userId: uuid('user_id')
|
userId: text('user_id')
|
||||||
.references(() => users.id, { onDelete: 'cascade' })
|
.references(() => users.id, { onDelete: 'cascade' })
|
||||||
.notNull(),
|
.notNull(),
|
||||||
articleId: uuid('article_id')
|
articleId: uuid('article_id')
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ export const links = pgTable(
|
||||||
originalUrl: text('original_url').notNull(),
|
originalUrl: text('original_url').notNull(),
|
||||||
title: text('title'),
|
title: text('title'),
|
||||||
description: text('description'),
|
description: text('description'),
|
||||||
userId: uuid('user_id').references(() => users.id, { onDelete: 'cascade' }),
|
userId: text('user_id').references(() => users.id, { onDelete: 'cascade' }),
|
||||||
isActive: boolean('is_active').default(true),
|
isActive: boolean('is_active').default(true),
|
||||||
password: text('password'), // hashed
|
password: text('password'), // hashed
|
||||||
maxClicks: integer('max_clicks'),
|
maxClicks: integer('max_clicks'),
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ export const tags = pgTable(
|
||||||
icon: text('icon'),
|
icon: text('icon'),
|
||||||
isPublic: boolean('is_public').default(false),
|
isPublic: boolean('is_public').default(false),
|
||||||
usageCount: integer('usage_count').default(0),
|
usageCount: integer('usage_count').default(0),
|
||||||
userId: uuid('user_id').references(() => users.id),
|
userId: text('user_id').references(() => users.id),
|
||||||
createdAt: timestamp('created_at').defaultNow().notNull(),
|
createdAt: timestamp('created_at').defaultNow().notNull(),
|
||||||
updatedAt: timestamp('updated_at').defaultNow().notNull(),
|
updatedAt: timestamp('updated_at').defaultNow().notNull(),
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,7 @@ export const userFeedback = feedbackSchema.table(
|
||||||
'user_feedback',
|
'user_feedback',
|
||||||
{
|
{
|
||||||
id: uuid('id').primaryKey().defaultRandom(),
|
id: uuid('id').primaryKey().defaultRandom(),
|
||||||
userId: uuid('user_id')
|
userId: text('user_id')
|
||||||
.references(() => users.id, { onDelete: 'cascade' })
|
.references(() => users.id, { onDelete: 'cascade' })
|
||||||
.notNull(),
|
.notNull(),
|
||||||
appId: text('app_id').notNull(), // 'chat', 'picture', 'zitare', etc.
|
appId: text('app_id').notNull(), // 'chat', 'picture', 'zitare', etc.
|
||||||
|
|
@ -82,7 +82,7 @@ export const feedbackVotes = feedbackSchema.table(
|
||||||
feedbackId: uuid('feedback_id')
|
feedbackId: uuid('feedback_id')
|
||||||
.references(() => userFeedback.id, { onDelete: 'cascade' })
|
.references(() => userFeedback.id, { onDelete: 'cascade' })
|
||||||
.notNull(),
|
.notNull(),
|
||||||
userId: uuid('user_id')
|
userId: text('user_id')
|
||||||
.references(() => users.id, { onDelete: 'cascade' })
|
.references(() => users.id, { onDelete: 'cascade' })
|
||||||
.notNull(),
|
.notNull(),
|
||||||
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue