feat(api): album domain schema
Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
-- 同 20260917114313_init_identity:Prisma 生成的 MySQL DDL 固定写
|
||||
-- utf8mb4_unicode_ci,会覆盖库级 utf8mb4_0900_bin;相册域(publicToken、
|
||||
-- locale 键、objectKey)同样依赖 bin 校对的大小写敏感语义,故逐表改写为
|
||||
-- utf8mb4_0900_bin。
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE `albums` (
|
||||
`id` VARCHAR(191) NOT NULL,
|
||||
`publicToken` VARCHAR(32) NOT NULL,
|
||||
`ownerId` VARCHAR(64) NOT NULL,
|
||||
`startAt` DATETIME(6) NOT NULL,
|
||||
`endAt` DATETIME(6) NULL,
|
||||
`timezone` VARCHAR(64) NOT NULL DEFAULT 'Asia/Shanghai',
|
||||
`status` VARCHAR(191) NOT NULL DEFAULT 'active',
|
||||
`defaultLocale` VARCHAR(16) NOT NULL,
|
||||
`uploadEnabled` BOOLEAN NOT NULL DEFAULT true,
|
||||
`publicEnabled` BOOLEAN NOT NULL DEFAULT true,
|
||||
`downloadEnabled` BOOLEAN NOT NULL DEFAULT true,
|
||||
`originalDownloadEnabled` BOOLEAN NOT NULL DEFAULT false,
|
||||
`watermarkVersion` INTEGER NOT NULL DEFAULT 0,
|
||||
`createdAt` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
|
||||
`updatedAt` DATETIME(6) NOT NULL,
|
||||
|
||||
UNIQUE INDEX `albums_publicToken_key`(`publicToken`),
|
||||
INDEX `albums_ownerId_idx`(`ownerId`),
|
||||
INDEX `albums_status_publicEnabled_idx`(`status`, `publicEnabled`),
|
||||
PRIMARY KEY (`id`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE `album_translations` (
|
||||
`id` VARCHAR(191) NOT NULL,
|
||||
`albumId` VARCHAR(64) NOT NULL,
|
||||
`locale` VARCHAR(16) NOT NULL,
|
||||
`title` VARCHAR(255) NOT NULL,
|
||||
`description` TEXT NULL,
|
||||
`venue` VARCHAR(255) NULL,
|
||||
`address` VARCHAR(255) NULL,
|
||||
|
||||
INDEX `album_translations_albumId_idx`(`albumId`),
|
||||
UNIQUE INDEX `album_translations_albumId_locale_key`(`albumId`, `locale`),
|
||||
PRIMARY KEY (`id`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE `album_members` (
|
||||
`id` VARCHAR(191) NOT NULL,
|
||||
`albumId` VARCHAR(64) NOT NULL,
|
||||
`userId` VARCHAR(64) NOT NULL,
|
||||
`role` VARCHAR(191) NOT NULL DEFAULT 'collaborator',
|
||||
`status` VARCHAR(191) NOT NULL DEFAULT 'active',
|
||||
`addedAt` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
|
||||
|
||||
INDEX `album_members_userId_idx`(`userId`),
|
||||
UNIQUE INDEX `album_members_albumId_userId_key`(`albumId`, `userId`),
|
||||
PRIMARY KEY (`id`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE `categories` (
|
||||
`id` VARCHAR(191) NOT NULL,
|
||||
`albumId` VARCHAR(64) NOT NULL,
|
||||
`sortOrder` INTEGER NOT NULL DEFAULT 0,
|
||||
`createdAt` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
|
||||
|
||||
INDEX `categories_albumId_sortOrder_idx`(`albumId`, `sortOrder`),
|
||||
PRIMARY KEY (`id`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE `category_translations` (
|
||||
`id` VARCHAR(191) NOT NULL,
|
||||
`categoryId` VARCHAR(64) NOT NULL,
|
||||
`locale` VARCHAR(16) NOT NULL,
|
||||
`name` VARCHAR(128) NOT NULL,
|
||||
|
||||
UNIQUE INDEX `category_translations_categoryId_locale_key`(`categoryId`, `locale`),
|
||||
PRIMARY KEY (`id`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE `album_assets` (
|
||||
`id` VARCHAR(191) NOT NULL,
|
||||
`albumId` VARCHAR(64) NOT NULL,
|
||||
`kind` VARCHAR(16) NOT NULL,
|
||||
`locale` VARCHAR(16) NULL,
|
||||
`objectKey` VARCHAR(255) NOT NULL,
|
||||
`createdAt` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
|
||||
|
||||
INDEX `album_assets_albumId_kind_idx`(`albumId`, `kind`),
|
||||
PRIMARY KEY (`id`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin;
|
||||
@@ -46,3 +46,83 @@ model audit_logs {
|
||||
createdAt DateTime @default(now()) @db.DateTime(6)
|
||||
actor users? @relation(fields: [actorId], references: [id])
|
||||
}
|
||||
|
||||
// —— 相册域(Task 9)——
|
||||
// 约定:与身份域不同,相册域一律使用扁平字符串外键(albumId/ownerId/userId/
|
||||
// categoryId 为纯字符串,不建 Prisma relation/FK 约束)——Task 10 的照片域同此。
|
||||
// 原因:跨域删除语义(用户注销→相册归属、相册下线→照片保留)由应用层显式
|
||||
// 决策,不做数据库级联;也避免 TRUNCATE 隔离工具为绕 FK 检查承担更多顺序负担。
|
||||
model albums {
|
||||
id String @id @default(cuid())
|
||||
publicToken String @unique @db.VarChar(32)
|
||||
ownerId String @db.VarChar(64)
|
||||
startAt DateTime @db.DateTime(6)
|
||||
endAt DateTime? @db.DateTime(6)
|
||||
timezone String @default("Asia/Shanghai") @db.VarChar(64)
|
||||
status String @default("active") // active|offline
|
||||
defaultLocale String @db.VarChar(16)
|
||||
uploadEnabled Boolean @default(true)
|
||||
publicEnabled Boolean @default(true)
|
||||
downloadEnabled Boolean @default(true)
|
||||
originalDownloadEnabled Boolean @default(false)
|
||||
watermarkVersion Int @default(0)
|
||||
createdAt DateTime @default(now()) @db.DateTime(6)
|
||||
updatedAt DateTime @updatedAt @db.DateTime(6)
|
||||
|
||||
@@index([ownerId])
|
||||
@@index([status, publicEnabled])
|
||||
}
|
||||
|
||||
model album_translations {
|
||||
id String @id @default(cuid())
|
||||
albumId String @db.VarChar(64)
|
||||
locale String @db.VarChar(16)
|
||||
title String @db.VarChar(255)
|
||||
description String? @db.Text
|
||||
venue String? @db.VarChar(255)
|
||||
address String? @db.VarChar(255)
|
||||
|
||||
@@unique([albumId, locale])
|
||||
@@index([albumId])
|
||||
}
|
||||
|
||||
model album_members {
|
||||
id String @id @default(cuid())
|
||||
albumId String @db.VarChar(64)
|
||||
userId String @db.VarChar(64)
|
||||
role String @default("collaborator") // owner|collaborator
|
||||
status String @default("active")
|
||||
addedAt DateTime @default(now()) @db.DateTime(6)
|
||||
|
||||
@@unique([albumId, userId])
|
||||
@@index([userId])
|
||||
}
|
||||
|
||||
model categories {
|
||||
id String @id @default(cuid())
|
||||
albumId String @db.VarChar(64)
|
||||
sortOrder Int @default(0)
|
||||
createdAt DateTime @default(now()) @db.DateTime(6)
|
||||
|
||||
@@index([albumId, sortOrder])
|
||||
}
|
||||
|
||||
model category_translations {
|
||||
id String @id @default(cuid())
|
||||
categoryId String @db.VarChar(64)
|
||||
locale String @db.VarChar(16)
|
||||
name String @db.VarChar(128)
|
||||
|
||||
@@unique([categoryId, locale])
|
||||
}
|
||||
|
||||
model album_assets {
|
||||
id String @id @default(cuid())
|
||||
albumId String @db.VarChar(64)
|
||||
kind String @db.VarChar(16) // banner|cover|logo
|
||||
locale String? @db.VarChar(16)
|
||||
objectKey String @db.VarChar(255)
|
||||
createdAt DateTime @default(now()) @db.DateTime(6)
|
||||
|
||||
@@index([albumId, kind])
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user