1 parent
b1f6b61994
commit
d170fc8790
67 files changed
+1599
-30
No files matched your search
@@ -0,0 +1,37 @@
|
||||
-- CreateTable
|
||||
CREATE TABLE "tag" (
|
||||
"id" TEXT NOT NULL,
|
||||
"projectId" TEXT NOT NULL,
|
||||
"name" TEXT NOT NULL,
|
||||
"normalizedName" TEXT NOT NULL,
|
||||
"color" TEXT NOT NULL DEFAULT 'default',
|
||||
"createdAt" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMPTZ(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "tag_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "issue_tag" (
|
||||
"issueId" INTEGER NOT NULL,
|
||||
"tagId" TEXT NOT NULL,
|
||||
"createdAt" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "issue_tag_pkey" PRIMARY KEY ("issueId","tagId")
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "tag_projectId_normalizedName_key" ON "tag"("projectId", "normalizedName");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "issue_tag_tagId_idx" ON "issue_tag"("tagId");
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "tag" ADD CONSTRAINT "tag_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "project"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "issue_tag" ADD CONSTRAINT "issue_tag_issueId_fkey" FOREIGN KEY ("issueId") REFERENCES "issue"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "issue_tag" ADD CONSTRAINT "issue_tag_tagId_fkey" FOREIGN KEY ("tagId") REFERENCES "tag"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
+37
-1
@@ -105,6 +105,7 @@ model Issue {
|
||||
attachments IssueAttachment[]
|
||||
changes IssueChange[]
|
||||
observers IssueObserver[]
|
||||
tags IssueTag[]
|
||||
createdAt DateTime @default(now()) @db.Timestamptz(3)
|
||||
updatedAt DateTime @updatedAt @db.Timestamptz(3)
|
||||
|
||||
@@ -145,6 +146,7 @@ model Project {
|
||||
ownerId String
|
||||
owner User @relation(fields: [ownerId], references: [id], onDelete: Restrict)
|
||||
members ProjectMember[]
|
||||
tags Tag[]
|
||||
|
||||
@@unique([key])
|
||||
@@index([createdAt])
|
||||
@@ -152,6 +154,38 @@ model Project {
|
||||
@@map("project")
|
||||
}
|
||||
|
||||
/// Тег — элемент справочника проекта. Уникален в проекте без учёта регистра:
|
||||
/// normalizedName — name в нижнем регистре. color — из палитры (TAG_COLORS),
|
||||
/// валидируется в коде. Задаче тег назначают по имени — отсутствующий создаётся.
|
||||
model Tag {
|
||||
id String @id @default(uuid(7))
|
||||
projectId String
|
||||
project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
||||
name String
|
||||
normalizedName String
|
||||
color String @default("default")
|
||||
issues IssueTag[]
|
||||
createdAt DateTime @default(now()) @db.Timestamptz(3)
|
||||
updatedAt DateTime @updatedAt @db.Timestamptz(3)
|
||||
|
||||
@@unique([projectId, normalizedName])
|
||||
@@map("tag")
|
||||
}
|
||||
|
||||
/// Тег задачи. Удаление тега из справочника снимает его со всех задач (без записи в историю).
|
||||
model IssueTag {
|
||||
issueId Int
|
||||
tagId String
|
||||
createdAt DateTime @default(now()) @db.Timestamptz(3)
|
||||
|
||||
issue Issue @relation(fields: [issueId], references: [id], onDelete: Cascade)
|
||||
tag Tag @relation(fields: [tagId], references: [id], onDelete: Cascade)
|
||||
|
||||
@@id([issueId, tagId])
|
||||
@@index([tagId])
|
||||
@@map("issue_tag")
|
||||
}
|
||||
|
||||
/// MEMBER создаёт задачи в проекте; OBSERVER только видит проект —
|
||||
/// он наблюдает за отдельными задачами (IssueObserver).
|
||||
enum ProjectRole {
|
||||
@@ -302,9 +336,11 @@ model CommentAttachment {
|
||||
|
||||
/// История изменений задачи — одна строка на изменённое поле.
|
||||
/// Строки одного сохранения задачи объединены общим changeId.
|
||||
/// field: created | title | content | status | priority | assignee | dueDate
|
||||
/// field: created | title | content | status | priority | type | assignee | dueDate | observer | tag
|
||||
/// (валидируется в коде, см. ISSUE_CHANGE_FIELDS). Значения — строки:
|
||||
/// priority — число, dueDate — ISO-дата, assignee — id пользователя.
|
||||
/// observer и tag — по строке на добавленный (oldValue = null) или снятый (newValue = null) элемент;
|
||||
/// observer — id пользователя, tag — имя тега на момент изменения.
|
||||
/// При создании задачи пишутся две строки: created и status null -> OPEN,
|
||||
/// поэтому статус задачи на любой момент восстанавливается по строкам status.
|
||||
/// У задач, созданных до появления истории, строк нет — в статистику они не попадают.
|
||||
|
||||
Reference in new issue
Block a user