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>
28 lines
1.6 KiB
TypeScript
28 lines
1.6 KiB
TypeScript
import { Project } from '../entities/project.entity.js';
|
|
import { PaginationMeta } from '../../../../common/interfaces/pagination-meta.interface.js';
|
|
|
|
/** 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>;
|
|
findAll(params: { limit: number; page: number; userId: string }): Promise<{ list: Project[]; meta: PaginationMeta }>;
|
|
create(project: Project): Promise<Project>;
|
|
update(project: Project): Promise<void>;
|
|
delete(id: 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>;
|
|
}
|