diff --git a/frontend/eslint.config.js b/frontend/eslint.config.js index d94e7deb..02c76837 100644 --- a/frontend/eslint.config.js +++ b/frontend/eslint.config.js @@ -3,7 +3,7 @@ import globals from 'globals' import reactHooks from 'eslint-plugin-react-hooks' import reactRefresh from 'eslint-plugin-react-refresh' import tseslint from 'typescript-eslint' -import { globalIgnores } from 'eslint/config' +import {globalIgnores} from 'eslint/config' export default tseslint.config([ globalIgnores(['dist']), diff --git a/frontend/public/vite.svg b/frontend/public/vite.svg index e7b8dfb1..3f42576c 100644 --- a/frontend/public/vite.svg +++ b/frontend/public/vite.svg @@ -1 +1,2 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index b95ec603..44f1900c 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -1,41 +1,27 @@ -import { BrowserRouter as Router, Route, Routes } from 'react-router-dom'; +import {BrowserRouter as Router, Route, Routes} from 'react-router-dom'; +import AdminRoute from './components/AdminRoute'; import Layout from './components/Layout'; -import HomePage from './pages/HomePage'; -import LoginPage from './pages/LoginPage'; -import SignupPage from './pages/SignupPage'; -import ReservationPage from './pages/ReservationPage'; -import MyReservationPage from './pages/MyReservationPage'; +import {AuthProvider} from './context/AuthContext'; import AdminLayout from './pages/admin/AdminLayout'; import AdminPage from './pages/admin/AdminPage'; -import AdminReservationPage from './pages/admin/ReservationPage'; -import AdminTimePage from './pages/admin/TimePage'; -import AdminThemePage from './pages/admin/ThemePage'; -import AdminWaitingPage from './pages/admin/WaitingPage'; -import { AuthProvider } from './context/AuthContext'; -import AdminRoute from './components/AdminRoute'; -import ReservationStep1Page from './pages/v2/ReservationStep1Page'; -import ReservationStep2Page from './pages/v2/ReservationStep2Page'; -import ReservationSuccessPage from './pages/v2/ReservationSuccessPage'; -import MyReservationPageV2 from './pages/v2/MyReservationPageV2'; -import ReservationStep1PageV21 from './pages/v2/ReservationStep1PageV21'; -import ReservationStep2PageV21 from './pages/v2/ReservationStep2PageV21'; -import ReservationSuccessPageV21 from './pages/v2/ReservationSuccessPageV21'; -import HomePageV2 from './pages/v2/HomePageV2'; -import LoginPageV2 from './pages/v2/LoginPageV2'; -import SignupPageV2 from './pages/v2/SignupPageV2'; -import ReservationFormPage from './pages/v2/ReservationFormPage'; -import AdminThemeEditPage from './pages/admin/AdminThemeEditPage'; import AdminSchedulePage from './pages/admin/AdminSchedulePage'; +import AdminThemeEditPage from './pages/admin/AdminThemeEditPage'; +import AdminThemePage from './pages/admin/AdminThemePage'; +import HomePage from '@_pages/HomePage'; +import LoginPage from '@_pages/LoginPage'; +import MyReservationPage from '@_pages/MyReservationPage'; +import ReservationFormPage from '@_pages/ReservationFormPage'; +import ReservationStep1Page from '@_pages/ReservationStep1Page'; +import ReservationStep2Page from '@_pages/ReservationStep2Page'; +import ReservationSuccessPage from '@_pages/ReservationSuccessPage'; +import SignupPage from '@_pages/SignupPage'; const AdminRoutes = () => ( } /> - } /> - } /> } /> } /> - } /> } /> @@ -54,28 +40,14 @@ function App() { - } /> + } /> } /> } /> - } /> + } /> + } /> + } /> + } /> } /> - } /> - - {/* V2 Pages */} - } /> - } /> - } /> - - {/* V2 Reservation Flow */} - } /> - } /> - } /> - - {/* V2.1 Reservation Flow */} - } /> - } /> - } /> - } /> } /> diff --git a/frontend/src/api/apiClient.ts b/frontend/src/api/apiClient.ts index 243b84ae..5871ff7f 100644 --- a/frontend/src/api/apiClient.ts +++ b/frontend/src/api/apiClient.ts @@ -1,4 +1,4 @@ -import axios, { type AxiosError, type AxiosRequestConfig, type Method } from 'axios'; +import axios, {type AxiosError, type AxiosRequestConfig, type Method} from 'axios'; import JSONbig from 'json-bigint'; // Create a JSONbig instance that stores big integers as strings diff --git a/frontend/src/api/auth/authAPI.ts b/frontend/src/api/auth/authAPI.ts index a9f34dfd..93216199 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/payment/paymentAPI.ts b/frontend/src/api/payment/paymentAPI.ts index c5481ec8..d2923e0b 100644 --- a/frontend/src/api/payment/paymentAPI.ts +++ b/frontend/src/api/payment/paymentAPI.ts @@ -1,5 +1,5 @@ import apiClient from "@_api/apiClient"; -import type { PaymentCancelRequest, PaymentConfirmRequest, PaymentCreateResponseV2 } from "./PaymentTypes"; +import type {PaymentCancelRequest, PaymentConfirmRequest, PaymentCreateResponseV2} from "./PaymentTypes"; export const confirmPayment = async (reservationId: string, request: PaymentConfirmRequest): Promise => { return await apiClient.post(`/payments?reservationId=${reservationId}`, request); diff --git a/frontend/src/api/reservation/reservationAPI.ts b/frontend/src/api/reservation/reservationAPI.ts index ca370e74..f2a80d5e 100644 --- a/frontend/src/api/reservation/reservationAPI.ts +++ b/frontend/src/api/reservation/reservationAPI.ts @@ -1,98 +1,33 @@ -import apiClient from "@_api/apiClient"; +import apiClient from '../apiClient'; import type { - AdminReservationCreateRequest, - MyReservationRetrieveListResponse, - ReservationCreateRequest, - ReservationCreateResponse, - ReservationCreateWithPaymentRequest, - ReservationDetailV2, - ReservationPaymentRequest, - ReservationPaymentResponse, - ReservationRetrieveListResponse, - ReservationRetrieveResponse, - ReservationSearchQuery, - ReservationSummaryListV2, - WaitingCreateRequest -} from "./reservationTypes"; + MostReservedThemeIdListResponse, + PendingReservationCreateRequest, + PendingReservationCreateResponse, + ReservationDetailRetrieveResponse, + ReservationSummaryRetrieveListResponse +} from './reservationTypes'; -// GET /reservations -export const fetchReservations = async (): Promise => { - return await apiClient.get('/reservations', true); +export const createPendingReservation = async (request: PendingReservationCreateRequest): Promise => { + return await apiClient.post('/reservations/pending', request); }; -// 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); +export const confirmReservation = async (reservationId: string): Promise => { + await apiClient.post(`/reservations/${reservationId}/confirm`, {}); }; - -// GET /v2/reservations -export const fetchMyReservationsV2 = async (): Promise => { - return await apiClient.get('/v2/reservations', true); +export const cancelReservation = async (id: string, cancelReason: string): Promise => { + return await apiClient.post(`/reservations/${id}/cancel`, { cancelReason }, 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 +export const fetchSummaryByMember = async (): Promise => { + return await apiClient.get('/reservations/summary'); +} + +export const fetchDetailById = async (reservationId: string): Promise => { + return await apiClient.get(`/reservations/${reservationId}/detail`); +} + +export const fetchMostReservedThemeIds = async (count: number = 10): Promise => { + return await apiClient.get(`/reservations/popular-themes?count=${count}`, false); +} \ No newline at end of file diff --git a/frontend/src/api/reservation/reservationAPIV2.ts b/frontend/src/api/reservation/reservationAPIV2.ts deleted file mode 100644 index 01992108..00000000 --- a/frontend/src/api/reservation/reservationAPIV2.ts +++ /dev/null @@ -1,23 +0,0 @@ -import apiClient from '../apiClient'; -import type { PendingReservationCreateRequest, PendingReservationCreateResponse, ReservationDetailRetrieveResponse, ReservationSummaryRetrieveListResponse } from './reservationTypesV2'; - -export const createPendingReservation = async (request: PendingReservationCreateRequest): Promise => { - return await apiClient.post('/reservations/pending', request); -}; - -export const confirmReservation = async (reservationId: string): Promise => { - await apiClient.post(`/reservations/${reservationId}/confirm`, {}); -}; - - -export const cancelReservation = async (id: string, cancelReason: string): Promise => { - return await apiClient.post(`/reservations/${id}/cancel`, { cancelReason }, true); -}; - -export const fetchSummaryByMember = async (): Promise => { - return await apiClient.get('/reservations/summary'); -} - -export const fetchDetailById = async (reservationId: string): Promise => { - return await apiClient.get(`/reservations/${reservationId}/detail`); -} diff --git a/frontend/src/api/reservation/reservationTypes.ts b/frontend/src/api/reservation/reservationTypes.ts index 29d20a57..5c19d21a 100644 --- a/frontend/src/api/reservation/reservationTypes.ts +++ b/frontend/src/api/reservation/reservationTypes.ts @@ -1,135 +1,62 @@ -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'; +import type {PaymentRetrieveResponse} from "@_api/payment/PaymentTypes"; +import type {UserContactRetrieveResponse} from "@_api/user/userTypes"; 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' + CANCELED: 'CANCELED', + FAILED: 'FAILED', + EXPIRED: 'EXPIRED' } 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; + | typeof ReservationStatus.CANCELED + | typeof ReservationStatus.FAILED + | typeof ReservationStatus.EXPIRED; -export interface MyReservationRetrieveResponse { - id: string; - themeName: string; - date: string; - time: string; - status: ReservationStatus; - rank: number; - paymentKey: string | null; - amount: number | null; +export interface PendingReservationCreateRequest { + scheduleId: string, + reserverName: string, + reserverContact: string, + participantCount: number, + requirement: string } -export interface MyReservationRetrieveListResponse { - reservations: MyReservationRetrieveResponse[]; +export interface PendingReservationCreateResponse { + id: string } -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 { +export interface ReservationSummaryRetrieveResponse { id: string; - user: MemberSummaryRetrieveResponse; themeName: string; date: string; startAt: string; - applicationDateTime: string; - payment: PaymentRetrieveResponse; + status: ReservationStatus; } + +export interface ReservationSummaryRetrieveListResponse { + reservations: ReservationSummaryRetrieveResponse[]; +} + +export interface ReservationDetailRetrieveResponse { + id: string; + user: UserContactRetrieveResponse; + applicationDateTime: string; + payment: PaymentRetrieveResponse; +} + +export interface ReservationDetail { + id: string; + themeName: string; + date: string; + startAt: string; + user: UserContactRetrieveResponse; + applicationDateTime: string; + payment?: PaymentRetrieveResponse; +} + +export interface MostReservedThemeIdListResponse { + themeIds: string[]; +} \ No newline at end of file diff --git a/frontend/src/api/reservation/reservationTypesV2.ts b/frontend/src/api/reservation/reservationTypesV2.ts deleted file mode 100644 index 3dc595fa..00000000 --- a/frontend/src/api/reservation/reservationTypesV2.ts +++ /dev/null @@ -1,58 +0,0 @@ -import type { MemberSummaryRetrieveResponse } from "@_api/member/memberTypes"; -import type { PaymentRetrieveResponse } from "@_api/payment/PaymentTypes"; - -export const ReservationStatusV2 = { - PENDING: 'PENDING', - CONFIRMED: 'CONFIRMED', - CANCELED: 'CANCELED', - FAILED: 'FAILED', - EXPIRED: 'EXPIRED' -} as const; - -export type ReservationStatusV2 = - | typeof ReservationStatusV2.PENDING - | typeof ReservationStatusV2.CONFIRMED - | typeof ReservationStatusV2.CANCELED - | typeof ReservationStatusV2.FAILED - | typeof ReservationStatusV2.EXPIRED; - -export interface PendingReservationCreateRequest { - scheduleId: string, - reserverName: string, - reserverContact: string, - participantCount: number, - requirement: string -} - -export interface PendingReservationCreateResponse { - id: string -} - -export interface ReservationSummaryRetrieveResponse { - id: string; - themeName: string; - date: string; - startAt: string; - status: ReservationStatusV2; -} - -export interface ReservationSummaryRetrieveListResponse { - reservations: ReservationSummaryRetrieveResponse[]; -} - -export interface ReservationDetailRetrieveResponse { - id: string; - member: MemberSummaryRetrieveResponse; - applicationDateTime: string; - payment: PaymentRetrieveResponse; -} - -export interface ReservationDetail { - id: string; - themeName: string; - date: string; - startAt: string; - member: MemberSummaryRetrieveResponse; - applicationDateTime: string; - payment: PaymentRetrieveResponse; -} diff --git a/frontend/src/api/schedule/scheduleAPI.ts b/frontend/src/api/schedule/scheduleAPI.ts index f828fa2b..87d7d0ac 100644 --- a/frontend/src/api/schedule/scheduleAPI.ts +++ b/frontend/src/api/schedule/scheduleAPI.ts @@ -2,7 +2,8 @@ import apiClient from '../apiClient'; import type { AvailableThemeIdListResponse, ScheduleCreateRequest, - ScheduleCreateResponse, ScheduleDetailRetrieveResponse, + ScheduleCreateResponse, + ScheduleDetailRetrieveResponse, ScheduleRetrieveListResponse, ScheduleUpdateRequest } from './scheduleTypes'; diff --git a/frontend/src/api/schedule/scheduleTypes.ts b/frontend/src/api/schedule/scheduleTypes.ts index 6230cf01..9a08ac1e 100644 --- a/frontend/src/api/schedule/scheduleTypes.ts +++ b/frontend/src/api/schedule/scheduleTypes.ts @@ -1,9 +1,11 @@ -export enum ScheduleStatus { - AVAILABLE = 'AVAILABLE', - HOLD = 'HOLD', - RESERVED = 'RESERVED', - BLOCKED = 'BLOCKED', -} +export type ScheduleStatus = 'AVAILABLE' | 'HOLD' | 'RESERVED' | 'BLOCKED'; + +export const ScheduleStatus = { + AVAILABLE: 'AVAILABLE' as ScheduleStatus, + HOLD: 'HOLD' as ScheduleStatus, + RESERVED: 'RESERVED' as ScheduleStatus, + BLOCKED: 'BLOCKED' as ScheduleStatus, +}; export interface AvailableThemeIdListResponse { themeIds: string[]; diff --git a/frontend/src/api/theme/themeAPI.ts b/frontend/src/api/theme/themeAPI.ts index 1c7566ca..3db475d2 100644 --- a/frontend/src/api/theme/themeAPI.ts +++ b/frontend/src/api/theme/themeAPI.ts @@ -3,29 +3,12 @@ import type { AdminThemeDetailRetrieveResponse, AdminThemeSummaryRetrieveListResponse, ThemeCreateRequest, - ThemeCreateRequestV2, ThemeCreateResponse, - ThemeCreateResponseV2, ThemeListRetrieveRequest, ThemeRetrieveListResponse, - ThemeRetrieveListResponseV2, - ThemeUpdateRequest, - UserThemeRetrieveListResponse + ThemeCreateResponse, + ThemeIdListResponse, + ThemeInfoListResponse, + ThemeUpdateRequest } from './themeTypes'; -export const createTheme = async (data: ThemeCreateRequest): Promise => { - return await apiClient.post('/themes', data, true); -}; - -export const fetchThemes = async (): Promise => { - return await apiClient.get('/themes', true); -}; - -export const mostReservedThemes = async (count: number = 10): Promise => { - return await apiClient.get(`/themes/most-reserved-last-week?count=${count}`, false); -}; - -export const delTheme = async (id: string): Promise => { - return await apiClient.del(`/themes/${id}`, true); -}; - export const fetchAdminThemes = async (): Promise => { return await apiClient.get('/admin/themes'); }; @@ -34,8 +17,8 @@ export const fetchAdminThemeDetail = async (id: string): Promise(`/admin/themes/${id}`); }; -export const createThemeV2 = async (themeData: ThemeCreateRequestV2): Promise => { - return await apiClient.post('/admin/themes', themeData); +export const createTheme = async (themeData: ThemeCreateRequest): Promise => { + return await apiClient.post('/admin/themes', themeData); }; export const updateTheme = async (id: string, themeData: ThemeUpdateRequest): Promise => { @@ -46,10 +29,10 @@ export const deleteTheme = async (id: string): Promise => { await apiClient.del(`/admin/themes/${id}`); }; -export const fetchUserThemes = async (): Promise => { - return await apiClient.get('/v2/themes'); +export const fetchUserThemes = async (): Promise => { + return await apiClient.get('/themes'); }; -export const findThemesByIds = async (request: ThemeListRetrieveRequest): Promise => { - return await apiClient.post('/themes/retrieve', request); +export const findThemesByIds = async (request: ThemeIdListResponse): Promise => { + return await apiClient.post('/themes/retrieve', request); }; diff --git a/frontend/src/api/theme/themeTypes.ts b/frontend/src/api/theme/themeTypes.ts index aa022f84..ba28bc0d 100644 --- a/frontend/src/api/theme/themeTypes.ts +++ b/frontend/src/api/theme/themeTypes.ts @@ -1,29 +1,4 @@ -export interface ThemeCreateRequest { - name: string; - description: string; - thumbnail: string; -} - -export interface ThemeCreateResponse { - id: string; - name: string; - description: string; - thumbnail: string; -} - -export interface ThemeRetrieveResponse { - id: string; - name: string; - description: string; - thumbnail: string; -} - -export interface ThemeRetrieveListResponse { - themes: ThemeRetrieveResponse[]; -} - - -export interface ThemeV2 { +export interface AdminThemeDetailResponse { id: string; name: string; description: string; @@ -42,7 +17,7 @@ export interface ThemeV2 { updatedBy: string; } -export interface ThemeCreateRequestV2 { +export interface ThemeCreateRequest { name: string; description: string; thumbnailUrl: string; @@ -56,7 +31,7 @@ export interface ThemeCreateRequestV2 { isOpen: boolean; } -export interface ThemeCreateResponseV2 { +export interface ThemeCreateResponse { id: string; } @@ -105,7 +80,7 @@ export interface AdminThemeDetailRetrieveResponse { updatedBy: string; } -export interface UserThemeRetrieveResponse { +export interface ThemeInfoResponse { id: string; name: string; thumbnailUrl: string; @@ -119,37 +94,26 @@ export interface UserThemeRetrieveResponse { expectedMinutesTo: number; } -export interface UserThemeRetrieveListResponse { - themes: UserThemeRetrieveResponse[]; +export interface ThemeInfoListResponse { + themes: ThemeInfoResponse[]; } -export interface ThemeListRetrieveRequest { +export interface ThemeIdListResponse { themeIds: string[]; } -export interface ThemeRetrieveResponseV2 { - id: string; - name: string; - thumbnailUrl: string; - description: string; - difficulty: Difficulty; - price: number; - minParticipants: number; - maxParticipants: number; - availableMinutes: number; - expectedMinutesFrom: number; - expectedMinutesTo: number; -} - -export interface ThemeRetrieveListResponseV2 { - themes: ThemeRetrieveResponseV2[]; -} - // @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): ThemeInfoResponse { + 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 new file mode 100644 index 00000000..84a2422d --- /dev/null +++ b/frontend/src/api/user/userAPI.ts @@ -0,0 +1,10 @@ +import apiClient from "@_api/apiClient"; +import type {UserContactRetrieveResponse, UserCreateRequest, UserCreateResponse} from "./userTypes"; + +export const signup = async (data: UserCreateRequest): Promise => { + return await apiClient.post('/users', data, false); +}; + +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 new file mode 100644 index 00000000..34a861e0 --- /dev/null +++ b/frontend/src/api/user/userTypes.ts @@ -0,0 +1,32 @@ +export interface UserCreateRequest { + /** not empty */ + name: string; + + /** not empty, email format */ + email: string; + + /** length >= 8 */ + password: string; + + /** not empty, pattern: ^010([0-9]{3,4})([0-9]{4})$ */ + phone: string; + + /** nullable */ + regionCode?: string | null; +} + +export interface UserCreateResponse { + id: string; + name: string; +} + +export interface UserContactRetrieveResponse { + id: string; + name: string; + phone: string; +} + +export interface OperatorInfo { + id: string; + name: string; +} diff --git a/frontend/src/assets/react.svg b/frontend/src/assets/react.svg index 6c87de9b..df634bcc 100644 --- a/frontend/src/assets/react.svg +++ b/frontend/src/assets/react.svg @@ -1 +1,2 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/frontend/src/components/AdminRoute.tsx b/frontend/src/components/AdminRoute.tsx index e8354014..c238090d 100644 --- a/frontend/src/components/AdminRoute.tsx +++ b/frontend/src/components/AdminRoute.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { Navigate, useLocation } from 'react-router-dom'; -import { useAuth } from '../context/AuthContext'; +import {Navigate, useLocation} from 'react-router-dom'; +import {useAuth} from '../context/AuthContext'; const AdminRoute: React.FC<{ children: JSX.Element }> = ({ children }) => { const { loggedIn, role, loading } = useAuth(); diff --git a/frontend/src/components/Layout.tsx b/frontend/src/components/Layout.tsx index e4440f76..5064a970 100644 --- a/frontend/src/components/Layout.tsx +++ b/frontend/src/components/Layout.tsx @@ -1,4 +1,4 @@ -import React, { type ReactNode } from 'react'; +import React, {type ReactNode} from 'react'; import Navbar from './Navbar'; interface LayoutProps { diff --git a/frontend/src/components/Navbar.tsx b/frontend/src/components/Navbar.tsx index 82168dba..8de67e34 100644 --- a/frontend/src/components/Navbar.tsx +++ b/frontend/src/components/Navbar.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { Link, useNavigate } from 'react-router-dom'; -import { useAuth } from 'src/context/AuthContext'; +import {Link, useNavigate} from 'react-router-dom'; +import {useAuth} from 'src/context/AuthContext'; import 'src/css/navbar.css'; const Navbar: React.FC = () => { @@ -21,20 +21,20 @@ const Navbar: React.FC = () => {