From 163b7991d302980ecffc6bf896ad14769f457eae Mon Sep 17 00:00:00 2001 From: pricelees Date: Mon, 15 Sep 2025 16:06:14 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20=EC=9D=BC=EC=A0=95=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=ED=94=84=EB=A1=A0=ED=8A=B8=EC=97=94=EB=93=9C=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=B0=8F=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/api/auth/authTypes.ts | 2 +- frontend/src/api/schedule/scheduleAPI.ts | 22 +++++++++---------- frontend/src/api/store/storeTypes.ts | 4 ++-- frontend/src/context/AdminAuthContext.tsx | 6 ++--- frontend/src/pages/ReservationStep1Page.tsx | 6 ++--- .../src/pages/admin/AdminSchedulePage.tsx | 20 ++++++++++++----- 6 files changed, 34 insertions(+), 26 deletions(-) diff --git a/frontend/src/api/auth/authTypes.ts b/frontend/src/api/auth/authTypes.ts index 2d53a88c..c67e1e92 100644 --- a/frontend/src/api/auth/authTypes.ts +++ b/frontend/src/api/auth/authTypes.ts @@ -28,7 +28,7 @@ export interface UserLoginSuccessResponse extends LoginSuccessResponse { export interface AdminLoginSuccessResponse extends LoginSuccessResponse { type: AdminType; - storeId: number | null; + storeId: string | null; } export interface CurrentUserContext { diff --git a/frontend/src/api/schedule/scheduleAPI.ts b/frontend/src/api/schedule/scheduleAPI.ts index 978e9ddc..c4ee3cfc 100644 --- a/frontend/src/api/schedule/scheduleAPI.ts +++ b/frontend/src/api/schedule/scheduleAPI.ts @@ -8,28 +8,28 @@ import type { ScheduleUpdateRequest } from './scheduleTypes'; -export const fetchAvailableThemesByDate = async (date: string): Promise => { - return await apiClient.get(`/schedules/themes?date=${date}`); +export const fetchStoreAvailableThemesByDate = async (storeId: string, date: string): Promise => { + return await apiClient.get(`/stores/${storeId}/themes?date=${date}`); }; -export const fetchSchedulesByDateAndTheme = async (storeId: number, date: string, themeId: string): Promise => { - return await apiClient.get(`/schedules?storeId=${storeId}&date=${date}&themeId=${themeId}`); +export const fetchStoreSchedulesByDateAndTheme = async (storeId: string, date: string, themeId: string): Promise => { + return await apiClient.get(`/stores/${storeId}/schedules?date=${date}&themeId=${themeId}`); }; -export const fetchScheduleById = async (id: string): Promise => { - return await apiClient.get(`/schedules/${id}`); -} +export const fetchScheduleDetailById = async (id: string): Promise => { + return await apiClient.get(`/admin/schedules/${id}`); +}; -export const createSchedule = async (request: ScheduleCreateRequest): Promise => { - return await apiClient.post('/schedules', request); +export const createSchedule = async (storeId: string, request: ScheduleCreateRequest): Promise => { + return await apiClient.post(`/admin/stores/${storeId}/schedules`, request); }; export const updateSchedule = async (id: string, request: ScheduleUpdateRequest): Promise => { - await apiClient.patch(`/schedules/${id}`, request); + await apiClient.patch(`/admin/schedules/${id}`, request); }; export const deleteSchedule = async (id: string): Promise => { - await apiClient.del(`/schedules/${id}`); + await apiClient.del(`/admin/schedules/${id}`); }; export const holdSchedule = async (id: string): Promise => { diff --git a/frontend/src/api/store/storeTypes.ts b/frontend/src/api/store/storeTypes.ts index bf54e0fc..b036d664 100644 --- a/frontend/src/api/store/storeTypes.ts +++ b/frontend/src/api/store/storeTypes.ts @@ -2,12 +2,12 @@ import { type AuditInfo } from '@_api/common/commonTypes'; import type { RegionInfoResponse } from '@_api/region/regionTypes'; export interface SimpleStoreResponse { - id: number; + id: string; name: string; } export interface StoreDetailResponse { - id: number; + id: string; name: string; address: string; contact: string; diff --git a/frontend/src/context/AdminAuthContext.tsx b/frontend/src/context/AdminAuthContext.tsx index a62fe7f3..3857aeec 100644 --- a/frontend/src/context/AdminAuthContext.tsx +++ b/frontend/src/context/AdminAuthContext.tsx @@ -10,7 +10,7 @@ interface AdminAuthContextType { isAdmin: boolean; name: string | null; type: AdminType | null; - storeId: number | null; + storeId: string | null; loading: boolean; login: (data: Omit) => Promise; logout: () => Promise; @@ -22,7 +22,7 @@ export const AdminAuthProvider: React.FC<{ children: ReactNode }> = ({ children const [isAdmin, setIsAdmin] = useState(false); const [name, setName] = useState(null); const [type, setType] = useState(null); - const [storeId, setStoreId] = useState(null); + const [storeId, setStoreId] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { @@ -36,7 +36,7 @@ export const AdminAuthProvider: React.FC<{ children: ReactNode }> = ({ children setIsAdmin(true); setName(storedName); setType(storedType); - setStoreId(storedStoreId ? parseInt(storedStoreId, 10) : null); + setStoreId(storedStoreId ? storedStoreId : null); } } catch (error) { console.error("Failed to load admin auth state from storage", error); diff --git a/frontend/src/pages/ReservationStep1Page.tsx b/frontend/src/pages/ReservationStep1Page.tsx index df648370..0f3e16b0 100644 --- a/frontend/src/pages/ReservationStep1Page.tsx +++ b/frontend/src/pages/ReservationStep1Page.tsx @@ -1,5 +1,5 @@ import {isLoginRequiredError} from '@_api/apiClient'; -import {fetchAvailableThemesByDate, fetchSchedulesByDateAndTheme, holdSchedule} from '@_api/schedule/scheduleAPI'; +import {fetchStoreAvailableThemesByDate, fetchStoreSchedulesByDateAndTheme, holdSchedule} from '@_api/schedule/scheduleAPI'; import {type ScheduleRetrieveResponse, ScheduleStatus} from '@_api/schedule/scheduleTypes'; import {fetchThemesByIds} from '@_api/theme/themeAPI'; import {mapThemeResponse, type ThemeInfoResponse} from '@_api/theme/themeTypes'; @@ -35,7 +35,7 @@ const ReservationStep1Page: React.FC = () => { useEffect(() => { if (selectedDate) { const dateStr = selectedDate.toLocaleDateString('en-CA'); // yyyy-mm-dd - fetchAvailableThemesByDate(dateStr) + fetchStoreAvailableThemesByDate(dateStr) .then(res => { console.log('Available themes response:', res); const themeIds: string[] = res.themeIds; @@ -69,7 +69,7 @@ const ReservationStep1Page: React.FC = () => { useEffect(() => { if (selectedDate && selectedTheme) { const dateStr = selectedDate.toLocaleDateString('en-CA'); - fetchSchedulesByDateAndTheme(dateStr, selectedTheme.id) + fetchStoreSchedulesByDateAndTheme(dateStr, selectedTheme.id) .then(res => { setSchedules(res.schedules); setSelectedSchedule(null); diff --git a/frontend/src/pages/admin/AdminSchedulePage.tsx b/frontend/src/pages/admin/AdminSchedulePage.tsx index ae0cec33..4382c195 100644 --- a/frontend/src/pages/admin/AdminSchedulePage.tsx +++ b/frontend/src/pages/admin/AdminSchedulePage.tsx @@ -2,8 +2,8 @@ import { isLoginRequiredError } from '@_api/apiClient'; import { createSchedule, deleteSchedule, - fetchScheduleById, - fetchSchedulesByDateAndTheme, + fetchScheduleDetailById, + fetchStoreSchedulesByDateAndTheme, updateSchedule } from '@_api/schedule/scheduleAPI'; import { @@ -108,7 +108,7 @@ const AdminSchedulePage: React.FC = () => { const fetchSchedules = () => { const storeId = adminType === 'HQ' ? selectedStoreId : adminStoreId; if (storeId && selectedDate && selectedThemeId) { - fetchSchedulesByDateAndTheme(Number(storeId), selectedDate, selectedThemeId) + fetchStoreSchedulesByDateAndTheme(storeId, selectedDate, selectedThemeId) .then(res => setSchedules(res.schedules)) .catch(err => { setSchedules([]); @@ -147,8 +147,16 @@ const AdminSchedulePage: React.FC = () => { alert('시간 형식이 올바르지 않습니다. HH:MM 형식으로 입력해주세요.'); return; } + if (adminType !== 'STORE' || !adminStoreId) { + alert('매장 관리자만 일정을 추가할 수 있습니다.'); + return; + } + if (!selectedDate || !selectedThemeId) { + alert('날짜와 테마를 선택해주세요.'); + return; + } try { - await createSchedule({ + await createSchedule(adminStoreId, { date: selectedDate, themeId: selectedThemeId, time: newScheduleTime, @@ -183,7 +191,7 @@ const AdminSchedulePage: React.FC = () => { if (!detailedSchedules[scheduleId]) { setIsLoadingDetails(true); try { - const details = await fetchScheduleById(scheduleId); + const details = await fetchScheduleDetailById(scheduleId); setDetailedSchedules(prev => ({ ...prev, [scheduleId]: details })); } catch (error) { handleError(error); @@ -222,7 +230,7 @@ const AdminSchedulePage: React.FC = () => { status: editingSchedule.status, }); // Refresh data - const details = await fetchScheduleById(editingSchedule.id); + const details = await fetchScheduleDetailById(editingSchedule.id); setDetailedSchedules(prev => ({ ...prev, [editingSchedule.id]: details })); setSchedules(schedules.map(s => s.id === editingSchedule.id ? { ...s, time: details.time, status: details.status } : s));