task-managment / src / server / task / application / task-service-impl.ts
task-service-impl.ts
Raw
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)