task-managment / src / server / project / application / project-service-impl.ts
project-service-impl.ts
Raw
import { UserId } from "@/server/user/domain/models";
import { Area, AreaId, Floor, FloorId, Project, ProjectDetail, ProjectEarningsResults, ProjectFilter, ProjectId, ProjectMaterials, ProjectQueryResuls, ProjectSummary } from "../domain/models";
import { ProjectRepository } from "../domain/repositories";
import { ProjectService } from "./project-service-definition";
import { defaultProjectRepository } from "../infrastructure/repositories-impl";
import { TRPCError } from "@trpc/server";

class ProjectServiceImpl implements ProjectService {
  constructor(private projectRepository: ProjectRepository) {}

  getProjects(filter: ProjectFilter): Promise<ProjectQueryResuls> {
      return this.projectRepository.getAll(filter)
  }
  getAllProjectMaterials(): Promise<ProjectMaterials[]> {
      return this.projectRepository.getAllProjectMaterials()
  }
  getProjectById(projectId: ProjectId): Promise<ProjectDetail> {
      return this.projectRepository.getById(projectId)
  }
  getProjectEarnings(filter: ProjectFilter): Promise<ProjectEarningsResults> {
      return this.projectRepository.getProjectEarnings(filter)
  }
  getProjectSummary(filter: ProjectFilter): Promise<ProjectSummary[]> {
      return this.projectRepository.getProjectSummary(filter)
  }
  createProject(data: Project, userId: UserId): Promise<Project> {
      return this.projectRepository.create(data,userId)
  }
  updateProject(data: Project, userId: UserId): Promise<Project> {
      return this.projectRepository.update(data,userId)
  }
  searchProjects(filter: ProjectFilter): Promise<Partial<Project[]>> {
      return this.projectRepository.getProductSearch(filter)
  }
  createProjectArea(data: Area, userId: UserId): Promise<Area> {
      return this.projectRepository.createProjectArea(data,userId)
  }
  updateProjectArea(data: Partial<Area>, userId: UserId): Promise<Partial<Area>> {
      return this.projectRepository.updateProjectArea(data,userId)
  }
  deleteProjectArea(areaId: AreaId, userId: UserId): Promise<Area> {
      return this.projectRepository.deleteProjectArea(areaId,userId)
  }

  async isFloorInProjectExist(floorName: string, projectId: ProjectId): Promise<boolean> {
      const result = await  this.projectRepository.isFloorInProjectExist(floorName,projectId)
      if(result){
        throw new TRPCError({
            code:'CONFLICT',
            message:'Piso ya existe'
        })}
     return result
  }
  async createProjectFloor(data: Floor, userId: UserId): Promise<Floor> {
      const projectId = {value:data.projectId}
      await this.isFloorInProjectExist(data.name,projectId)
      return this.projectRepository.createProjectFloor(data,userId)
  }
  updateProjectFloor(data: Partial<Floor>, userId: UserId): Promise<Partial<Floor>> {
      return this.projectRepository.updateProjectFloor(data,userId)
  }
  deleteProjectFloor(floorId: FloorId, userId: UserId): Promise<Partial<Floor>> {
      return this.projectRepository.deleteProjectFloor(floorId,userId)
  }
}

export const defaultProjectService= new ProjectServiceImpl(defaultProjectRepository)