diff --git a/apps/api/package.json b/apps/api/package.json index cdaecee..9560373 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -15,6 +15,7 @@ "db:migrate": "prisma migrate dev", "db:seed": "ts-node prisma/seed.ts", "db:reset": "prisma migrate reset --force && ts-node prisma/seed.ts", + "db:use-sqlite": "cp prisma/schema.sqlite.prisma prisma/schema.prisma", "clean": "rimraf dist" }, "dependencies": { diff --git a/apps/api/prisma/schema.prisma b/apps/api/prisma/schema.prisma index 845a70f..61336b8 100644 --- a/apps/api/prisma/schema.prisma +++ b/apps/api/prisma/schema.prisma @@ -1,5 +1,5 @@ datasource db { - provider = "sqlite" + provider = "postgresql" url = env("DATABASE_URL") } diff --git a/apps/api/prisma/schema.sqlite.prisma b/apps/api/prisma/schema.sqlite.prisma new file mode 100644 index 0000000..845a70f --- /dev/null +++ b/apps/api/prisma/schema.sqlite.prisma @@ -0,0 +1,144 @@ +datasource db { + provider = "sqlite" + url = env("DATABASE_URL") +} + +generator client { + provider = "prisma-client-js" +} + +model Venue { + id String @id @default(uuid()) + name String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + devices Device[] + clientUsers ClientUser[] + tabOwnerships TabOwnership[] + remoteCommands RemoteCommand[] + auditLogs AuditLog[] + regCodes RegistrationCode[] +} + +model Device { + id String @id @default(uuid()) + venueId String + name String + tokenHash String @unique + tokenPrefix String + tokenExpiresAt DateTime + lastSeenAt DateTime @default(now()) + revokedAt DateTime? + createdAt DateTime @default(now()) + + venue Venue @relation(fields: [venueId], references: [id]) + tabSnapshots OpenTabSnapshot[] + tabOwnerships TabOwnership[] + remoteCommands RemoteCommand[] + + @@index([venueId, revokedAt]) +} + +model ClientUser { + id String @id @default(uuid()) + venueId String + email String @unique + passwordHash String + name String + role String @default("viewer") + createdAt DateTime @default(now()) + + venue Venue @relation(fields: [venueId], references: [id]) + + @@index([venueId]) +} + +model RegistrationCode { + id String @id @default(uuid()) + venueId String + code String @unique + expiresAt DateTime + usedAt DateTime? + createdAt DateTime @default(now()) + + venue Venue @relation(fields: [venueId], references: [id]) + + @@index([venueId]) +} + +model OpenTabSnapshot { + id String @id @default(uuid()) + deviceId String + tabId String + customerName String + version Int + totalInCents Int + itemCount Int + reportedAt DateTime + + device Device @relation(fields: [deviceId], references: [id]) + + @@unique([deviceId, tabId]) + @@index([deviceId]) + @@index([tabId, reportedAt]) +} + +model TabOwnership { + tabId String + venueId String + deviceId String + lastReportedAt DateTime + + venue Venue @relation(fields: [venueId], references: [id]) + device Device @relation(fields: [deviceId], references: [id]) + + @@id([venueId, tabId]) +} + +model RemoteCommand { + id String @id @default(uuid()) + venueId String + deviceId String + targetTabId String + type String @default("close_tab") + expectedVersion Int + paymentMethod String + requestedBy String + status String @default("pending") + result String? + acknowledgedAt DateTime? + createdAt DateTime @default(now()) + expiresAt DateTime + + venue Venue @relation(fields: [venueId], references: [id]) + device Device @relation(fields: [deviceId], references: [id]) + + @@index([deviceId, status, createdAt]) + @@index([venueId, status, createdAt]) +} + +model AuditLog { + id String @id @default(uuid()) + venueId String + actorType String + actorId String + action String + details String? + createdAt DateTime @default(now()) + + venue Venue @relation(fields: [venueId], references: [id]) + + @@index([venueId, createdAt]) +} + +model RefreshToken { + id String @id @default(uuid()) + userId String + tokenHash String @unique + expiresAt DateTime + revokedAt DateTime? + createdAt DateTime @default(now()) + + @@index([userId]) +} \ No newline at end of file