From 24dd2c492fcb80e817e47ac377757fa4b2c93d51 Mon Sep 17 00:00:00 2001 From: pricelees Date: Sat, 13 Sep 2025 18:14:44 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20=EC=83=88=EB=A1=9C=EC=9A=B4=20API?= =?UTF-8?q?=20=EB=AA=85=EC=84=B8=EC=97=90=20=EB=A7=9E=EC=B6=98=20=ED=94=84?= =?UTF-8?q?=EB=A1=A0=ED=8A=B8=EC=97=94=EB=93=9C=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/api/auth/authAPI.ts | 12 +- frontend/src/api/auth/authTypes.ts | 18 +- frontend/src/api/member/memberAPI.ts | 10 - frontend/src/api/member/memberTypes.ts | 25 - frontend/src/api/payment/PaymentTypes.ts | 4 +- .../src/api/reservation/reservationAPI.ts | 98 ---- .../src/api/reservation/reservationTypes.ts | 135 ------ .../src/api/reservation/reservationTypesV2.ts | 10 +- frontend/src/api/theme/themeTypes.ts | 17 +- frontend/src/api/time/timeAPI.ts | 18 - frontend/src/api/time/timeTypes.ts | 27 -- frontend/src/api/user/userAPI.ts | 8 +- frontend/src/api/user/userTypes.ts | 9 +- frontend/src/components/Navbar.tsx | 8 +- frontend/src/context/AuthContext.tsx | 23 +- frontend/src/css/my-reservation-v2.css | 74 ++- frontend/src/pages/HomePage.tsx | 89 +++- frontend/src/pages/LoginPage.tsx | 54 ++- frontend/src/pages/MyReservationPage.tsx | 430 +++++++++++++++--- .../pages/{v2 => }/ReservationFormPage.tsx | 47 +- frontend/src/pages/ReservationPage.tsx | 198 -------- ...p1PageV21.tsx => ReservationStep1Page.tsx} | 72 ++- ...p2PageV21.tsx => ReservationStep2Page.tsx} | 8 +- ...PageV21.tsx => ReservationSuccessPage.tsx} | 6 +- frontend/src/pages/admin/ReservationPage.tsx | 204 --------- frontend/src/pages/admin/ThemePage.tsx | 82 ---- frontend/src/pages/admin/TimePage.tsx | 123 ----- frontend/src/pages/admin/WaitingPage.tsx | 89 ---- frontend/src/pages/v2/HomePageV2.tsx | 92 ---- frontend/src/pages/v2/LoginPageV2.tsx | 63 --- frontend/src/pages/v2/MyReservationPageV2.tsx | 342 -------------- .../src/pages/v2/ReservationStep1Page.tsx | 156 ------- .../src/pages/v2/ReservationStep2Page.tsx | 120 ----- .../src/pages/v2/ReservationSuccessPage.tsx | 44 -- frontend/src/pages/v2/SignupPageV2.tsx | 70 --- frontend/tsconfig.app.json | 1 + .../payment/business/PaymentService.kt | 54 ++- 37 files changed, 720 insertions(+), 2120 deletions(-) delete mode 100644 frontend/src/api/member/memberAPI.ts delete mode 100644 frontend/src/api/member/memberTypes.ts delete mode 100644 frontend/src/api/reservation/reservationAPI.ts delete mode 100644 frontend/src/api/reservation/reservationTypes.ts delete mode 100644 frontend/src/api/time/timeAPI.ts delete mode 100644 frontend/src/api/time/timeTypes.ts rename frontend/src/pages/{v2 => }/ReservationFormPage.tsx (72%) delete mode 100644 frontend/src/pages/ReservationPage.tsx rename frontend/src/pages/{v2/ReservationStep1PageV21.tsx => ReservationStep1Page.tsx} (88%) rename frontend/src/pages/{v2/ReservationStep2PageV21.tsx => ReservationStep2Page.tsx} (96%) rename frontend/src/pages/{v2/ReservationSuccessPageV21.tsx => ReservationSuccessPage.tsx} (88%) delete mode 100644 frontend/src/pages/admin/ReservationPage.tsx delete mode 100644 frontend/src/pages/admin/ThemePage.tsx delete mode 100644 frontend/src/pages/admin/TimePage.tsx delete mode 100644 frontend/src/pages/admin/WaitingPage.tsx delete mode 100644 frontend/src/pages/v2/HomePageV2.tsx delete mode 100644 frontend/src/pages/v2/LoginPageV2.tsx delete mode 100644 frontend/src/pages/v2/MyReservationPageV2.tsx delete mode 100644 frontend/src/pages/v2/ReservationStep1Page.tsx delete mode 100644 frontend/src/pages/v2/ReservationStep2Page.tsx delete mode 100644 frontend/src/pages/v2/ReservationSuccessPage.tsx delete mode 100644 frontend/src/pages/v2/SignupPageV2.tsx diff --git a/frontend/src/api/auth/authAPI.ts b/frontend/src/api/auth/authAPI.ts index a9f34dfd..30c9b215 100644 --- a/frontend/src/api/auth/authAPI.ts +++ b/frontend/src/api/auth/authAPI.ts @@ -1,19 +1,19 @@ import apiClient from '@_api/apiClient'; -import type { LoginRequest, LoginResponse, LoginCheckResponse } from './authTypes'; +import type { CurrentUserContext, LoginRequest, LoginSuccessResponse } from './authTypes'; -export const login = async (data: LoginRequest): Promise => { - const response = await apiClient.post('/login', data, false); +export const login = async (data: LoginRequest): Promise => { + const response = await apiClient.post('/auth/login', data, false); localStorage.setItem('accessToken', response.accessToken); return response; }; -export const checkLogin = async (): Promise => { - return await apiClient.get('/login/check', true); +export const checkLogin = async (): Promise => { + return await apiClient.get('/auth/login/check', true); }; export const logout = async (): Promise => { - await apiClient.post('/logout', {}, true); + await apiClient.post('/auth/logout', {}, true); localStorage.removeItem('accessToken'); }; diff --git a/frontend/src/api/auth/authTypes.ts b/frontend/src/api/auth/authTypes.ts index 6889425f..426168c4 100644 --- a/frontend/src/api/auth/authTypes.ts +++ b/frontend/src/api/auth/authTypes.ts @@ -1,14 +1,22 @@ +export const PrincipalType = { + ADMIN: 'ADMIN', + USER: 'USER', +} as const; + +export type PrincipalType = typeof PrincipalType[keyof typeof PrincipalType]; + export interface LoginRequest { - email: string; + account: string, password: string; + principalType: PrincipalType; } -export interface LoginResponse { +export interface LoginSuccessResponse { accessToken: string; } -export interface LoginCheckResponse { +export interface CurrentUserContext { + id: string; name: string; - role: 'ADMIN' | 'MEMBER'; + type: PrincipalType; } - diff --git a/frontend/src/api/member/memberAPI.ts b/frontend/src/api/member/memberAPI.ts deleted file mode 100644 index 219e7f3a..00000000 --- a/frontend/src/api/member/memberAPI.ts +++ /dev/null @@ -1,10 +0,0 @@ -import apiClient from "@_api/apiClient"; -import type { MemberRetrieveListResponse, SignupRequest, SignupResponse } from "./memberTypes"; - -export const fetchMembers = async (): Promise => { - return await apiClient.get('/members', true); -}; - -export const signup = async (data: SignupRequest): Promise => { - return await apiClient.post('/members', data, false); -}; diff --git a/frontend/src/api/member/memberTypes.ts b/frontend/src/api/member/memberTypes.ts deleted file mode 100644 index 6dc36555..00000000 --- a/frontend/src/api/member/memberTypes.ts +++ /dev/null @@ -1,25 +0,0 @@ -export interface MemberRetrieveResponse { - id: string; - name: string; -} - -export interface MemberRetrieveListResponse { - members: MemberRetrieveResponse[]; -} - -export interface SignupRequest { - email: string; - password: string; - name: string; -} - -export interface SignupResponse { - id: string; - name: string; -} - -export interface MemberSummaryRetrieveResponse { - id: string; - name: string; - email: string; -} diff --git a/frontend/src/api/payment/PaymentTypes.ts b/frontend/src/api/payment/PaymentTypes.ts index 93b015df..c35958ba 100644 --- a/frontend/src/api/payment/PaymentTypes.ts +++ b/frontend/src/api/payment/PaymentTypes.ts @@ -34,8 +34,8 @@ export interface PaymentRetrieveResponse { status: 'DONE' | 'CANCELED'; requestedAt: string; approvedAt: string; - detail: CardPaymentDetail | BankTransferPaymentDetail | EasyPayPrepaidPaymentDetail; - cancellation?: CanceledPaymentDetailResponse; + detail?: CardPaymentDetail | BankTransferPaymentDetail | EasyPayPrepaidPaymentDetail; + cancel?: CanceledPaymentDetailResponse; } export interface CardPaymentDetail { diff --git a/frontend/src/api/reservation/reservationAPI.ts b/frontend/src/api/reservation/reservationAPI.ts deleted file mode 100644 index ca370e74..00000000 --- a/frontend/src/api/reservation/reservationAPI.ts +++ /dev/null @@ -1,98 +0,0 @@ -import apiClient from "@_api/apiClient"; -import type { - AdminReservationCreateRequest, - MyReservationRetrieveListResponse, - ReservationCreateRequest, - ReservationCreateResponse, - ReservationCreateWithPaymentRequest, - ReservationDetailV2, - ReservationPaymentRequest, - ReservationPaymentResponse, - ReservationRetrieveListResponse, - ReservationRetrieveResponse, - ReservationSearchQuery, - ReservationSummaryListV2, - WaitingCreateRequest -} from "./reservationTypes"; - -// GET /reservations -export const fetchReservations = async (): Promise => { - return await apiClient.get('/reservations', true); -}; - -// GET /reservations-mine -export const fetchMyReservations = async (): Promise => { - return await apiClient.get('/reservations-mine', true); -}; - -// GET /reservations/search -export const searchReservations = async (params: ReservationSearchQuery): Promise => { - const query = new URLSearchParams(); - if (params.themeId) query.append('themeId', params.themeId.toString()); - if (params.memberId) query.append('memberId', params.memberId.toString()); - if (params.dateFrom) query.append('dateFrom', params.dateFrom); - if (params.dateTo) query.append('dateTo', params.dateTo); - return await apiClient.get(`/reservations/search?${query.toString()}`, true); -}; - -// DELETE /reservations/{id} -export const cancelReservationByAdmin = async (id: string): Promise => { - return await apiClient.del(`/reservations/${id}`, true); -}; - -// POST /reservations -export const createReservationWithPayment = async (data: ReservationCreateWithPaymentRequest): Promise => { - return await apiClient.post('/reservations', data, true); -}; - -// POST /reservations/admin -export const createReservationByAdmin = async (data: AdminReservationCreateRequest): Promise => { - return await apiClient.post('/reservations/admin', data, true); -}; - -// GET /reservations/waiting -export const fetchWaitingReservations = async (): Promise => { - return await apiClient.get('/reservations/waiting', true); -}; - -// POST /reservations/waiting -export const createWaiting = async (data: WaitingCreateRequest): Promise => { - return await apiClient.post('/reservations/waiting', data, true); -}; - -// DELETE /reservations/waiting/{id} -export const cancelWaiting = async (id: string): Promise => { - return await apiClient.del(`/reservations/waiting/${id}`, true); -}; - -// POST /reservations/waiting/{id}/confirm -export const confirmWaiting = async (id: string): Promise => { - return await apiClient.post(`/reservations/waiting/${id}/confirm`, {}, true); -}; - -// POST /reservations/waiting/{id}/reject -export const rejectWaiting = async (id: string): Promise => { - return await apiClient.post(`/reservations/waiting/${id}/reject`, {}, true); -}; - -// POST /v2/reservations -export const createPendingReservation = async (data: ReservationCreateRequest): Promise => { - return await apiClient.post('/v2/reservations', data, true); -}; - -// POST /v2/reservations/{id}/pay -export const confirmReservationPayment = async (id: string, data: ReservationPaymentRequest): Promise => { - return await apiClient.post(`/v2/reservations/${id}/pay`, data, true); -}; - - - -// GET /v2/reservations -export const fetchMyReservationsV2 = async (): Promise => { - return await apiClient.get('/v2/reservations', true); -}; - -// GET /v2/reservations/{id}/details -export const fetchReservationDetailV2 = async (id: string): Promise => { - return await apiClient.get(`/v2/reservations/${id}/details`, true); -}; \ No newline at end of file diff --git a/frontend/src/api/reservation/reservationTypes.ts b/frontend/src/api/reservation/reservationTypes.ts deleted file mode 100644 index 29d20a57..00000000 --- a/frontend/src/api/reservation/reservationTypes.ts +++ /dev/null @@ -1,135 +0,0 @@ -import type { MemberRetrieveResponse, MemberSummaryRetrieveResponse } from '@_api/member/memberTypes'; -import type { PaymentRetrieveResponse, PaymentType } from '@_api/payment/PaymentTypes'; -import type { ThemeRetrieveResponse } from '@_api/theme/themeTypes'; -import type { TimeRetrieveResponse } from '@_api/time/timeTypes'; - -export const ReservationStatus = { - PENDING: 'PENDING', - CONFIRMED: 'CONFIRMED', - CONFIRMED_PAYMENT_REQUIRED: 'CONFIRMED_PAYMENT_REQUIRED', - WAITING: 'WAITING', - CANCELED_BY_USER: 'CANCELED_BY_USER', - AUTOMATICALLY_CANCELED: 'AUTOMATICALLY_CANCELED' -} as const; - -export type ReservationStatus = - | typeof ReservationStatus.PENDING - | typeof ReservationStatus.CONFIRMED - | typeof ReservationStatus.CONFIRMED_PAYMENT_REQUIRED - | typeof ReservationStatus.WAITING - | typeof ReservationStatus.CANCELED_BY_USER - | typeof ReservationStatus.AUTOMATICALLY_CANCELED; - -export interface MyReservationRetrieveResponse { - id: string; - themeName: string; - date: string; - time: string; - status: ReservationStatus; - rank: number; - paymentKey: string | null; - amount: number | null; -} - -export interface MyReservationRetrieveListResponse { - reservations: MyReservationRetrieveResponse[]; -} - -export interface ReservationRetrieveResponse { - id: string; - date: string; - member: MemberRetrieveResponse; - time: TimeRetrieveResponse; - theme: ThemeRetrieveResponse; - status: ReservationStatus; -} - -export interface ReservationRetrieveListResponse { - reservations: ReservationRetrieveResponse[]; -} - -export interface AdminReservationCreateRequest { - date: string; - timeId: string; - themeId: string; - memberId: string; -} - -export interface ReservationCreateWithPaymentRequest { - date: string; - timeId: string; - themeId: string; - paymentKey: string; - orderId: string; - amount: number; - paymentType: string; -} - -export interface WaitingCreateRequest { - date: string; - timeId: string; - themeId: string; -} - -export interface ReservationSearchQuery { - themeId?: string; - memberId?: string; - dateFrom?: string; - dateTo?: string; -} - -export const PaymentStatus = { - IN_PROGRESS: '결제 진행 중', - DONE: '결제 완료', - CANCELED: '결제 취소', - ABORTED: '결제 중단', - EXPIRED: '시간 만료', -} - -export type PaymentStatus = - | typeof PaymentStatus.IN_PROGRESS - | typeof PaymentStatus.DONE - | typeof PaymentStatus.CANCELED - | typeof PaymentStatus.ABORTED - | typeof PaymentStatus.EXPIRED; - - -export interface ReservationCreateRequest { - date: string; - timeId: string; - themeId: string; -} - -export interface ReservationCreateResponse { - reservationId: string; - memberEmail: string; - date: string; - startAt: string; - themeName: string; -} - -export interface ReservationPaymentRequest { - paymentKey: string; - orderId: string; - amount: number; - paymentType: PaymentType; -} - -export interface ReservationPaymentResponse { - reservationId: string; - reservationStatus: ReservationStatus; - paymentId: string; - paymentStatus: PaymentStatus; -} - - - -export interface ReservationDetailV2 { - id: string; - user: MemberSummaryRetrieveResponse; - themeName: string; - date: string; - startAt: string; - applicationDateTime: string; - payment: PaymentRetrieveResponse; -} diff --git a/frontend/src/api/reservation/reservationTypesV2.ts b/frontend/src/api/reservation/reservationTypesV2.ts index e028fe4c..bc6eb4e9 100644 --- a/frontend/src/api/reservation/reservationTypesV2.ts +++ b/frontend/src/api/reservation/reservationTypesV2.ts @@ -1,5 +1,5 @@ -import type {MemberSummaryRetrieveResponse} from "@_api/member/memberTypes"; -import type {PaymentRetrieveResponse} from "@_api/payment/PaymentTypes"; +import type { PaymentRetrieveResponse } from "@_api/payment/PaymentTypes"; +import type { UserContactRetrieveResponse } from "@_api/user/userTypes"; export const ReservationStatusV2 = { PENDING: 'PENDING', @@ -42,7 +42,7 @@ export interface ReservationSummaryRetrieveListResponse { export interface ReservationDetailRetrieveResponse { id: string; - member: MemberSummaryRetrieveResponse; + user: UserContactRetrieveResponse; applicationDateTime: string; payment: PaymentRetrieveResponse; } @@ -52,8 +52,8 @@ export interface ReservationDetail { themeName: string; date: string; startAt: string; - member: MemberSummaryRetrieveResponse; - applicationDateTime: string; + user: UserContactRetrieveResponse; + applicationDateTime: string; payment: PaymentRetrieveResponse; } diff --git a/frontend/src/api/theme/themeTypes.ts b/frontend/src/api/theme/themeTypes.ts index aa022f84..7fe1327f 100644 --- a/frontend/src/api/theme/themeTypes.ts +++ b/frontend/src/api/theme/themeTypes.ts @@ -147,9 +147,16 @@ export interface ThemeRetrieveListResponseV2 { // @ts-ignore export enum Difficulty { - VERY_EASY = 'VERY_EASY', - EASY = 'EASY', - NORMAL = 'NORMAL', - HARD = 'HARD', - VERY_HARD = 'VERY_HARD', + VERY_EASY = '매우 쉬움', + EASY = '쉬움', + NORMAL = '보통', + HARD = '어려움', + VERY_HARD = '매우 어려움', +} + +export function mapThemeResponse(res: any): UserThemeRetrieveResponse { + return { + ...res, + difficulty: Difficulty[res.difficulty as keyof typeof Difficulty], + } } \ No newline at end of file diff --git a/frontend/src/api/time/timeAPI.ts b/frontend/src/api/time/timeAPI.ts deleted file mode 100644 index 656f90e9..00000000 --- a/frontend/src/api/time/timeAPI.ts +++ /dev/null @@ -1,18 +0,0 @@ -import apiClient from "@_api/apiClient"; -import type { TimeCreateRequest, TimeCreateResponse, TimeRetrieveListResponse, TimeWithAvailabilityListResponse } from "./timeTypes"; - -export const createTime = async (data: TimeCreateRequest): Promise => { - return await apiClient.post('/times', data, true); -} - -export const fetchTimes = async (): Promise => { - return await apiClient.get('/times', true); -}; - -export const delTime = async (id: string): Promise => { - return await apiClient.del(`/times/${id}`, true); -}; - -export const fetchTimesWithAvailability = async (date: string, themeId: string): Promise => { - return await apiClient.get(`/times/search?date=${date}&themeId=${themeId}`, true); -}; diff --git a/frontend/src/api/time/timeTypes.ts b/frontend/src/api/time/timeTypes.ts deleted file mode 100644 index acb7c350..00000000 --- a/frontend/src/api/time/timeTypes.ts +++ /dev/null @@ -1,27 +0,0 @@ -export interface TimeCreateRequest { - startAt: string; -} - -export interface TimeCreateResponse { - id: string; - startAt: string; -} - -export interface TimeRetrieveResponse { - id: string; - startAt: string; -} - -export interface TimeRetrieveListResponse { - times: TimeCreateResponse[]; -} - -export interface TimeWithAvailabilityResponse { - id: string; - startAt: string; - isAvailable: boolean; -} - -export interface TimeWithAvailabilityListResponse { - times: TimeWithAvailabilityResponse[]; -} \ No newline at end of file diff --git a/frontend/src/api/user/userAPI.ts b/frontend/src/api/user/userAPI.ts index 20b14d56..7388f7d7 100644 --- a/frontend/src/api/user/userAPI.ts +++ b/frontend/src/api/user/userAPI.ts @@ -1,6 +1,10 @@ import apiClient from "@_api/apiClient"; -import type { UserCreateRequest, UserCreateResponse } from "./userTypes"; +import type { UserContactRetrieveResponse, UserCreateRequest, UserCreateResponse } from "./userTypes"; export const signup = async (data: UserCreateRequest): Promise => { return await apiClient.post('/users', data, false); -}; \ No newline at end of file +}; + +export const fetchContact = async (): Promise => { + return await apiClient.get('/users/contact', true); +} diff --git a/frontend/src/api/user/userTypes.ts b/frontend/src/api/user/userTypes.ts index 94804f51..34a861e0 100644 --- a/frontend/src/api/user/userTypes.ts +++ b/frontend/src/api/user/userTypes.ts @@ -16,12 +16,17 @@ export interface UserCreateRequest { } export interface UserCreateResponse { - id: number; + id: string; name: string; } export interface UserContactRetrieveResponse { - id: number; + id: string; name: string; phone: string; } + +export interface OperatorInfo { + id: string; + name: string; +} diff --git a/frontend/src/components/Navbar.tsx b/frontend/src/components/Navbar.tsx index 82168dba..ceff4b6d 100644 --- a/frontend/src/components/Navbar.tsx +++ b/frontend/src/components/Navbar.tsx @@ -21,20 +21,20 @@ const Navbar: React.FC = () => {