create issues fix
Gitea Actions / Deploy (push) Canceled after 5m13s

issue observers

Наблюдатели задачи видят её и комментируют, но не редактируют.

- таблица issue_observer, наблюдатели — часть сущности Issue
- видимость: reporter, assignee или наблюдатель (задачи, история, SSE)
- правка/удаление задачи и вложений — только reporter/assignee (403 наблюдателю)
- observers в create/update, DELETE /issues/:id/observers/me, фильтр role
- история изменений и уведомления новым наблюдателям

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
vadimandClaude Opus 5.5 committed 2026-10-25 22:23:49 +03:00
1 parent 46903e9ec5
commit b1f6b61994
54 files changed
+901 -69

No files matched your search

+27 -2
View File
@@ -31,6 +31,7 @@ model User {
comments Comment[]
uploadedFiles File[] @relation(name: "fileUploader")
issueChanges IssueChange[]
observedIssues IssueObserver[]
@@unique([email])
@@map("user")
@@ -103,6 +104,7 @@ model Issue {
comments Comment[]
attachments IssueAttachment[]
changes IssueChange[]
observers IssueObserver[]
createdAt DateTime @default(now()) @db.Timestamptz(3)
updatedAt DateTime @updatedAt @db.Timestamptz(3)
@@ -118,6 +120,21 @@ model Issue {
@@map("issue")
}
/// Наблюдатель задачи: видит её и может комментировать, но не редактировать.
/// Редактируют задачу только reporter и assignee.
model IssueObserver {
issueId Int
userId String
createdAt DateTime @default(now()) @db.Timestamptz(3)
issue Issue @relation(fields: [issueId], references: [id], onDelete: Cascade)
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@id([issueId, userId])
@@index([userId])
@@map("issue_observer")
}
model Project {
id String @id @default(uuid(7))
name String
@@ -135,11 +152,19 @@ model Project {
@@map("project")
}
/// MEMBER создаёт задачи в проекте; OBSERVER только видит проект —
/// он наблюдает за отдельными задачами (IssueObserver).
enum ProjectRole {
MEMBER
OBSERVER
}
model ProjectMember {
id String @id @default(uuid(7))
id String @id @default(uuid(7))
projectId String
userId String
createdAt DateTime @default(now()) @db.Timestamptz(3)
role ProjectRole @default(MEMBER)
createdAt DateTime @default(now()) @db.Timestamptz(3)
project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
user User @relation(fields: [userId], references: [id], onDelete: Cascade)