import { router, publicProcedure, isAdminMiddleware, isSigninMiddleware, } from "../trpc"; import { z } from "zod"; import { statusEnumSchema } from "@/database/schema"; import { userFacadeService } from "../user/application/facade"; import { userInvitation, userSchema } from "@/lib/schemas/userSchema"; import { v4 as uuidv4 } from "uuid"; import { userToolSchema } from "@/lib/schemas/toolSchema"; import { toolServiceFacade } from "../tool/application/facade"; import { taskServiceFacade } from "../task/application/facade"; export const userRouter = router({ getUsers: publicProcedure.use(isAdminMiddleware).query(async ({ ctx }) => { const userId = { value: ctx.user.userId }; return await userFacadeService.getAllUsers(userId); }), getUserById: publicProcedure .input( z.object({ userId: z.string(), range: z .string() .transform((value) => (value === "all" ? undefined : value)) .optional(), status: statusEnumSchema.optional(), }) ) .query(async ({ input, ctx }) => { const userId = { value: input.userId }; const data = (await userFacadeService.getUserWithTaskById(userId, input)) || {}; console.log("data user", data); return data; }), findOrCreateUser: publicProcedure.input(userSchema).mutation(async ({input}) => { return await userFacadeService.findOrCreateUser(input as any); }), sendInvitation: publicProcedure .use(isAdminMiddleware) .input(userInvitation) .mutation(async ({ input, ctx }) => { try { return await userFacadeService.sendInvitation(input as any ); } catch (error: any) { throw error; } }), updateUser: publicProcedure .use(isAdminMiddleware) .input( userSchema.partial().extend({ id: z.string({ message: "usuario no valido" }), }) ) .mutation(async ({ input, ctx }) => { return await userFacadeService.updateUserClerk(input as any); }), getUserActiveTasks: publicProcedure .use(isSigninMiddleware) .input( z.object({ status: z .enum(["pendientes", "expiradas", "completada"]) .optional() .default("pendientes"), q: z.string().optional().default(""), limit: z.number().default(10), onlyUserTask: z.boolean().optional(), onlyRecentModifiedTask: z.boolean().optional(), }) ) .query(async ({ input, ctx }) => { return await taskServiceFacade.getAllTasks({ status: "completada", range: "thisyear", }); }), getUserRecentCompleatedTasks: publicProcedure .use(isAdminMiddleware) .input( z .object({ range: z.string().optional().default("thisyear"), }) .optional() ) .query(async ({ input, ctx }) => { return await taskServiceFacade.getUserCompleatedTasks({ range: input?.range, }); }), updateAssignedUserTools: publicProcedure .use(isAdminMiddleware) .input(userToolSchema) .mutation(async ({ input, ctx }) => { return await toolServiceFacade.updateAssignUserTools(input.tools); }), deleteAsssignedUserTools: publicProcedure .use(isAdminMiddleware) .input( z.object({ tools: z.array( z.object({ toolId: z.string().uuid(), userId: z.string(), toolName: z.string(), }) ), }) ) .mutation(async ({ input, ctx }) => { const { tools } = input; return await toolServiceFacade.deleteUserTools(tools); }), getUserWeeklyActivity: publicProcedure .use(isSigninMiddleware) .query(async ({ input, ctx }) => { const userId = { value: ctx?.user?.userId }; return await taskServiceFacade.getUserWeeklyActivity(userId); }), getUserMonthActivity: publicProcedure .use(isSigninMiddleware) .query(async ({ ctx }) => { const userId = { value: ctx?.user?.userId }; return (await taskServiceFacade.getUserMonthActivity(userId)) || []; }), banUser: publicProcedure .use(isAdminMiddleware) .input( z.object({ userId: z.string().min(1, { message: "User id invalid" }), }) ) .mutation(async ({ input, ctx }) => { return await userFacadeService.banUser({ value: input.userId }); }), unbanUser: publicProcedure .use(isAdminMiddleware) .input( z.object({ userId: z.string().min(1, { message: "User id invalid" }), }) ) .mutation(async ({ input, ctx }) => { return await userFacadeService.unbanUser({ value: input.userId }); }), deleteUser: publicProcedure .use(isAdminMiddleware) .input( z.object({ userId: z.string().min(1, { message: "User id invalid" }), }) ) .mutation(async ({ input, ctx }) => { return await userFacadeService.deleteUserClerk({ value: input.userId }); }), });