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; findAll(params: { limit: number; page: number; userId: string }): Promise<{ list: Project[]; meta: PaginationMeta }>; create(project: Project): Promise; update(project: Project): Promise; delete(id: string): Promise; /** Роль пользователя в проекте; null — проект ему не виден (или не существует) */ findRole(projectId: string, userId: string): Promise; /** * Добавляет пользователя в участники проекта. Роль только повышается: * OBSERVER становится MEMBER, но MEMBER не понижается до OBSERVER. */ addMember(projectId: string, userId: string, role: Exclude): Promise; }