Files
ulitka/src/modules/project/domain/repositories/project.repository.interface.ts
T
vadimandClaude Opus 5.5 b1f6b61994
Gitea Actions / Deploy (push) Canceled after 5m13s
create issues fix
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>
2026-10-25 22:23:49 +03:00

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>;
}