diff --git a/apps/web/src/apis/applications/api.ts b/apps/web/src/apis/applications/api.ts index 9f10a94f..bd3bd14e 100644 --- a/apps/web/src/apis/applications/api.ts +++ b/apps/web/src/apis/applications/api.ts @@ -8,6 +8,14 @@ export const ApplicationsQueryKeys = { applicationPreview: "applicationPreview", } as const; +// ====== Utils ====== +/** 유효한 양의 정수만 쿼리 파라미터로 내보낸다. (universities/api.ts 와 동일한 규칙) */ +const normalizePositiveInt = (value: unknown) => { + const numberValue = typeof value === "string" && value.trim() !== "" ? Number(value) : value; + + return typeof numberValue === "number" && Number.isInteger(numberValue) && numberValue > 0 ? numberValue : undefined; +}; + // ====== Types ====== export interface UseSubmitApplicationResponse { totalApplyCount: number; @@ -37,9 +45,16 @@ export interface CompetitorsResponse { export const applicationsApi = { /** * 지원 목록 조회 + * + * homeUniversityId 는 클라이언트가 임의로 정하는 값이 아니라, + * access token 에서 파싱된 로그인 사용자의 소속 대학(useAuthStore.homeUniversityId)을 그대로 전달한다. */ - getApplicationsList: async (): Promise> => { - return axiosInstance.get("/applications"); + getApplicationsList: async (params?: { + homeUniversityId?: number | null; + }): Promise> => { + return axiosInstance.get("/applications", { + params: { homeUniversityId: normalizePositiveInt(params?.homeUniversityId) }, + }); }, /** diff --git a/apps/web/src/apis/applications/getApplicants.ts b/apps/web/src/apis/applications/getApplicants.ts index f7da9024..a1f4f5a0 100644 --- a/apps/web/src/apis/applications/getApplicants.ts +++ b/apps/web/src/apis/applications/getApplicants.ts @@ -1,6 +1,7 @@ import { type UseQueryOptions, type UseQueryResult, useQuery } from "@tanstack/react-query"; import type { AxiosError, AxiosResponse } from "axios"; +import useAuthStore from "@/lib/zustand/useAuthStore"; import type { ApplicationListResponse } from "@/types/application"; import { ApplicationsQueryKeys, applicationsApi } from "./api"; @@ -11,13 +12,18 @@ type UseGetApplicationsListOptions = Omit< /** * @description 지원 목록 조회 훅 + * + * 소속 대학(homeUniversityId)은 access token 에서 파싱되어 useAuthStore 에 담긴 값을 사용한다. + * 다른 소속 대학의 응답이 캐시에 섞이지 않도록 queryKey 에도 포함한다. */ const useGetApplicationsList = ( props?: UseGetApplicationsListOptions, ): UseQueryResult> => { + const homeUniversityId = useAuthStore((state) => state.homeUniversityId); + return useQuery({ - queryKey: [ApplicationsQueryKeys.competitorsApplicationList], - queryFn: applicationsApi.getApplicationsList, + queryKey: [ApplicationsQueryKeys.competitorsApplicationList, homeUniversityId], + queryFn: () => applicationsApi.getApplicationsList({ homeUniversityId }), staleTime: 1000 * 60 * 5, // 5분간 캐시 select: (response) => response.data, ...props,