import {
router,
publicProcedure,
isAdminMiddleware,
} from "../trpc";
import { tuple, z } from "zod";
import {
createProjectSchema,
updateProjectSchema,
} from "@/lib/schemas/projectSchema";
import { modifyProjectCostsSchema } from "@/lib/schemas/modifyProjectCostSchema";
import { projectServiceFacade } from "../project/application/facade";
import { projectStatusEnum } from "@/database/schema";
import { v4 as uuidv4 } from "uuid";
export const paramsSchema = z.object({
range: z.string().nullable().optional(),
status: projectStatusEnum
.or(z.literal("all"))
.transform((value) => (value === "all" ? undefined : value)).optional(),
searchQuery: z.string().nullable().default(null),
page: z.coerce.number().default(1),
limit: z.coerce.number().default(10),
includeTasks: z.boolean().optional(),
includeAreas: z.boolean().optional(),
includeFloor: z.boolean().optional(),
});
export const projectsRouter = router({
createProject: publicProcedure
.use(isAdminMiddleware)
.input(createProjectSchema)
.mutation(async ({ input, ctx }) => {
const userId = { value: ctx.user.userId };
const id = uuidv4();
return await projectServiceFacade.createProject({ ...input, id }, userId);
}),
updateProject: publicProcedure
.use(isAdminMiddleware)
.input(updateProjectSchema)
.mutation(async ({ input, ctx }) => {
const userId = { value: ctx.user.userId };
return await projectServiceFacade.updateProject(input, userId);
}),
getProjects: publicProcedure
.use(isAdminMiddleware)
.input(paramsSchema)
.query(async ({ input, ctx }) => {
return await projectServiceFacade.getProjects(input as any);
}),
getProjectById: publicProcedure
.input(
z.object({
value: z.string().uuid(),
})
)
.query(async ({ input, ctx }) => {
return await projectServiceFacade.getProjectById(input);
}),
getProjectsSearch: publicProcedure
.input(
z.object({
searchQuery: z.string(),
})
)
.query(async ({ input, ctx }) => {
return await projectServiceFacade.searchProjects(input);
}),
getAllProjectMaterials: publicProcedure
.use(isAdminMiddleware)
.input(
z.object({
status: z.string().default("all"),
})
)
.query(async ({ input, ctx }) => {
return await projectServiceFacade.getAllProjectMaterials();
}),
getProjectsSummary: publicProcedure
.use(isAdminMiddleware)
.input(
z.object({
range: z.string().optional(),
})
.optional()
)
.query(async ({ input, ctx }) => {
return await projectServiceFacade.getProjectSummary(input as any);
}),
getProjectEarningsYear: publicProcedure
.use(isAdminMiddleware)
.input(
z
.object({
range: z.string().optional(),
})
.optional()
)
.query(async ({ input, ctx }) => {
return await projectServiceFacade.getProjectEarnings({range:input?.range as any})
}),
});