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

@@ -4,6 +4,12 @@ import { PaginationMeta } from '../../../../common/interfaces/pagination-meta.in
/** DI-токен, т.к. интерфейсы стираются при компиляции TS */
export const PROJECT_REPOSITORY = Symbol('PROJECT_REPOSITORY');
/**
* Роль пользователя в проекте. OWNER и MEMBER создают задачи,
* OBSERVER только видит проект (он наблюдатель отдельных задач).
*/
export type ProjectRole = 'OWNER' | 'MEMBER' | 'OBSERVER';
export interface IProjectRepository {
/** Проект виден владельцу и участникам проекта (ProjectMember) */
findById(id: string, userId: string): Promise<Project | null>;
@@ -11,6 +17,11 @@ export interface IProjectRepository {
create(project: Project): Promise<Project>;
update(project: Project): Promise<void>;
delete(id: string): Promise<void>;
/** Добавляет пользователя в участники проекта, если он ещё не владелец/участник */
addMember(projectId: string, userId: string): Promise<void>;
/** Роль пользователя в проекте; null — проект ему не виден (или не существует) */
findRole(projectId: string, userId: string): Promise<ProjectRole | null>;
/**
* Добавляет пользователя в участники проекта. Роль только повышается:
* OBSERVER становится MEMBER, но MEMBER не понижается до OBSERVER.
*/
addMember(projectId: string, userId: string, role: Exclude<ProjectRole, 'OWNER'>): Promise<void>;
}