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 { return this.projectRepository.getAll(filter) } getAllProjectMaterials(): Promise { return this.projectRepository.getAllProjectMaterials() } getProjectById(projectId: ProjectId): Promise { return this.projectRepository.getById(projectId) } getProjectEarnings(filter: ProjectFilter): Promise { return this.projectRepository.getProjectEarnings(filter) } getProjectSummary(filter: ProjectFilter): Promise { return this.projectRepository.getProjectSummary(filter) } createProject(data: Project, userId: UserId): Promise { return this.projectRepository.create(data,userId) } updateProject(data: Project, userId: UserId): Promise { return this.projectRepository.update(data,userId) } searchProjects(filter: ProjectFilter): Promise> { return this.projectRepository.getProductSearch(filter) } createProjectArea(data: Area, userId: UserId): Promise { return this.projectRepository.createProjectArea(data,userId) } updateProjectArea(data: Partial, userId: UserId): Promise> { return this.projectRepository.updateProjectArea(data,userId) } deleteProjectArea(areaId: AreaId, userId: UserId): Promise { return this.projectRepository.deleteProjectArea(areaId,userId) } async isFloorInProjectExist(floorName: string, projectId: ProjectId): Promise { 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 { const projectId = {value:data.projectId} await this.isFloorInProjectExist(data.name,projectId) return this.projectRepository.createProjectFloor(data,userId) } updateProjectFloor(data: Partial, userId: UserId): Promise> { return this.projectRepository.updateProjectFloor(data,userId) } deleteProjectFloor(floorId: FloorId, userId: UserId): Promise> { return this.projectRepository.deleteProjectFloor(floorId,userId) } } export const defaultProjectService= new ProjectServiceImpl(defaultProjectRepository)