sync-workout-sessions.action.ts 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. "use server";
  2. import { z } from "zod";
  3. import { workoutSessionStatuses } from "@/shared/lib/workout-session/types/workout-session";
  4. import { prisma } from "@/shared/lib/prisma";
  5. import { actionClient } from "@/shared/api/safe-actions";
  6. // Schéma de validation
  7. const syncWorkoutSessionSchema = z.object({
  8. session: z.object({
  9. id: z.string(),
  10. userId: z.string(),
  11. startedAt: z.string(),
  12. endedAt: z.string().optional(),
  13. exercises: z.array(z.any()), // TODO: define the schema
  14. status: z.enum(workoutSessionStatuses),
  15. }),
  16. });
  17. export const syncWorkoutSessionAction = actionClient.schema(syncWorkoutSessionSchema).action(async ({ parsedInput }) => {
  18. try {
  19. const { session } = parsedInput;
  20. const result = await prisma.workoutSession.upsert({
  21. where: { id: session.id },
  22. create: {
  23. ...session,
  24. exercises: {
  25. create: session.exercises.map((exercise) => ({
  26. ...exercise,
  27. sets: {
  28. create: exercise.sets,
  29. },
  30. })),
  31. },
  32. },
  33. update: {
  34. ...session,
  35. exercises: {
  36. deleteMany: {},
  37. create: session.exercises.map((exercise) => ({
  38. ...exercise,
  39. sets: {
  40. create: exercise.sets,
  41. },
  42. })),
  43. },
  44. },
  45. });
  46. return { data: result };
  47. } catch (error) {
  48. console.error("Error syncing workout session:", error);
  49. return { serverError: "Failed to sync workout session" };
  50. }
  51. });