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<TasksByDate[]> {
return this.taskRepository.getAll(filter, userId);
}
async getUserCompleatedTasks(filter: FilterTasks): Promise<any[]> {
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<string, number>);
return Object.entries(result).map(([user, total]) => ({ user, total }));
}
getRecentModifiedTasks(): Promise<Task[]> {
return this.taskRepository.getRecentModified();
}
getProjectTasks(filter: FilterTasks): Promise<ProjectTaskQueryResult[]> {
return this.taskRepository.getProjectTasks(filter);
}
async isTaskAreaAssigned(areaId:AreaId): Promise<boolean> {
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<Task> {
await this.isTaskAreaAssigned({value:input.areaId})
return this.taskRepository.create(input, userId);
}
updateTask(input: Partial<Task>, userId: UserId): Promise<Partial<Task>> {
return this.taskRepository.update(input, userId);
}
deleteTask(taskId: TaskId, userId: UserId): Promise<Task> {
return this.taskRepository.delete(taskId, userId);
}
getUserWeeklyActivity(userId: UserId): Promise<WeeklyActivity[]> {
return this.taskRepository.getUserWeeklyActivity(userId)
}
getUserMonthActivity(userId: UserId): Promise<MonthlyActivity> {
return this.taskRepository.userMonthActivity(userId)
}
}
export const defaultTaskService= new TaskServiceImpl(defaultTaskRepository)