super-fit-web-app / src / server / routers / exercise.ts
exercise.ts
Raw
import { z } from "zod";
import { procedure, router } from "../trpc";
import { db } from "@/db/PrismaClient";
import { TRPCError } from '@trpc/server';

export const exerciseRouter = router({
  getExercises: procedure
  .input(z.object({
    cursor: z.string().optional(),
  }))
  .mutation(async ({ ctx, input }) => {
    try{
      const { cursor } = input;
      let exercises: any[] = [];

      if (cursor) {
        exercises = await db.exercise.findMany({
          take: 10,
          skip: 1,
          cursor: {
            id: cursor,
          },
        });
      } else {
        exercises = await db.exercise.findMany({
          take: 10,
        });
      }

      let newCursor = undefined;
      if (exercises.length > 0) {
        newCursor = exercises[exercises.length - 1].id;
      }

      return {
        exercises,
        newCursor,
      };
    } catch (error) {
      console.log(error)
      if (error instanceof TRPCError) throw error;
      throw new TRPCError({
        code: 'INTERNAL_SERVER_ERROR',
        message: (error as Error).message,
        cause: error
      });
    }
  }),
  searchExercises: procedure
  .input(z.object({
    search: z.string(),
  }))
  .mutation(async ({ ctx, input }) => {
    try{
      const { search } = input;
      let exercises: any[] = [];

      exercises = await db.exercise.findMany({
        where: {
          name: {
            contains: search,
          },
        },
        take: 10,
      });

      return exercises
    } catch (error) {
      console.log(error)
      if (error instanceof TRPCError) throw error;
      throw new TRPCError({
        code: 'INTERNAL_SERVER_ERROR',
        message: (error as Error).message,
        cause: error
      });
    }
  }),
  createExercise: procedure
  .input(z.object({
    name: z.string(),
    description: z.string(),
    video: z.string(),
    image: z.string(),
    category: z.string(),
    difficulty: z.string(),
  }))
  .mutation(async ({ ctx, input }) => {
    const { name, description, video, image, category, difficulty } = input;
    try {
      const exercise = await db.exercise.create({
        data: {
          name,
          description,
          video,
          image,
          category,
          level: difficulty,
        },
      });
      console.log('Inserted New Exercise', exercise)
      return exercise;
    } catch (error) {
      console.log(error)
      if (error instanceof TRPCError) throw error;
      throw new TRPCError({
        code: 'INTERNAL_SERVER_ERROR',
        message: (error as Error).message,
        cause: error
      });
    }
  }),
})