task-managment / src / server / routers / user.ts
user.ts
Raw
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 });
    }),
});