# Content API ๋ณ€๊ฒฝ์‚ฌํ•ญ ## ๐Ÿ“‹ ์ฃผ์š” ๋ณ€๊ฒฝ์‚ฌํ•ญ ์š”์•ฝ ### 1. **eventDraftId โ†’ eventId ํƒ€์ž… ๋ณ€๊ฒฝ** | ํ•ญ๋ชฉ | ๊ธฐ์กด (Old) | ๋ณ€๊ฒฝ (New) | |------|-----------|-----------| | ํ•„๋“œ๋ช… | `eventDraftId` | `eventId` | | ํƒ€์ž… | `number` | `string` | | ์˜ˆ์‹œ | `7777` | `"7777"` | --- ## ๐Ÿ”„ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ์ธํ„ฐํŽ˜์ด์Šค ### GenerateImagesRequest **Before:** ```typescript interface GenerateImagesRequest { eventDraftId: number; eventTitle: string; eventDescription: string; industry?: string; location?: string; trends?: string[]; styles: ('SIMPLE' | 'FANCY' | 'TRENDY')[]; platforms: ('INSTAGRAM' | 'NAVER' | 'KAKAO')[]; } ``` **After:** ```typescript interface GenerateImagesRequest { eventId: string; // Changed from eventDraftId: number eventTitle: string; eventDescription: string; industry?: string; location?: string; trends?: string[]; styles: ('SIMPLE' | 'FANCY' | 'TRENDY')[]; platforms: ('INSTAGRAM' | 'NAVER' | 'KAKAO')[]; } ``` ### JobInfo **Before:** ```typescript interface JobInfo { id: string; eventDraftId: number; jobType: string; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED'; progress: number; resultMessage?: string; errorMessage?: string; createdAt: string; updatedAt: string; } ``` **After:** ```typescript interface JobInfo { id: string; eventId: string; // Changed from eventDraftId: number jobType: string; status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED'; progress: number; resultMessage?: string; errorMessage?: string; createdAt: string; updatedAt: string; } ``` ### ImageInfo **Before:** ```typescript interface ImageInfo { id: number; eventDraftId: number; style: 'SIMPLE' | 'FANCY' | 'TRENDY'; platform: 'INSTAGRAM' | 'NAVER' | 'KAKAO'; cdnUrl: string; prompt: string; selected: boolean; createdAt: string; updatedAt: string; } ``` **After:** ```typescript interface ImageInfo { id: number; eventId: string; // Changed from eventDraftId: number style: 'SIMPLE' | 'FANCY' | 'TRENDY'; platform: 'INSTAGRAM' | 'NAVER' | 'KAKAO'; cdnUrl: string; prompt: string; selected: boolean; createdAt: string; updatedAt: string; } ``` ### ContentInfo **Before:** ```typescript interface ContentInfo { id: number; eventDraftId: number; eventTitle: string; eventDescription: string; images: ImageInfo[]; createdAt: string; updatedAt: string; } ``` **After:** ```typescript interface ContentInfo { id: number; eventId: string; // Changed from eventDraftId: number eventTitle: string; eventDescription: string; images: ImageInfo[]; createdAt: string; updatedAt: string; } ``` --- ## ๐Ÿ“ ์ˆ˜์ •๋œ ํŒŒ์ผ ๋ชฉ๋ก ### 1. Type Definitions - โœ… `src/shared/api/contentApi.ts` - `GenerateImagesRequest` interface updated - `JobInfo` interface updated - `ImageInfo` interface updated - `ContentInfo` interface updated - API function signatures updated ### 2. Components - โœ… `src/app/(main)/events/create/steps/ContentPreviewStep.tsx` - `EventCreationData` interface: `eventDraftId: number` โ†’ `eventDraftId: string` - Mock data updated to use string type - API call updated: `eventDraftId` โ†’ `eventId` ### 3. Mock Data Files - โœ… `public/init-mock-data.html` - `eventDraftId: 7777` โ†’ `eventDraftId: "7777"` - โœ… `MOCK_DATA_SETUP.md` - All mock data examples updated to string type - Documentation notes added about type change ### 4. API Routes (Next.js Proxy) - โœ… `src/app/api/content/images/generate/route.ts` (no changes needed) - โœ… `src/app/api/content/images/jobs/[jobId]/route.ts` (no changes needed) - โœ… `src/app/api/content/events/[eventDraftId]/images/route.ts` - Comment added about eventId parameter --- ## ๐Ÿงช ํ…Œ์ŠคํŠธ ์˜ˆ์‹œ ### API ์š”์ฒญ ์˜ˆ์‹œ **Before:** ```json POST /api/v1/content/images/generate { "eventDraftId": 7777, "eventTitle": "๋งฅ์ฃผ ํŒŒํ‹ฐ ์ด๋ฒคํŠธ", "eventDescription": "๊ฐ•๋‚จ์—์„œ ์—ด๋ฆฌ๋Š” ์‹ ๋‚˜๋Š” ๋งฅ์ฃผ ํŒŒํ‹ฐ", "industry": "์Œ์‹์ ", "location": "๊ฐ•๋‚จ", "trends": ["ํŒŒํ‹ฐ", "๋งฅ์ฃผ", "์ƒ๋งฅ์ฃผ"], "styles": ["SIMPLE", "FANCY", "TRENDY"], "platforms": ["INSTAGRAM"] } ``` **After:** ```json POST /api/v1/content/images/generate { "eventId": "7777", "eventTitle": "๋งฅ์ฃผ ํŒŒํ‹ฐ ์ด๋ฒคํŠธ", "eventDescription": "๊ฐ•๋‚จ์—์„œ ์—ด๋ฆฌ๋Š” ์‹ ๋‚˜๋Š” ๋งฅ์ฃผ ํŒŒํ‹ฐ", "industry": "์Œ์‹์ ", "location": "๊ฐ•๋‚จ", "trends": ["ํŒŒํ‹ฐ", "๋งฅ์ฃผ", "์ƒ๋งฅ์ฃผ"], "styles": ["SIMPLE", "FANCY", "TRENDY"], "platforms": ["INSTAGRAM"] } ``` ### localStorage Mock ๋ฐ์ดํ„ฐ **Before:** ```javascript localStorage.setItem('eventCreationData', JSON.stringify({ eventDraftId: 7777, eventTitle: "๋งฅ์ฃผ ํŒŒํ‹ฐ ์ด๋ฒคํŠธ", // ... })); ``` **After:** ```javascript localStorage.setItem('eventCreationData', JSON.stringify({ eventDraftId: "7777", // String type now eventTitle: "๋งฅ์ฃผ ํŒŒํ‹ฐ ์ด๋ฒคํŠธ", // ... })); ``` --- ## โœ… ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ฒดํฌ๋ฆฌ์ŠคํŠธ - [x] TypeScript ์ธํ„ฐํŽ˜์ด์Šค ์—…๋ฐ์ดํŠธ - [x] API ํ˜ธ์ถœ ์ฝ”๋“œ ์ˆ˜์ • - [x] Mock ๋ฐ์ดํ„ฐ ํƒ€์ž… ๋ณ€๊ฒฝ - [x] ๋ฌธ์„œ ์—…๋ฐ์ดํŠธ - [x] ๋นŒ๋“œ ์„ฑ๊ณต ํ™•์ธ - [ ] ๊ฐœ๋ฐœ ์„œ๋ฒ„ ํ…Œ์ŠคํŠธ - [ ] ์‹ค์ œ API ์—ฐ๋™ ํ…Œ์ŠคํŠธ --- ## ๐Ÿ”— ๊ด€๋ จ API ๋ฌธ์„œ - Swagger UI: http://localhost:8084/swagger-ui/index.html - OpenAPI Spec: http://localhost:8084/v3/api-docs --- ## ๐Ÿ“Œ ์ฃผ์˜์‚ฌํ•ญ 1. **ํƒ€์ž… ์ฃผ์˜**: `eventId`๋Š” ์ด์ œ `string` ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ์ˆซ์ž๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”. 2. **Mock ๋ฐ์ดํ„ฐ**: localStorage์— ์ €์žฅํ•  ๋•Œ ๋ฌธ์ž์—ด ํƒ€์ž…์œผ๋กœ ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 3. **API ํ˜ธ์ถœ**: ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ๋ฐฑ์—”๋“œ๋กœ ์ „์†ก ์‹œ string์œผ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. 4. **ํ•˜์œ„ ํ˜ธํ™˜์„ฑ**: ๊ธฐ์กด number ํƒ€์ž… ๋ฐ์ดํ„ฐ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ localStorage๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. --- ## ๐Ÿ”„ ๋กค๋ฐฑ ๋ฐฉ๋ฒ• ๋งŒ์•ฝ ์ด์ „ ๋ฒ„์ „์œผ๋กœ ๋Œ์•„๊ฐ€์•ผ ํ•œ๋‹ค๋ฉด: 1. `git revert` ๋˜๋Š” ํŠน์ • ์ปค๋ฐ‹์œผ๋กœ ๋ณต์› 2. localStorage ์ดˆ๊ธฐํ™”: `localStorage.removeItem('eventCreationData')` 3. ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์žฌ์‹œ์ž‘