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)