import { UserId } from "@/server/user/domain/models"; import { FilterTasks, MonthlyActivity, ProjectTaskQueryResult, Task, TaskId, TasksByDate, WeeklyActivity, } from "../domain/models"; import { TaskService } from "./task-service-definition"; import { TaskRepository } from "../domain/repositories"; import { defaultTaskRepository } from "../infrastructure/repositories-impl"; import { AreaId, ProjectId } from "@/server/project/domain/models"; import { TRPCError } from "@trpc/server"; class TaskServiceImpl implements TaskService { constructor(private taskRepository: TaskRepository) {} getAllTasks(filter: FilterTasks, userId?: UserId): Promise { return this.taskRepository.getAll(filter, userId); } async getUserCompleatedTasks(filter: FilterTasks): Promise { const data = await this.taskRepository.getAll({status:'completada',range:filter.range}) const result = data.reduce((acc, { tasks }) => { tasks.forEach(task => { const userName = task.user?.firstName if (!userName) return; if (!acc[userName]) { acc[userName] = 0; } acc[userName]++; }); return acc; }, {} as Record); return Object.entries(result).map(([user, total]) => ({ user, total })); } getRecentModifiedTasks(): Promise { return this.taskRepository.getRecentModified(); } getProjectTasks(filter: FilterTasks): Promise { return this.taskRepository.getProjectTasks(filter); } async isTaskAreaAssigned(areaId:AreaId): Promise { const result = await this.taskRepository.isTaskAreaAssigned(areaId) if(result){ throw new TRPCError({ code: "CONFLICT", message: "Tarea ya signada", }); } return result } async createTask(input: Task, userId: UserId): Promise { await this.isTaskAreaAssigned({value:input.areaId}) return this.taskRepository.create(input, userId); } updateTask(input: Partial, userId: UserId): Promise> { return this.taskRepository.update(input, userId); } deleteTask(taskId: TaskId, userId: UserId): Promise { return this.taskRepository.delete(taskId, userId); } getUserWeeklyActivity(userId: UserId): Promise { return this.taskRepository.getUserWeeklyActivity(userId) } getUserMonthActivity(userId: UserId): Promise { return this.taskRepository.userMonthActivity(userId) } } export const defaultTaskService= new TaskServiceImpl(defaultTaskRepository)