diff --git a/back/src/history/history.service.ts b/back/src/history/history.service.ts index fff3518..a792098 100644 --- a/back/src/history/history.service.ts +++ b/back/src/history/history.service.ts @@ -51,6 +51,7 @@ export class HistoryService { orderBy: { playDate: 'desc' }, skip, take, + include: { song: true } }); } diff --git a/front/API.ts b/front/API.ts index 5b4384e..69db79b 100644 --- a/front/API.ts +++ b/front/API.ts @@ -139,6 +139,8 @@ export default class API { } throw e; }); + if (!handler.transformer) + return handler.validator.cast(validated); return handler.transformer(handler.validator.cast(validated)); } catch (e) { if (e instanceof SyntaxError) throw new Error("Error while parsing Server's response"); diff --git a/front/components/V2/TabNavigationDesktop.tsx b/front/components/V2/TabNavigationDesktop.tsx index 3fc055a..02f44a5 100644 --- a/front/components/V2/TabNavigationDesktop.tsx +++ b/front/components/V2/TabNavigationDesktop.tsx @@ -25,10 +25,7 @@ const TabNavigationDesktop = (props: TabNavigationDesktopProps) => { ? require('../../assets/icon_light.png') : require('../../assets/icon_dark.png') ); - const playHistoryQuery = useQuery(API.getUserPlayHistory); - const songHistory = useQueries( - playHistoryQuery.data?.map(({ songID }) => API.getSong(songID)) ?? [] - ); + const history = useQuery(API.getUserPlayHistory); // settings is displayed separately (with logout) const buttons = props.tabs.filter((tab) => tab.id !== 'settings'); @@ -110,7 +107,7 @@ const TabNavigationDesktop = (props: TabNavigationDesktopProps) => { > Recently played - {songHistory.length === 0 && ( + {history.data?.length === 0 && ( { No songs played yet )} - {songHistory - .map((h) => h.data) - .filter((data): data is Song => data !== undefined) + {history.data + ?.map(x => x.song) .filter( (song, i, array) => array.map((s) => s.id).findIndex((id) => id == song.id) == i diff --git a/front/models/ResponseHandler.ts b/front/models/ResponseHandler.ts index f6bb5c4..337089b 100644 --- a/front/models/ResponseHandler.ts +++ b/front/models/ResponseHandler.ts @@ -2,7 +2,7 @@ import * as yup from 'yup'; type ResponseHandler = { validator: yup.Schema; - transformer: (value: APIType) => ModelType; + transformer?: (value: APIType) => ModelType; }; export default ResponseHandler; diff --git a/front/models/SongHistory.ts b/front/models/SongHistory.ts index d8a81ef..de43b9c 100644 --- a/front/models/SongHistory.ts +++ b/front/models/SongHistory.ts @@ -1,23 +1,19 @@ import * as yup from 'yup'; import ResponseHandler from './ResponseHandler'; +import { SongValidator } from './Song'; export const SongHistoryItemValidator = yup.object({ songID: yup.number().required(), + song: SongValidator.required(), userID: yup.number().required(), score: yup.number().required(), playDate: yup.date().required(), difficulties: yup.mixed().required(), }); +export type SongHistoryItem = yup.InferType; -export const SongHistoryItemHandler: ResponseHandler< - yup.InferType, - SongHistoryItem -> = { +export const SongHistoryItemHandler: ResponseHandler = { validator: SongHistoryItemValidator, - transformer: (value) => ({ - ...value, - difficulties: value.difficulties, - }), }; export const SongHistoryValidator = yup.object({ @@ -29,18 +25,6 @@ export type SongHistory = yup.InferType; export const SongHistoryHandler: ResponseHandler = { validator: SongHistoryValidator, - transformer: (value) => ({ - ...value, - history: value.history.map((item) => SongHistoryItemHandler.transformer(item)), - }), -}; - -export type SongHistoryItem = { - songID: number; - userID: number; - score: number; - playDate: Date; - difficulties: object; }; export default SongHistory;