daiso 1.0.3 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +218 -537
- package/dist/api/actionsProxy.js +82 -0
- package/dist/api/cgvHandlers.js +103 -16
- package/dist/api/daisoHandlers.js +127 -0
- package/dist/api/emart24Handlers.js +176 -0
- package/dist/api/gs25Handlers.js +256 -0
- package/dist/api/handlers.js +184 -108
- package/dist/api/healthChecks.js +332 -0
- package/dist/api/lottecinemaHandlers.js +155 -0
- package/dist/api/lottemartHandlers.js +128 -0
- package/dist/api/megaboxHandlers.js +81 -50
- package/dist/api/routes/cuRoutes.js +17 -0
- package/dist/api/routes/daisoRoutes.js +6 -1
- package/dist/api/routes/emart24Routes.js +22 -0
- package/dist/api/routes/gs25Routes.js +22 -0
- package/dist/api/routes/healthRoutes.js +44 -0
- package/dist/api/routes/lottecinemaRoutes.js +22 -0
- package/dist/api/routes/lottemartRoutes.js +18 -0
- package/dist/api/routes/oliveyoungRoutes.js +6 -1
- package/dist/api/routes/sevenelevenRoutes.js +32 -0
- package/dist/api/sevenelevenHandlers.js +200 -0
- package/dist/cli/args.js +54 -0
- package/dist/cli/commands/convenience.js +241 -0
- package/dist/cli/commands/daiso.js +96 -0
- package/dist/cli/constants.js +5 -0
- package/dist/cli/deps.js +48 -0
- package/dist/cli/http.js +98 -0
- package/dist/cli/interactiveFetch.js +31 -0
- package/dist/cli/interactiveItemSearch.js +259 -0
- package/dist/cli/interactivePrompt.js +49 -0
- package/dist/cli/interactiveTypes.js +4 -0
- package/dist/cli/types.js +4 -0
- package/dist/cli.js +66 -181
- package/dist/cliHelp.js +216 -9
- package/dist/cliInteractive.js +174 -0
- package/dist/cliPicker.js +56 -0
- package/dist/cliRenderer.js +139 -0
- package/dist/index.js +147 -8
- package/dist/pages/openapi.js +2 -1
- package/dist/pages/openapiFullSpec.js +58 -0
- package/dist/pages/openapiResponse.js +28 -0
- package/dist/pages/openapiSpec.js +2 -41
- package/dist/pages/openapiSpecActions.js +109 -0
- package/dist/pages/openapiSpecComponents.js +30 -391
- package/dist/pages/openapiSpecComponentsCgv.js +24 -0
- package/dist/pages/openapiSpecComponentsCu.js +112 -0
- package/dist/pages/openapiSpecComponentsDaisoOliveyoung.js +342 -0
- package/dist/pages/openapiSpecComponentsEmart24.js +141 -0
- package/dist/pages/openapiSpecComponentsGs25.js +109 -0
- package/dist/pages/openapiSpecComponentsLotteMart.js +85 -0
- package/dist/pages/openapiSpecComponentsLottecinema.js +163 -0
- package/dist/pages/openapiSpecComponentsMegabox.js +144 -0
- package/dist/pages/openapiSpecComponentsSeveneleven.js +82 -0
- package/dist/pages/openapiSpecPathsCgv.js +66 -3
- package/dist/pages/openapiSpecPathsCu.js +138 -0
- package/dist/pages/openapiSpecPathsDaiso.js +302 -0
- package/dist/pages/openapiSpecPathsDaisoOliveyoung.js +4 -376
- package/dist/pages/openapiSpecPathsEmart24.js +223 -0
- package/dist/pages/openapiSpecPathsGs25.js +166 -0
- package/dist/pages/openapiSpecPathsLotteMart.js +135 -0
- package/dist/pages/openapiSpecPathsLottecinema.js +212 -0
- package/dist/pages/openapiSpecPathsMegabox.js +52 -3
- package/dist/pages/openapiSpecPathsOliveyoung.js +231 -0
- package/dist/pages/openapiSpecPathsSeveneleven.js +234 -0
- package/dist/pages/prompt.js +8 -402
- package/dist/pages/promptCoreText.js +278 -0
- package/dist/pages/promptReferenceText.js +131 -0
- package/dist/pages/promptRetailCinemaText.js +273 -0
- package/dist/services/cgv/client.js +6 -1
- package/dist/services/cgv/index.js +3 -3
- package/dist/services/cgv/location.js +235 -0
- package/dist/services/cgv/tools/findTheaters.js +30 -5
- package/dist/services/cgv/tools/getTimetable.js +42 -14
- package/dist/services/cgv/tools/searchMovies.js +40 -12
- package/dist/services/cgv/transport.js +0 -3
- package/dist/services/cu/api.js +11 -0
- package/dist/services/cu/client.js +297 -0
- package/dist/services/cu/index.js +21 -0
- package/dist/services/cu/tools/checkInventory.js +123 -0
- package/dist/services/cu/tools/findNearbyStores.js +49 -0
- package/dist/services/cu/types.js +4 -0
- package/dist/services/daiso/api.js +22 -2
- package/dist/services/daiso/client.js +59 -0
- package/dist/services/daiso/index.js +2 -0
- package/dist/services/daiso/product.js +17 -0
- package/dist/services/daiso/tools/checkInventory.js +76 -41
- package/dist/services/daiso/tools/findStores.js +17 -7
- package/dist/services/daiso/tools/getDisplayLocation.js +75 -0
- package/dist/services/emart24/api.js +11 -0
- package/dist/services/emart24/client.js +173 -0
- package/dist/services/emart24/index.js +22 -0
- package/dist/services/emart24/inventoryLookup.js +134 -0
- package/dist/services/emart24/tools/checkInventory.js +54 -0
- package/dist/services/emart24/tools/findNearbyStores.js +72 -0
- package/dist/services/emart24/tools/searchProducts.js +63 -0
- package/dist/services/emart24/types.js +4 -0
- package/dist/services/gs25/api.js +9 -0
- package/dist/services/gs25/client.js +198 -0
- package/dist/services/gs25/index.js +22 -0
- package/dist/services/gs25/storeUtils.js +168 -0
- package/dist/services/gs25/tools/checkInventory.js +163 -0
- package/dist/services/gs25/tools/findNearbyStores.js +103 -0
- package/dist/services/gs25/tools/searchProducts.js +50 -0
- package/dist/services/gs25/types.js +4 -0
- package/dist/services/lottecinema/api.js +12 -0
- package/dist/services/lottecinema/client.js +161 -0
- package/dist/services/lottecinema/index.js +30 -0
- package/dist/services/lottecinema/location.js +191 -0
- package/dist/services/lottecinema/tools/findNearbyTheaters.js +47 -0
- package/dist/services/lottecinema/tools/getRemainingSeats.js +85 -0
- package/dist/services/lottecinema/tools/listNowShowing.js +79 -0
- package/dist/services/lottecinema/types.js +4 -0
- package/dist/services/lottemart/api.js +31 -0
- package/dist/services/lottemart/client.js +245 -0
- package/dist/services/lottemart/clientTypes.js +4 -0
- package/dist/services/lottemart/config.js +4 -0
- package/dist/services/lottemart/debug.js +92 -0
- package/dist/services/lottemart/geocode.js +49 -0
- package/dist/services/lottemart/index.js +30 -0
- package/dist/services/lottemart/keyword.js +29 -0
- package/dist/services/lottemart/parser.js +185 -0
- package/dist/services/lottemart/session.js +331 -0
- package/dist/services/lottemart/storeSearch.js +52 -0
- package/dist/services/lottemart/tools/findNearbyStores.js +67 -0
- package/dist/services/lottemart/tools/searchProducts.js +62 -0
- package/dist/services/lottemart/types.js +4 -0
- package/dist/services/lottemart/zetta.js +105 -0
- package/dist/services/megabox/location.js +219 -0
- package/dist/services/megabox/tools/findNearbyTheaters.js +13 -44
- package/dist/services/megabox/tools/getRemainingSeats.js +31 -3
- package/dist/services/megabox/tools/listNowShowing.js +31 -3
- package/dist/services/oliveyoung/api.js +2 -0
- package/dist/services/oliveyoung/client.js +150 -9
- package/dist/services/oliveyoung/index.js +3 -1
- package/dist/services/oliveyoung/tools/checkInventory.js +15 -4
- package/dist/services/oliveyoung/tools/searchProducts.js +57 -0
- package/dist/services/seveneleven/api.js +15 -0
- package/dist/services/seveneleven/client.js +279 -0
- package/dist/services/seveneleven/index.js +30 -0
- package/dist/services/seveneleven/inventory.js +302 -0
- package/dist/services/seveneleven/productKeyword.js +141 -0
- package/dist/services/seveneleven/tools/checkInventory.js +82 -0
- package/dist/services/seveneleven/tools/getCatalogSnapshot.js +55 -0
- package/dist/services/seveneleven/tools/getSearchPopwords.js +41 -0
- package/dist/services/seveneleven/tools/searchProducts.js +56 -0
- package/dist/services/seveneleven/tools/searchStores.js +45 -0
- package/dist/services/seveneleven/types.js +4 -0
- package/dist/utils/cliInteractiveHelpers.js +63 -0
- package/dist/utils/daisoKeyword.js +30 -0
- package/dist/utils/http.js +16 -2
- package/openapi.json +1977 -734
- package/openapi.yaml +1430 -543
- package/package.json +28 -15
- package/dist/tools/checkInventory.js +0 -98
- package/dist/tools/findStores.js +0 -125
- package/dist/tools/getPriceInfo.js +0 -77
- package/dist/tools/searchProducts.js +0 -61
- package/dist/types/index.js +0 -4
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 프롬프트 핵심 API 섹션
|
|
3
|
+
*/
|
|
4
|
+
export function buildPromptCoreText(baseUrl) {
|
|
5
|
+
return `# 다이소 MCP API
|
|
6
|
+
|
|
7
|
+
다이소 제품 검색, 매장 찾기, 재고 확인을 위한 API입니다.
|
|
8
|
+
모든 요청은 GET 방식이며, 결과는 JSON으로 반환됩니다.
|
|
9
|
+
|
|
10
|
+
Base URL: ${baseUrl}
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 사용 가능한 기능
|
|
15
|
+
|
|
16
|
+
### 1. 제품 검색
|
|
17
|
+
|
|
18
|
+
**설명**: 키워드로 다이소 제품을 검색합니다.
|
|
19
|
+
|
|
20
|
+
**URL**: ${baseUrl}/api/daiso/products?q={검색어}
|
|
21
|
+
|
|
22
|
+
**필수 파라미터**:
|
|
23
|
+
- q: 검색 키워드 (예: 수납박스, 펜, 정리함)
|
|
24
|
+
|
|
25
|
+
**선택 파라미터**:
|
|
26
|
+
- page: 페이지 번호 (기본값: 1)
|
|
27
|
+
- pageSize: 페이지당 결과 수 (기본값: 30, 최대: 100)
|
|
28
|
+
|
|
29
|
+
**예시**:
|
|
30
|
+
- ${baseUrl}/api/daiso/products?q=수납박스
|
|
31
|
+
- ${baseUrl}/api/daiso/products?q=펜&page=2&pageSize=10
|
|
32
|
+
|
|
33
|
+
**응답 예시**:
|
|
34
|
+
\`\`\`json
|
|
35
|
+
{
|
|
36
|
+
"success": true,
|
|
37
|
+
"data": {
|
|
38
|
+
"products": [
|
|
39
|
+
{
|
|
40
|
+
"id": "1234567890",
|
|
41
|
+
"name": "PP 수납박스 대형",
|
|
42
|
+
"price": 5000,
|
|
43
|
+
"imageUrl": "https://cdn.daisomall.co.kr/...",
|
|
44
|
+
"soldOut": false,
|
|
45
|
+
"isNew": false,
|
|
46
|
+
"pickupAvailable": true
|
|
47
|
+
}
|
|
48
|
+
]
|
|
49
|
+
},
|
|
50
|
+
"meta": { "total": 150, "page": 1, "pageSize": 30 }
|
|
51
|
+
}
|
|
52
|
+
\`\`\`
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
### 2. 제품 상세 정보
|
|
57
|
+
|
|
58
|
+
**설명**: 제품 ID로 상세 정보를 조회합니다.
|
|
59
|
+
|
|
60
|
+
**URL**: ${baseUrl}/api/daiso/products/{제품ID}
|
|
61
|
+
|
|
62
|
+
**예시**:
|
|
63
|
+
- ${baseUrl}/api/daiso/products/1234567890
|
|
64
|
+
|
|
65
|
+
**응답 예시**:
|
|
66
|
+
\`\`\`json
|
|
67
|
+
{
|
|
68
|
+
"success": true,
|
|
69
|
+
"data": {
|
|
70
|
+
"id": "1234567890",
|
|
71
|
+
"name": "PP 수납박스 대형",
|
|
72
|
+
"price": 5000,
|
|
73
|
+
"currency": "KRW",
|
|
74
|
+
"imageUrl": "https://cdn.daisomall.co.kr/...",
|
|
75
|
+
"brand": "다이소",
|
|
76
|
+
"soldOut": false,
|
|
77
|
+
"isNew": false
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
\`\`\`
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
### 3. 매장 찾기
|
|
85
|
+
|
|
86
|
+
**설명**: 키워드 또는 지역으로 다이소 매장을 검색합니다.
|
|
87
|
+
|
|
88
|
+
**URL**: ${baseUrl}/api/daiso/stores?keyword={키워드}
|
|
89
|
+
|
|
90
|
+
**필수 파라미터** (둘 중 하나 필수):
|
|
91
|
+
- keyword: 매장명 또는 주소 키워드 (예: 강남, 홍대, 안산)
|
|
92
|
+
- sido: 시/도 (예: 서울, 경기, 부산)
|
|
93
|
+
|
|
94
|
+
**선택 파라미터**:
|
|
95
|
+
- gugun: 구/군 (예: 강남구, 마포구)
|
|
96
|
+
- dong: 동 (예: 역삼동, 합정동)
|
|
97
|
+
- limit: 최대 결과 수 (기본값: 50)
|
|
98
|
+
|
|
99
|
+
**예시**:
|
|
100
|
+
- ${baseUrl}/api/daiso/stores?keyword=강남
|
|
101
|
+
- ${baseUrl}/api/daiso/stores?sido=서울&gugun=마포구
|
|
102
|
+
- ${baseUrl}/api/daiso/stores?keyword=홍대&limit=10
|
|
103
|
+
|
|
104
|
+
**응답 예시**:
|
|
105
|
+
\`\`\`json
|
|
106
|
+
{
|
|
107
|
+
"success": true,
|
|
108
|
+
"data": {
|
|
109
|
+
"stores": [
|
|
110
|
+
{
|
|
111
|
+
"name": "다이소 강남역점",
|
|
112
|
+
"phone": "02-1234-5678",
|
|
113
|
+
"address": "서울특별시 강남구 강남대로 123",
|
|
114
|
+
"lat": 37.4979,
|
|
115
|
+
"lng": 127.0276,
|
|
116
|
+
"openTime": "10:00",
|
|
117
|
+
"closeTime": "22:00",
|
|
118
|
+
"options": {
|
|
119
|
+
"parking": true,
|
|
120
|
+
"pickup": true,
|
|
121
|
+
"taxFree": false
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
]
|
|
125
|
+
},
|
|
126
|
+
"meta": { "total": 5 }
|
|
127
|
+
}
|
|
128
|
+
\`\`\`
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
### 4. 재고 확인
|
|
133
|
+
|
|
134
|
+
**설명**: 특정 제품의 매장별 재고와 온라인 재고를 확인합니다.
|
|
135
|
+
|
|
136
|
+
**URL**: ${baseUrl}/api/daiso/inventory?productId={제품ID}
|
|
137
|
+
|
|
138
|
+
**필수 파라미터**:
|
|
139
|
+
- productId: 제품 ID (제품 검색 API에서 조회한 id 값)
|
|
140
|
+
|
|
141
|
+
**선택 파라미터**:
|
|
142
|
+
- lat: 위도 (기본값: 37.5665, 서울 시청)
|
|
143
|
+
- lng: 경도 (기본값: 126.978, 서울 시청)
|
|
144
|
+
- keyword: 매장 검색어 (예: 안산, 강남)
|
|
145
|
+
- page: 페이지 번호 (기본값: 1)
|
|
146
|
+
- pageSize: 페이지당 결과 수 (기본값: 30)
|
|
147
|
+
|
|
148
|
+
**주의**:
|
|
149
|
+
- 다이소 재고 조회는 storeCode가 필요하지 않습니다.
|
|
150
|
+
- storeCode는 재고 응답의 storeInventory.stores[].storeCode에서 확인한 뒤 진열 위치 조회에 사용합니다.
|
|
151
|
+
- 안산 중앙역 같은 역명 키워드가 비면 안산중앙역, 안산중앙, 고잔처럼 붙여쓴 변형으로 재시도하세요.
|
|
152
|
+
|
|
153
|
+
**예시**:
|
|
154
|
+
- ${baseUrl}/api/daiso/inventory?productId=1234567890
|
|
155
|
+
- ${baseUrl}/api/daiso/inventory?productId=1234567890&lat=37.3219&lng=126.8309
|
|
156
|
+
- ${baseUrl}/api/daiso/inventory?productId=1234567890&keyword=안산
|
|
157
|
+
|
|
158
|
+
**응답 예시**:
|
|
159
|
+
\`\`\`json
|
|
160
|
+
{
|
|
161
|
+
"success": true,
|
|
162
|
+
"data": {
|
|
163
|
+
"productId": "1234567890",
|
|
164
|
+
"product": {
|
|
165
|
+
"id": "1234567890",
|
|
166
|
+
"name": "PP 수납박스 대형",
|
|
167
|
+
"imageUrl": "https://cdn.daisomall.co.kr/...",
|
|
168
|
+
"brand": "다이소",
|
|
169
|
+
"soldOut": false,
|
|
170
|
+
"isNew": false
|
|
171
|
+
},
|
|
172
|
+
"location": { "latitude": 37.5665, "longitude": 126.978 },
|
|
173
|
+
"onlineStock": 150,
|
|
174
|
+
"storeInventory": {
|
|
175
|
+
"totalStores": 25,
|
|
176
|
+
"inStockCount": 18,
|
|
177
|
+
"stores": [
|
|
178
|
+
{
|
|
179
|
+
"storeCode": "ST001",
|
|
180
|
+
"storeName": "다이소 강남역점",
|
|
181
|
+
"address": "서울특별시 강남구...",
|
|
182
|
+
"distance": "0.5km",
|
|
183
|
+
"quantity": 12,
|
|
184
|
+
"options": { "parking": true, "pickup": true }
|
|
185
|
+
}
|
|
186
|
+
]
|
|
187
|
+
}
|
|
188
|
+
},
|
|
189
|
+
"meta": { "total": 25, "page": 1, "pageSize": 30 }
|
|
190
|
+
}
|
|
191
|
+
\`\`\`
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
### 4-1. 진열 위치 조회
|
|
196
|
+
|
|
197
|
+
**설명**: 특정 상품이 특정 매장 내 어디에 진열되어 있는지(구역/층) 조회합니다.
|
|
198
|
+
|
|
199
|
+
**URL**: ${baseUrl}/api/daiso/display-location?productId={제품ID}&storeCode={매장코드}
|
|
200
|
+
|
|
201
|
+
**필수 파라미터**:
|
|
202
|
+
- productId: 제품 ID (제품 검색 API에서 조회한 id 값)
|
|
203
|
+
- storeCode: 매장 코드 (재고 확인 API 결과의 storeCode 값)
|
|
204
|
+
|
|
205
|
+
**예시**:
|
|
206
|
+
- ${baseUrl}/api/daiso/display-location?productId=1234567890&storeCode=04515
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
### 5. 올리브영 매장 찾기
|
|
211
|
+
|
|
212
|
+
**설명**: 위치 기반으로 주변 올리브영 매장을 검색합니다.
|
|
213
|
+
|
|
214
|
+
**URL**: ${baseUrl}/api/oliveyoung/stores?keyword={키워드}
|
|
215
|
+
|
|
216
|
+
**선택 파라미터**:
|
|
217
|
+
- keyword: 매장명/지역 키워드 (예: 명동, 강남)
|
|
218
|
+
- lat: 위도 (기본값: 37.5665)
|
|
219
|
+
- lng: 경도 (기본값: 126.978)
|
|
220
|
+
- pageIdx: 페이지 번호 (기본값: 1)
|
|
221
|
+
- limit: 최대 결과 수 (기본값: 20)
|
|
222
|
+
|
|
223
|
+
**예시**:
|
|
224
|
+
- ${baseUrl}/api/oliveyoung/stores?keyword=명동
|
|
225
|
+
- ${baseUrl}/api/oliveyoung/stores?lat=37.498&lng=127.027&limit=5
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
### 6. 올리브영 상품 검색
|
|
230
|
+
|
|
231
|
+
**설명**: 키워드로 올리브영 상품 목록을 조회합니다. 사용자가 "올리브영 마스크팩 어떤 거 있나요", "립밤 종류 보여줘"처럼 상품 후보나 종류를 묻는 경우에는 이 API를 먼저 사용하세요.
|
|
232
|
+
|
|
233
|
+
**표시 규칙**:
|
|
234
|
+
- 응답의 \`products[].imageUrl\`이 있으면 각 상품 이미지를 반드시 마크다운 이미지로 함께 렌더링합니다.
|
|
235
|
+
- 여러 상품이 나오면 첫 상품만 대표로 보여주지 말고, 이미지가 있는 상품은 전부 표시합니다.
|
|
236
|
+
|
|
237
|
+
**URL**: ${baseUrl}/api/oliveyoung/products?keyword={검색어}
|
|
238
|
+
|
|
239
|
+
**필수 파라미터**:
|
|
240
|
+
- keyword: 상품 검색어 (예: 마스크팩, 선크림, 립밤)
|
|
241
|
+
|
|
242
|
+
**선택 파라미터**:
|
|
243
|
+
- page: 상품 검색 페이지 (기본값: 1)
|
|
244
|
+
- size: 페이지당 상품 수 (기본값: 20)
|
|
245
|
+
- sort: 정렬 코드 (기본값: 01)
|
|
246
|
+
- includeSoldOut: 품절 포함 여부 (기본값: false)
|
|
247
|
+
|
|
248
|
+
**예시**:
|
|
249
|
+
- ${baseUrl}/api/oliveyoung/products?keyword=마스크팩
|
|
250
|
+
- ${baseUrl}/api/oliveyoung/products?keyword=립밤&size=10
|
|
251
|
+
|
|
252
|
+
---
|
|
253
|
+
|
|
254
|
+
### 7. 올리브영 재고 확인
|
|
255
|
+
|
|
256
|
+
**설명**: 상품 키워드 기준 올리브영 재고를 조회하고 주변 매장 목록을 함께 반환합니다. 상위 상품에는 storeInventory가 포함되며 매장별 재고 3개, 재고 9개 이상, 품절, 미판매 같은 상태를 제공합니다.
|
|
257
|
+
|
|
258
|
+
**URL**: ${baseUrl}/api/oliveyoung/inventory?keyword={검색어}
|
|
259
|
+
|
|
260
|
+
**필수 파라미터**:
|
|
261
|
+
- keyword: 상품 검색어 (예: 선크림, 립밤)
|
|
262
|
+
|
|
263
|
+
**선택 파라미터**:
|
|
264
|
+
- lat: 위도 (기본값: 37.5665)
|
|
265
|
+
- lng: 경도 (기본값: 126.978)
|
|
266
|
+
- storeKeyword: 매장 필터 키워드
|
|
267
|
+
- page: 상품 검색 페이지 (기본값: 1)
|
|
268
|
+
- size: 페이지당 결과 수 (기본값: 20)
|
|
269
|
+
- includeSoldOut: 품절 포함 여부 (기본값: false)
|
|
270
|
+
|
|
271
|
+
**예시**:
|
|
272
|
+
- ${baseUrl}/api/oliveyoung/inventory?keyword=선크림
|
|
273
|
+
- ${baseUrl}/api/oliveyoung/inventory?keyword=립밤&storeKeyword=명동
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
`;
|
|
278
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 프롬프트 응답/사용 팁 섹션
|
|
3
|
+
*/
|
|
4
|
+
export function buildPromptReferenceText(baseUrl) {
|
|
5
|
+
return `## 응답 형식
|
|
6
|
+
|
|
7
|
+
### 성공 응답
|
|
8
|
+
\`\`\`json
|
|
9
|
+
{
|
|
10
|
+
"success": true,
|
|
11
|
+
"data": { ... },
|
|
12
|
+
"meta": {
|
|
13
|
+
"total": 100,
|
|
14
|
+
"page": 1,
|
|
15
|
+
"pageSize": 30
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
\`\`\`
|
|
19
|
+
|
|
20
|
+
### 에러 응답
|
|
21
|
+
\`\`\`json
|
|
22
|
+
{
|
|
23
|
+
"success": false,
|
|
24
|
+
"error": {
|
|
25
|
+
"code": "ERROR_CODE",
|
|
26
|
+
"message": "에러 메시지"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
\`\`\`
|
|
30
|
+
|
|
31
|
+
### 에러 코드
|
|
32
|
+
| 코드 | 설명 |
|
|
33
|
+
|------|------|
|
|
34
|
+
| MISSING_QUERY | 검색어가 누락됨 |
|
|
35
|
+
| MISSING_PARAMS | 필수 파라미터 누락 |
|
|
36
|
+
| MISSING_PRODUCT_ID | 제품 ID 누락 |
|
|
37
|
+
| MISSING_STORE_CODE | 매장 코드 누락 |
|
|
38
|
+
| NOT_FOUND | 결과를 찾을 수 없음 |
|
|
39
|
+
| SEARCH_FAILED | 검색 실패 |
|
|
40
|
+
| FETCH_FAILED | 데이터 조회 실패 |
|
|
41
|
+
| DISPLAY_LOCATION_FAILED | 진열 위치 조회 실패 |
|
|
42
|
+
| OLIVEYOUNG_STORE_SEARCH_FAILED | 올리브영 매장 조회 실패 |
|
|
43
|
+
| OLIVEYOUNG_PRODUCT_SEARCH_FAILED | 올리브영 상품 조회 실패 |
|
|
44
|
+
| OLIVEYOUNG_INVENTORY_CHECK_FAILED | 올리브영 재고 조회 실패 |
|
|
45
|
+
| MEGABOX_THEATER_SEARCH_FAILED | 메가박스 지점 조회 실패 |
|
|
46
|
+
| MEGABOX_MOVIE_LIST_FAILED | 메가박스 영화 목록 조회 실패 |
|
|
47
|
+
| MEGABOX_SEAT_LIST_FAILED | 메가박스 좌석 조회 실패 |
|
|
48
|
+
| LOTTECINEMA_THEATER_SEARCH_FAILED | 롯데시네마 지점 조회 실패 |
|
|
49
|
+
| LOTTECINEMA_MOVIE_LIST_FAILED | 롯데시네마 영화 목록 조회 실패 |
|
|
50
|
+
| LOTTECINEMA_SEAT_LIST_FAILED | 롯데시네마 좌석 조회 실패 |
|
|
51
|
+
| CGV_THEATER_SEARCH_FAILED | CGV 극장 조회 실패 |
|
|
52
|
+
| CGV_MOVIE_SEARCH_FAILED | CGV 영화 목록 조회 실패 |
|
|
53
|
+
| CGV_TIMETABLE_FETCH_FAILED | CGV 시간표 조회 실패 |
|
|
54
|
+
| GS25_STORE_SEARCH_FAILED | GS25 매장 조회 실패 |
|
|
55
|
+
| GS25_PRODUCT_SEARCH_FAILED | GS25 상품 조회 실패 |
|
|
56
|
+
| GS25_INVENTORY_CHECK_FAILED | GS25 재고 조회 실패 |
|
|
57
|
+
| LOTTEMART_STORE_SEARCH_FAILED | 롯데마트 매장 조회 실패 |
|
|
58
|
+
| LOTTEMART_PRODUCT_SEARCH_FAILED | 롯데마트 상품 조회 실패 |
|
|
59
|
+
| SEVENELEVEN_INVENTORY_CHECK_FAILED | 세븐일레븐 재고 조회 실패 |
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## 사용 팁
|
|
64
|
+
|
|
65
|
+
1. **한글 검색어**: URL 인코딩이 자동으로 처리됩니다
|
|
66
|
+
2. **페이지네이션**: 결과가 많을 경우 page 파라미터 사용
|
|
67
|
+
3. **브랜드 고정**: 사용자가 "다이소에서", "GS25에서"처럼 브랜드를 명시하면 품목상 어색해 보여도 먼저 그 브랜드에서 실제 검색/조회하고, 결과가 없을 때만 다른 브랜드 대안을 짧게 제안합니다.
|
|
68
|
+
- 금지: "핫식스는 다이소가 아니라 편의점 상품이라서 조회할 수 없습니다"처럼 사전 판단으로 검색을 거부
|
|
69
|
+
- 원칙: 브랜드가 명시되면 일단 해당 브랜드에서 실제 조회 후, 결과가 없을 때만 다른 브랜드 제안
|
|
70
|
+
- 확장 해석: "안산 중앙역 주변 다이소 찾아주시고 핫식스 재고 찾아주세요"처럼 브랜드가 앞부분에만 나와도 뒤 요청 전체를 다이소 기준으로 처리
|
|
71
|
+
4. **이미지 적극 표시**:
|
|
72
|
+
- **규칙 1**: MCP/REST 응답에 \`imageUrl\`이 있으면 반드시 마크다운 이미지로 렌더링하세요.
|
|
73
|
+
- **규칙 2**: 사용자가 따로 요청하기 전까지 이미지를 임의로 생략하지 마세요.
|
|
74
|
+
- **규칙 3**: 이미지가 여러 개이면 첫 번째만 대표로 보여주지 말고 각 항목의 이미지를 전부 표시하세요.
|
|
75
|
+
- **규칙 4**: "길어서 일부만 표시", "대표 이미지만 표시", "나머지는 생략" 같은 동작을 하지 마세요.
|
|
76
|
+
- **규칙 5**: 텍스트 요약보다 이미지 표시 의무가 우선이며, 이미지가 있으면 답변 길이 때문에라도 빼지 마세요.
|
|
77
|
+
- **규칙 6**: \`imageUrl\`에 query string이 있으면 \`?l=ko\` 같은 쿼리를 절대 삭제하거나 정규화하지 말고, 마크다운 이미지 src에 전체 URL을 그대로 사용하세요.
|
|
78
|
+
- **규칙 7**: 이미지 src를 비교하거나 캐시 키를 판단할 때도 hostname + pathname만 쓰지 말고 query string까지 포함한 전체 URL을 기준으로 취급하세요.
|
|
79
|
+
5. **재고 확인 워크플로우**:
|
|
80
|
+
- 먼저 /api/daiso/products로 제품 검색
|
|
81
|
+
- 결과에서 원하는 제품의 id 확인
|
|
82
|
+
- /api/daiso/inventory에 해당 id로 재고 조회
|
|
83
|
+
- 진열 위치가 필요하면 재고 응답의 storeCode를 확인한 뒤 /api/daiso/display-location에 productId + storeCode로 조회
|
|
84
|
+
6. **상품명 단계 검색**:
|
|
85
|
+
- 재고 검색은 어떤 서비스이든 검색어 전체를 먼저 그대로 조회하고, 실패할 때만 공백/브랜드어 제거, 표기 변형, 더 짧은 핵심어 순으로 단계적으로 넓혀서 다시 시도합니다.
|
|
86
|
+
- 너무 넓은 축약어로만 매칭된 경우에는 확정 상품처럼 단정하지 말고, 추정 매칭임을 짧게 밝힌 뒤 재고를 안내합니다.
|
|
87
|
+
- 위치/브랜드/상품명은 한 인자에 섞지 말고 가능한 한 분리해서 도구에 전달합니다.
|
|
88
|
+
7. **위치 기반 재고**: lat, lng 파라미터로 가까운 매장 우선 조회
|
|
89
|
+
8. **롯데마트 상품 조회**: /api/lottemart/products는 keyword와 함께 storeCode 또는 storeName이 필요합니다.
|
|
90
|
+
9. **세븐일레븐 재고 조회**: /api/seveneleven/inventory에 keyword + storeKeyword를 함께 주면 매장별 수량을 바로 확인할 수 있습니다.
|
|
91
|
+
10. **이마트24 재고 조회**: /api/emart24/inventory는 pluCd + storeKeyword 조합도 지원하므로, 상품 선택 뒤 매장 코드를 다시 모으지 않아도 됩니다.
|
|
92
|
+
11. **올리브영 재고 해석**: inventory.products[].storeInventory.stores[]가 있으면 그 매장별 stockLabel과 remainQuantity를 우선 사용하고, inStock는 그 주변 매장 기준 결과로 해석합니다.
|
|
93
|
+
12. **올리브영 상품 이미지 표시**: /api/oliveyoung/products 또는 oliveyoung_search_products 결과에 imageUrl이 있으면 목록형 답변에서도 각 상품 이미지를 생략하지 말고 모두 렌더링합니다. 특히 \`?l=ko\` 같은 query string을 삭제하지 말고 전체 URL 그대로 마크다운 이미지 src에 넣습니다.
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## MCP 지원 서비스
|
|
98
|
+
|
|
99
|
+
MCP를 지원하는 AI 에이전트(Claude 등)는 더 풍부한 기능을 사용할 수 있습니다.
|
|
100
|
+
MCP 연결 정보: ${baseUrl}/mcp
|
|
101
|
+
|
|
102
|
+
지원 도구:
|
|
103
|
+
- daiso_search_products: 제품 검색
|
|
104
|
+
- daiso_find_stores: 매장 검색
|
|
105
|
+
- daiso_check_inventory: 재고 확인
|
|
106
|
+
- daiso_get_price_info: 가격 정보 조회
|
|
107
|
+
- daiso_get_display_location: 진열 위치 조회
|
|
108
|
+
- lottemart_find_nearby_stores: 롯데마트 주변 매장 탐색
|
|
109
|
+
- lottemart_search_products: 롯데마트 상품 검색
|
|
110
|
+
- gs25_find_nearby_stores: GS25 주변 매장 탐색
|
|
111
|
+
- gs25_search_products: GS25 상품 검색
|
|
112
|
+
- gs25_check_inventory: GS25 재고 조회
|
|
113
|
+
- seveneleven_search_products: 세븐일레븐 상품 검색
|
|
114
|
+
- seveneleven_search_stores: 세븐일레븐 매장 검색
|
|
115
|
+
- seveneleven_check_inventory: 세븐일레븐 재고 조회
|
|
116
|
+
- seveneleven_get_search_popwords: 세븐일레븐 인기 검색어 조회
|
|
117
|
+
- seveneleven_get_catalog_snapshot: 세븐일레븐 카탈로그 조회
|
|
118
|
+
- oliveyoung_search_products: 올리브영 상품 검색
|
|
119
|
+
- oliveyoung_find_nearby_stores: 올리브영 주변 매장 탐색
|
|
120
|
+
- oliveyoung_check_inventory: 올리브영 재고 파악
|
|
121
|
+
- megabox_find_nearby_theaters: 메가박스 주변 지점 탐색
|
|
122
|
+
- megabox_list_now_showing: 메가박스 영화 목록 조회
|
|
123
|
+
- megabox_get_remaining_seats: 메가박스 잔여 좌석 조회
|
|
124
|
+
- lottecinema_find_nearby_theaters: 롯데시네마 주변 지점 탐색
|
|
125
|
+
- lottecinema_list_now_showing: 롯데시네마 영화 목록 조회
|
|
126
|
+
- lottecinema_get_remaining_seats: 롯데시네마 잔여 좌석 조회
|
|
127
|
+
- cgv_find_theaters: CGV 극장 검색
|
|
128
|
+
- cgv_search_movies: CGV 영화 검색
|
|
129
|
+
- cgv_get_timetable: CGV 시간표 조회
|
|
130
|
+
`;
|
|
131
|
+
}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 프롬프트 리테일/영화 API 섹션
|
|
3
|
+
*/
|
|
4
|
+
export function buildPromptRetailCinemaText(baseUrl) {
|
|
5
|
+
return `### 6-1. 롯데마트 매장/상품 조회
|
|
6
|
+
|
|
7
|
+
**설명**: 롯데마트 계열 매장 검색과 특정 매장 기준 상품 가격/재고 조회를 제공합니다.
|
|
8
|
+
|
|
9
|
+
**URL**:
|
|
10
|
+
- ${baseUrl}/api/lottemart/stores?keyword={키워드}
|
|
11
|
+
- ${baseUrl}/api/lottemart/products?keyword={검색어}&storeName={매장명}
|
|
12
|
+
|
|
13
|
+
**선택 파라미터**:
|
|
14
|
+
- area: 지역 (예: 서울, 경기, 제주)
|
|
15
|
+
- brandVariant: lottemart, toysrus, max, bottlebunker, mealguru, grandgrocery
|
|
16
|
+
- lat: 위도 (선택)
|
|
17
|
+
- lng: 경도 (선택)
|
|
18
|
+
- limit: 최대 결과 수 (기본값: 20)
|
|
19
|
+
- storeCode 또는 storeName: 상품 검색 대상 매장
|
|
20
|
+
- pageLimit: 추가 조회할 최대 페이지 수 (기본값: 3)
|
|
21
|
+
|
|
22
|
+
**예시**:
|
|
23
|
+
- ${baseUrl}/api/lottemart/stores?keyword=잠실&area=서울&limit=10
|
|
24
|
+
- ${baseUrl}/api/lottemart/stores?area=경기&brandVariant=lottemart&limit=10
|
|
25
|
+
- ${baseUrl}/api/lottemart/products?keyword=콜라&storeName=강변점&area=서울
|
|
26
|
+
- ${baseUrl}/api/lottemart/products?keyword=우유&storeCode=2301&pageLimit=2
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
### 6-2. GS25 매장/상품/재고 조회
|
|
31
|
+
|
|
32
|
+
**설명**: GS25 매장 탐색, 상품 키워드 검색, 재고 조회를 제공합니다.
|
|
33
|
+
|
|
34
|
+
**URL**:
|
|
35
|
+
- ${baseUrl}/api/gs25/stores?keyword={키워드}
|
|
36
|
+
- ${baseUrl}/api/gs25/products?keyword={검색어}
|
|
37
|
+
- ${baseUrl}/api/gs25/inventory?keyword={검색어}
|
|
38
|
+
- ${baseUrl}/api/gs25/inventory?itemCode={상품코드}
|
|
39
|
+
|
|
40
|
+
**선택 파라미터(공통)**:
|
|
41
|
+
- lat: 위도 (선택)
|
|
42
|
+
- lng: 경도 (선택)
|
|
43
|
+
- limit / storeLimit: 최대 결과 수
|
|
44
|
+
- serviceCode: 서비스 코드 (기본값: 01)
|
|
45
|
+
|
|
46
|
+
**예시**:
|
|
47
|
+
- ${baseUrl}/api/gs25/stores?keyword=강남&limit=10
|
|
48
|
+
- ${baseUrl}/api/gs25/products?keyword=오감자&limit=20
|
|
49
|
+
- ${baseUrl}/api/gs25/inventory?keyword=오감자&storeKeyword=강남&storeLimit=10
|
|
50
|
+
- ${baseUrl}/api/gs25/inventory?itemCode=8801056038861&storeKeyword=안산%20중앙역&storeLimit=10
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
### 6-3. 세븐일레븐 상품/매장/재고/인기검색어/카탈로그 조회
|
|
55
|
+
|
|
56
|
+
**설명**: 세븐일레븐 상품 검색, 매장 검색, 재고 수량 조회, 인기 검색어, 카탈로그 스냅샷을 제공합니다.
|
|
57
|
+
|
|
58
|
+
**URL**:
|
|
59
|
+
- ${baseUrl}/api/seveneleven/products?query={검색어}
|
|
60
|
+
- ${baseUrl}/api/seveneleven/stores?keyword={매장키워드}
|
|
61
|
+
- ${baseUrl}/api/seveneleven/inventory?keyword={검색어}
|
|
62
|
+
- ${baseUrl}/api/seveneleven/popwords?label={라벨}
|
|
63
|
+
- ${baseUrl}/api/seveneleven/catalog?includeIssues={true|false}&includeExhibition={true|false}&limit={개수}
|
|
64
|
+
|
|
65
|
+
**선택 파라미터**:
|
|
66
|
+
- page: 페이지 번호 (기본값: 1)
|
|
67
|
+
- size: 페이지당 결과 수 (기본값: 20)
|
|
68
|
+
- sort: 정렬 기준 (기본값: recommend)
|
|
69
|
+
- storeKeyword: 매장명/지역 키워드
|
|
70
|
+
- storeLimit: 최대 매장 수 (기본값: 20)
|
|
71
|
+
- timeoutMs: 요청 제한 시간 (기본값: 20000)
|
|
72
|
+
- label: 인기 검색어 라벨 (기본값: home)
|
|
73
|
+
|
|
74
|
+
**예시**:
|
|
75
|
+
- ${baseUrl}/api/seveneleven/products?query=삼각김밥&size=20
|
|
76
|
+
- ${baseUrl}/api/seveneleven/stores?keyword=안산%20중앙역&limit=10
|
|
77
|
+
- ${baseUrl}/api/seveneleven/inventory?keyword=핫식스&storeKeyword=안산%20중앙역&storeLimit=10
|
|
78
|
+
- ${baseUrl}/api/seveneleven/popwords?label=home
|
|
79
|
+
- ${baseUrl}/api/seveneleven/catalog?includeIssues=true&includeExhibition=true&limit=10
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
### 7. 메가박스 주변 지점 찾기
|
|
84
|
+
|
|
85
|
+
**설명**: 사용자 좌표 또는 위치 키워드 기준으로 메가박스 지점을 거리순으로 조회합니다.
|
|
86
|
+
|
|
87
|
+
**URL**: ${baseUrl}/api/megabox/theaters?lat={위도}&lng={경도}
|
|
88
|
+
|
|
89
|
+
**선택 파라미터**:
|
|
90
|
+
- keyword: 위치 키워드 (예: 안산 중앙역, 강남역)
|
|
91
|
+
- lat: 위도 (기본값: 37.5665)
|
|
92
|
+
- lng: 경도 (기본값: 126.978)
|
|
93
|
+
- playDate: 조회 날짜 (YYYYMMDD, 기본값: 오늘)
|
|
94
|
+
- areaCode: 지역 코드 (기본값: 11, 서울)
|
|
95
|
+
- limit: 최대 결과 수 (기본값: 10)
|
|
96
|
+
|
|
97
|
+
**예시**:
|
|
98
|
+
- ${baseUrl}/api/megabox/theaters?keyword=안산%20중앙역&limit=5
|
|
99
|
+
- ${baseUrl}/api/megabox/theaters?lat=37.4982&lng=127.0264
|
|
100
|
+
- ${baseUrl}/api/megabox/theaters?areaCode=11&limit=5
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
### 8. 메가박스 영화/회차 목록
|
|
105
|
+
|
|
106
|
+
**설명**: 날짜/지점 조건으로 메가박스 영화와 상영 회차를 조회합니다. theaterId가 없고 위치 키워드/좌표가 있으면 가장 가까운 지점을 먼저 선택합니다.
|
|
107
|
+
|
|
108
|
+
**URL**: ${baseUrl}/api/megabox/movies?playDate={YYYYMMDD}
|
|
109
|
+
|
|
110
|
+
**선택 파라미터**:
|
|
111
|
+
- playDate: 조회 날짜 (YYYYMMDD, 기본값: 오늘)
|
|
112
|
+
- theaterId: 지점 ID (예: 1372)
|
|
113
|
+
- movieId: 영화 ID (예: 25104500)
|
|
114
|
+
- keyword: 위치 키워드 (예: 안산 중앙역, 강남역)
|
|
115
|
+
- lat: 위도
|
|
116
|
+
- lng: 경도
|
|
117
|
+
- areaCode: 지역 코드 (기본값: 11)
|
|
118
|
+
|
|
119
|
+
**예시**:
|
|
120
|
+
- ${baseUrl}/api/megabox/movies?playDate=20260315&keyword=안산%20중앙역
|
|
121
|
+
- ${baseUrl}/api/megabox/movies?playDate=20260304&theaterId=1372
|
|
122
|
+
- ${baseUrl}/api/megabox/movies?playDate=20260304&movieId=25104500
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
### 9. 메가박스 잔여 좌석 조회
|
|
127
|
+
|
|
128
|
+
**설명**: 영화/지점/날짜 기준으로 회차별 잔여 좌석 수를 조회합니다. theaterId가 없고 위치 키워드/좌표가 있으면 가장 가까운 지점을 먼저 선택합니다.
|
|
129
|
+
|
|
130
|
+
**URL**: ${baseUrl}/api/megabox/seats?playDate={YYYYMMDD}
|
|
131
|
+
|
|
132
|
+
**선택 파라미터**:
|
|
133
|
+
- playDate: 조회 날짜 (YYYYMMDD, 기본값: 오늘)
|
|
134
|
+
- theaterId: 지점 ID
|
|
135
|
+
- movieId: 영화 ID
|
|
136
|
+
- keyword: 위치 키워드 (예: 안산 중앙역, 강남역)
|
|
137
|
+
- lat: 위도
|
|
138
|
+
- lng: 경도
|
|
139
|
+
- areaCode: 지역 코드 (기본값: 11)
|
|
140
|
+
- limit: 최대 결과 수 (기본값: 50)
|
|
141
|
+
|
|
142
|
+
**예시**:
|
|
143
|
+
- ${baseUrl}/api/megabox/seats?playDate=20260315&keyword=안산%20중앙역
|
|
144
|
+
- ${baseUrl}/api/megabox/seats?playDate=20260304&theaterId=1372
|
|
145
|
+
- ${baseUrl}/api/megabox/seats?playDate=20260304&movieId=25104500&limit=20
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
### 10. CGV 극장 검색
|
|
150
|
+
|
|
151
|
+
**설명**: 지역 코드 또는 위치 키워드 기준으로 CGV 극장 목록을 조회합니다.
|
|
152
|
+
|
|
153
|
+
**URL**: ${baseUrl}/api/cgv/theaters?playDate={YYYYMMDD}
|
|
154
|
+
|
|
155
|
+
**선택 파라미터**:
|
|
156
|
+
- playDate: 조회 날짜 (YYYYMMDD, 기본값: 오늘)
|
|
157
|
+
- regionCode: 지역 코드 (예: 01)
|
|
158
|
+
- keyword: 위치 키워드 (예: 안산 중앙역, 강남역)
|
|
159
|
+
- lat: 위도
|
|
160
|
+
- lng: 경도
|
|
161
|
+
- limit: 최대 결과 수 (기본값: 30)
|
|
162
|
+
|
|
163
|
+
**예시**:
|
|
164
|
+
- ${baseUrl}/api/cgv/theaters?playDate=20260304®ionCode=01
|
|
165
|
+
- ${baseUrl}/api/cgv/theaters?playDate=20260315&keyword=안산%20중앙역
|
|
166
|
+
- ${baseUrl}/api/cgv/theaters?playDate=20260304&limit=10
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
### 11. CGV 영화 검색
|
|
171
|
+
|
|
172
|
+
**설명**: 날짜/극장 조건으로 CGV 영화 목록을 조회합니다. theaterCode가 없으면 keyword 또는 lat,lng 기준으로 가장 가까운 극장을 먼저 선택합니다.
|
|
173
|
+
|
|
174
|
+
**URL**: ${baseUrl}/api/cgv/movies?playDate={YYYYMMDD}
|
|
175
|
+
|
|
176
|
+
**선택 파라미터**:
|
|
177
|
+
- playDate: 조회 날짜 (YYYYMMDD, 기본값: 오늘)
|
|
178
|
+
- theaterCode: 극장 코드 (예: 0056)
|
|
179
|
+
- keyword: 위치 키워드 (예: 안산 중앙역, 강남역)
|
|
180
|
+
- lat: 위도
|
|
181
|
+
- lng: 경도
|
|
182
|
+
|
|
183
|
+
**예시**:
|
|
184
|
+
- ${baseUrl}/api/cgv/movies?playDate=20260304&theaterCode=0056
|
|
185
|
+
- ${baseUrl}/api/cgv/movies?playDate=20260315&keyword=안산%20중앙역
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
### 12. CGV 시간표 조회
|
|
190
|
+
|
|
191
|
+
**설명**: 날짜/극장/영화 조건으로 CGV 상영 시간표를 조회합니다. theaterCode가 없으면 keyword 또는 lat,lng 기준으로 가장 가까운 극장을 먼저 선택합니다. 잔여 좌석은 각 회차의 \`remainingSeats\` 필드로 함께 내려옵니다.
|
|
192
|
+
|
|
193
|
+
**URL**: ${baseUrl}/api/cgv/timetable?playDate={YYYYMMDD}
|
|
194
|
+
|
|
195
|
+
**선택 파라미터**:
|
|
196
|
+
- playDate: 조회 날짜 (YYYYMMDD, 기본값: 오늘)
|
|
197
|
+
- theaterCode: 극장 코드 (예: 0056)
|
|
198
|
+
- movieCode: 영화 코드
|
|
199
|
+
- keyword: 위치 키워드 (예: 안산 중앙역, 강남역)
|
|
200
|
+
- lat: 위도
|
|
201
|
+
- lng: 경도
|
|
202
|
+
- limit: 최대 결과 수 (기본값: 50)
|
|
203
|
+
|
|
204
|
+
**예시**:
|
|
205
|
+
- ${baseUrl}/api/cgv/timetable?playDate=20260304&theaterCode=0056
|
|
206
|
+
- ${baseUrl}/api/cgv/timetable?playDate=20260315&keyword=안산%20중앙역
|
|
207
|
+
- ${baseUrl}/api/cgv/timetable?playDate=20260304&movieCode=200001
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
### 13. 롯데시네마 주변 지점 찾기
|
|
212
|
+
|
|
213
|
+
**설명**: 위치 키워드 또는 사용자 좌표 기준으로 롯데시네마 지점을 거리순으로 조회합니다.
|
|
214
|
+
|
|
215
|
+
**URL**: ${baseUrl}/api/lottecinema/theaters?keyword={위치키워드}
|
|
216
|
+
|
|
217
|
+
**선택 파라미터**:
|
|
218
|
+
- keyword: 위치 키워드 (예: 안산 중앙역, 잠실역)
|
|
219
|
+
- lat: 위도 (keyword가 없을 때 기본값: 37.5665)
|
|
220
|
+
- lng: 경도 (keyword가 없을 때 기본값: 126.978)
|
|
221
|
+
- playDate: 조회 날짜 (YYYYMMDD, 기본값: 오늘)
|
|
222
|
+
- limit: 최대 결과 수 (기본값: 10)
|
|
223
|
+
|
|
224
|
+
**예시**:
|
|
225
|
+
- ${baseUrl}/api/lottecinema/theaters?keyword=안산%20중앙역
|
|
226
|
+
- ${baseUrl}/api/lottecinema/theaters?lat=37.5133&lng=127.1042
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
### 14. 롯데시네마 영화/회차 목록
|
|
231
|
+
|
|
232
|
+
**설명**: 날짜/지점/영화 조건으로 롯데시네마 영화와 상영 회차를 조회합니다. theaterId가 없으면 위치 키워드 기준 최근접 지점을 선택할 수 있습니다.
|
|
233
|
+
|
|
234
|
+
**URL**: ${baseUrl}/api/lottecinema/movies?playDate={YYYYMMDD}
|
|
235
|
+
|
|
236
|
+
**선택 파라미터**:
|
|
237
|
+
- playDate: 조회 날짜 (YYYYMMDD, 기본값: 오늘)
|
|
238
|
+
- theaterId: 지점 ID (예: 1016)
|
|
239
|
+
- movieId: 대표 영화 코드 (예: 23816)
|
|
240
|
+
- keyword: 위치 키워드 (예: 안산 중앙역)
|
|
241
|
+
- lat: 위도 (theaterId가 없을 때 사용)
|
|
242
|
+
- lng: 경도 (theaterId가 없을 때 사용)
|
|
243
|
+
|
|
244
|
+
**예시**:
|
|
245
|
+
- ${baseUrl}/api/lottecinema/movies?playDate=20260315&keyword=안산%20중앙역
|
|
246
|
+
- ${baseUrl}/api/lottecinema/movies?playDate=20260310&theaterId=1016
|
|
247
|
+
- ${baseUrl}/api/lottecinema/movies?playDate=20260310&theaterId=1016&movieId=23816
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
### 15. 롯데시네마 잔여 좌석 조회
|
|
252
|
+
|
|
253
|
+
**설명**: 영화/지점/날짜 기준으로 회차별 잔여 좌석 수를 조회합니다. theaterId가 없으면 위치 키워드 기준 최근접 지점을 선택할 수 있습니다.
|
|
254
|
+
|
|
255
|
+
**URL**: ${baseUrl}/api/lottecinema/seats?playDate={YYYYMMDD}
|
|
256
|
+
|
|
257
|
+
**선택 파라미터**:
|
|
258
|
+
- playDate: 조회 날짜 (YYYYMMDD, 기본값: 오늘)
|
|
259
|
+
- theaterId: 지점 ID
|
|
260
|
+
- movieId: 대표 영화 코드
|
|
261
|
+
- keyword: 위치 키워드 (예: 안산 중앙역)
|
|
262
|
+
- lat: 위도 (theaterId가 없을 때 사용)
|
|
263
|
+
- lng: 경도 (theaterId가 없을 때 사용)
|
|
264
|
+
- limit: 최대 결과 수 (기본값: 50)
|
|
265
|
+
|
|
266
|
+
**예시**:
|
|
267
|
+
- ${baseUrl}/api/lottecinema/seats?playDate=20260315&keyword=안산%20중앙역
|
|
268
|
+
- ${baseUrl}/api/lottecinema/seats?playDate=20260310&theaterId=1016&movieId=23816
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
`;
|
|
273
|
+
}
|
|
@@ -113,7 +113,12 @@ export async function fetchCgvTimetable(params) {
|
|
|
113
113
|
const timetableBySite = await fetchTimetableBySite(playDate, theaterCode, params);
|
|
114
114
|
if (timetableBySite.length > 0) {
|
|
115
115
|
if (params.movieCode) {
|
|
116
|
-
|
|
116
|
+
const filteredByMovie = timetableBySite.filter((item) => item.movieCode === params.movieCode);
|
|
117
|
+
if (filteredByMovie.length > 0) {
|
|
118
|
+
return filteredByMovie;
|
|
119
|
+
}
|
|
120
|
+
const timetableByMovieCode = await fetchTimetableByMovieCode(playDate, theaterCode, params.movieCode, params);
|
|
121
|
+
return timetableByMovieCode.length > 0 ? timetableByMovieCode : timetableBySite;
|
|
117
122
|
}
|
|
118
123
|
return timetableBySite;
|
|
119
124
|
}
|