import { getExercisesByIds } from "@/components/Exercises/api/exercise"; import { Exercise } from "@/components/Exercises/models/exercise"; import { WorkoutLog, WorkoutLogAdapter } from "@/components/Routines/models/WorkoutLog"; import { AddSessionParams, EditSessionParams, WorkoutSession, WorkoutSessionAdapter } from "@/components/Routines/models/WorkoutSession"; import { API_MAX_PAGE_SIZE, ApiPath } from "@/core/lib/consts"; import { fetchPaginated } from "@/core/lib/requests"; import { makeHeader, makeUrl } from "@/core/lib/url"; import axios from 'axios'; export type SessionQueryOptions = { filtersetQuerySessions?: object, filtersetQueryLogs?: object, } // eslint-disable-next-line @typescript-eslint/no-explicit-any export const searchSession = async (queryParams: Record): Promise => { const response = await axios.get( makeUrl(ApiPath.SESSION, { query: queryParams }), { headers: makeHeader() } ); if (response.data.count === 1) { return new WorkoutSessionAdapter().fromJson(response.data.results[0]); } return null; }; export const getSessions = async (options?: SessionQueryOptions): Promise => { const { filtersetQuerySessions = {}, filtersetQueryLogs = {} } = options || {}; const sessionAdapter = new WorkoutSessionAdapter(); const logAdapter = new WorkoutLogAdapter(); const result: WorkoutSession[] = []; const logs: WorkoutLog[] = []; // Fetch all logs first for await (const logPage of fetchPaginated( makeUrl( ApiPath.WORKOUT_LOG, { query: { limit: API_MAX_PAGE_SIZE, ...filtersetQueryLogs } } ), makeHeader() )) { for (const logData of logPage) { logs.push(logAdapter.fromJson(logData)); } } const exerciseIds = [...new Set(logs.map(log => log.exerciseId))]; if (exerciseIds.length > 0) { const exercises: Record = {}; for (const exercise of await getExercisesByIds(exerciseIds)) { exercises[exercise.id!] = exercise; } for (const log of logs) { log.exerciseObj = exercises[log.exerciseId]; } } for await (const sessionPage of fetchPaginated( makeUrl( ApiPath.SESSION, { query: { limit: API_MAX_PAGE_SIZE, ...filtersetQuerySessions } } ), makeHeader() )) { for (const sessionData of sessionPage) { const session = sessionAdapter.fromJson(sessionData); session.logs = logs.filter(log => log.sessionId === session.id); result.push(session); } } return result; }; export const addSession = async (data: AddSessionParams): Promise => { const response = await axios.post( makeUrl(ApiPath.SESSION,), data, { headers: makeHeader() } ); return new WorkoutSessionAdapter().fromJson(response.data); }; export const editSession = async (data: EditSessionParams): Promise => { const response = await axios.patch( makeUrl(ApiPath.SESSION, { id: data.id }), data, { headers: makeHeader() } ); return new WorkoutSessionAdapter().fromJson(response.data); };