robodev 0.22.0 → 0.24.0

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.
Files changed (178) hide show
  1. package/package.json +1 -1
  2. package/src/emit-starter.test.ts +36 -0
  3. package/templates/auth-chat/package.json +1 -1
  4. package/templates/backend/api/_lib.ts +9 -2
  5. package/templates/backend/package.json +1 -1
  6. package/templates/catalog.json +5 -0
  7. package/templates/empty/package.json +1 -1
  8. package/templates/marketplace/.config/local.spa.template.yml +27 -0
  9. package/templates/marketplace/.oxlint-base.json +29 -0
  10. package/templates/marketplace/.oxlintrc.json +78 -0
  11. package/templates/marketplace/.rulesync/rules/frontend-api-boundary.md +36 -0
  12. package/templates/marketplace/.rulesync/rules/frontend-component-structure.md +38 -0
  13. package/templates/marketplace/.rulesync/rules/frontend-forms.md +32 -0
  14. package/templates/marketplace/.rulesync/rules/frontend-notifications.md +24 -0
  15. package/templates/marketplace/.rulesync/rules/frontend-povio-components.md +42 -0
  16. package/templates/marketplace/.rulesync/rules/frontend-povio-ui.md +45 -0
  17. package/templates/marketplace/.rulesync/rules/frontend-query-autocomplete.md +29 -0
  18. package/templates/marketplace/.rulesync/rules/frontend-tables-and-lists.md +34 -0
  19. package/templates/marketplace/.rulesync/rules/frontend-translations.md +26 -0
  20. package/templates/marketplace/.rulesync/rules/project-overview.md +32 -0
  21. package/templates/marketplace/.rulesync/rules/robodev-api.md +30 -0
  22. package/templates/marketplace/.rulesync/rules/robodev-auth.md +40 -0
  23. package/templates/marketplace/.rulesync/rules/robodev-database.md +22 -0
  24. package/templates/marketplace/.rulesync/rules/role-based-app-structure.md +36 -0
  25. package/templates/marketplace/.rulesync/skills/media-feature/SKILL.md +21 -0
  26. package/templates/marketplace/.rulesync/skills/povio-ui-styling/SKILL.md +208 -0
  27. package/templates/marketplace/.rulesync/skills/povio-ui-styling/agents/openai.yaml +4 -0
  28. package/templates/marketplace/.rulesync/skills/robodev-api-route/SKILL.md +13 -0
  29. package/templates/marketplace/.rulesync/skills/robodev-table/SKILL.md +12 -0
  30. package/templates/marketplace/README.md +40 -0
  31. package/templates/marketplace/api/_lib.ts +677 -0
  32. package/templates/marketplace/api/cart/[id].ts +51 -0
  33. package/templates/marketplace/api/cart.ts +70 -0
  34. package/templates/marketplace/api/categories.ts +11 -0
  35. package/templates/marketplace/api/checkout.ts +157 -0
  36. package/templates/marketplace/api/health.ts +7 -0
  37. package/templates/marketplace/api/listings/[id].ts +101 -0
  38. package/templates/marketplace/api/listings/paginate.ts +29 -0
  39. package/templates/marketplace/api/listings.ts +90 -0
  40. package/templates/marketplace/api/me.ts +14 -0
  41. package/templates/marketplace/api/orders/[id]/complete.ts +27 -0
  42. package/templates/marketplace/api/orders/[id]/ship.ts +24 -0
  43. package/templates/marketplace/api/orders/[id].ts +15 -0
  44. package/templates/marketplace/api/purchases.ts +19 -0
  45. package/templates/marketplace/api/reviews.ts +58 -0
  46. package/templates/marketplace/api/sales.ts +19 -0
  47. package/templates/marketplace/api/watches/[listingId].ts +18 -0
  48. package/templates/marketplace/api/watches.ts +51 -0
  49. package/templates/marketplace/apps/fe/index.html +24 -0
  50. package/templates/marketplace/apps/fe/openapi-codegen.config.ts +72 -0
  51. package/templates/marketplace/apps/fe/package.json +84 -0
  52. package/templates/marketplace/apps/fe/public/apple-touch-icon.png +0 -0
  53. package/templates/marketplace/apps/fe/public/favicon-96x96.png +0 -0
  54. package/templates/marketplace/apps/fe/public/favicon.ico +0 -0
  55. package/templates/marketplace/apps/fe/public/favicon.svg +3 -0
  56. package/templates/marketplace/apps/fe/public/site.webmanifest +21 -0
  57. package/templates/marketplace/apps/fe/public/web-app-manifest-192x192.png +0 -0
  58. package/templates/marketplace/apps/fe/public/web-app-manifest-512x512.png +0 -0
  59. package/templates/marketplace/apps/fe/src/assets/fonts/GeneralSans-Bold.otf +0 -0
  60. package/templates/marketplace/apps/fe/src/assets/fonts/GeneralSans-Medium.otf +0 -0
  61. package/templates/marketplace/apps/fe/src/assets/fonts/GeneralSans-Regular.otf +0 -0
  62. package/templates/marketplace/apps/fe/src/assets/fonts/GeneralSans-Semibold.otf +0 -0
  63. package/templates/marketplace/apps/fe/src/assets/locales/en/translation.json +335 -0
  64. package/templates/marketplace/apps/fe/src/assets/locales/sl/translation.json +335 -0
  65. package/templates/marketplace/apps/fe/src/clients/app-rest-client.ts +15 -0
  66. package/templates/marketplace/apps/fe/src/clients/auth-token-store.ts +101 -0
  67. package/templates/marketplace/apps/fe/src/clients/rest/app-error-handler.ts +31 -0
  68. package/templates/marketplace/apps/fe/src/clients/rest/interceptors/authorization-header.interceptor.ts +15 -0
  69. package/templates/marketplace/apps/fe/src/clients/rest/interceptors/refresh-token.interceptor.ts +37 -0
  70. package/templates/marketplace/apps/fe/src/clients/rest/interceptors/response.interceptor.ts +17 -0
  71. package/templates/marketplace/apps/fe/src/components/404.tsx +18 -0
  72. package/templates/marketplace/apps/fe/src/components/features/auth/AuthBrandPanel.tsx +60 -0
  73. package/templates/marketplace/apps/fe/src/components/features/auth/AuthLayout.tsx +23 -0
  74. package/templates/marketplace/apps/fe/src/components/features/auth/LoginPage.tsx +111 -0
  75. package/templates/marketplace/apps/fe/src/components/features/auth/RegisterPage.tsx +143 -0
  76. package/templates/marketplace/apps/fe/src/components/features/marketplace/BrowsePage.tsx +76 -0
  77. package/templates/marketplace/apps/fe/src/components/features/marketplace/CartPage.tsx +88 -0
  78. package/templates/marketplace/apps/fe/src/components/features/marketplace/CheckoutPage.tsx +193 -0
  79. package/templates/marketplace/apps/fe/src/components/features/marketplace/ListingCard.tsx +50 -0
  80. package/templates/marketplace/apps/fe/src/components/features/marketplace/ListingDetailsPage.tsx +152 -0
  81. package/templates/marketplace/apps/fe/src/components/features/marketplace/ListingFormPage.tsx +243 -0
  82. package/templates/marketplace/apps/fe/src/components/features/marketplace/MyListingsPage.tsx +84 -0
  83. package/templates/marketplace/apps/fe/src/components/features/marketplace/OrdersPage.tsx +224 -0
  84. package/templates/marketplace/apps/fe/src/components/features/marketplace/WatchlistPage.tsx +56 -0
  85. package/templates/marketplace/apps/fe/src/components/features/profile/ProfilePage.tsx +96 -0
  86. package/templates/marketplace/apps/fe/src/components/googleAnalytics/GoogleAnalytics.tsx +35 -0
  87. package/templates/marketplace/apps/fe/src/components/layout/AppLayout.tsx +19 -0
  88. package/templates/marketplace/apps/fe/src/components/layout/app-header/AppHeader.tsx +95 -0
  89. package/templates/marketplace/apps/fe/src/components/layout/app-header/MobileNavigation.tsx +55 -0
  90. package/templates/marketplace/apps/fe/src/components/layout/app-header/NavLink.tsx +29 -0
  91. package/templates/marketplace/apps/fe/src/components/shared/branding/BrandLogo.tsx +13 -0
  92. package/templates/marketplace/apps/fe/src/components/shared/error/ErrorFallback.tsx +43 -0
  93. package/templates/marketplace/apps/fe/src/components/shared/error/ErrorText.tsx +20 -0
  94. package/templates/marketplace/apps/fe/src/components/shared/error/NotFound.tsx +36 -0
  95. package/templates/marketplace/apps/fe/src/components/shared/forms/RequiredLabel.tsx +21 -0
  96. package/templates/marketplace/apps/fe/src/components/shared/forms/RowInputWrapper.tsx +50 -0
  97. package/templates/marketplace/apps/fe/src/components/shared/head/AppHead.tsx +32 -0
  98. package/templates/marketplace/apps/fe/src/components/shared/head/DefaultAppHead.tsx +34 -0
  99. package/templates/marketplace/apps/fe/src/components/shared/layout/LoadingState.tsx +9 -0
  100. package/templates/marketplace/apps/fe/src/components/shared/layout/ThinPageWrapper.tsx +5 -0
  101. package/templates/marketplace/apps/fe/src/components/shared/page/PageHeader.tsx +69 -0
  102. package/templates/marketplace/apps/fe/src/components/shared/ui/Card.tsx +60 -0
  103. package/templates/marketplace/apps/fe/src/components/shared/ui/GoogleLoginButton.tsx +19 -0
  104. package/templates/marketplace/apps/fe/src/components/shared/ui/RequiredLabel.tsx +22 -0
  105. package/templates/marketplace/apps/fe/src/components/shared/ui/TableActions.tsx +22 -0
  106. package/templates/marketplace/apps/fe/src/config/app.config.ts +35 -0
  107. package/templates/marketplace/apps/fe/src/config/i18n.ts +43 -0
  108. package/templates/marketplace/apps/fe/src/config/inits/a11y.ts +14 -0
  109. package/templates/marketplace/apps/fe/src/config/inits/logger.ts +7 -0
  110. package/templates/marketplace/apps/fe/src/config/inits/sentry.ts +21 -0
  111. package/templates/marketplace/apps/fe/src/config/jwt.config.ts +2 -0
  112. package/templates/marketplace/apps/fe/src/config/query.config.ts +20 -0
  113. package/templates/marketplace/apps/fe/src/hooks/useAuth.ts +5 -0
  114. package/templates/marketplace/apps/fe/src/main.tsx +52 -0
  115. package/templates/marketplace/apps/fe/src/pages/(guest)/login.tsx +23 -0
  116. package/templates/marketplace/apps/fe/src/pages/(guest)/register.tsx +23 -0
  117. package/templates/marketplace/apps/fe/src/pages/(guest)/route.tsx +18 -0
  118. package/templates/marketplace/apps/fe/src/pages/(private)/cart.tsx +22 -0
  119. package/templates/marketplace/apps/fe/src/pages/(private)/checkout.tsx +22 -0
  120. package/templates/marketplace/apps/fe/src/pages/(private)/index.tsx +22 -0
  121. package/templates/marketplace/apps/fe/src/pages/(private)/listings/$id/index.tsx +37 -0
  122. package/templates/marketplace/apps/fe/src/pages/(private)/my-listings.tsx +22 -0
  123. package/templates/marketplace/apps/fe/src/pages/(private)/orders/$id.tsx +40 -0
  124. package/templates/marketplace/apps/fe/src/pages/(private)/orders/index.tsx +22 -0
  125. package/templates/marketplace/apps/fe/src/pages/(private)/profile.tsx +23 -0
  126. package/templates/marketplace/apps/fe/src/pages/(private)/route.tsx +18 -0
  127. package/templates/marketplace/apps/fe/src/pages/(private)/sales.tsx +22 -0
  128. package/templates/marketplace/apps/fe/src/pages/(private)/sell/$id.tsx +44 -0
  129. package/templates/marketplace/apps/fe/src/pages/(private)/sell/index.tsx +19 -0
  130. package/templates/marketplace/apps/fe/src/pages/(private)/watchlist.tsx +22 -0
  131. package/templates/marketplace/apps/fe/src/pages/(public)/auth.tsx +37 -0
  132. package/templates/marketplace/apps/fe/src/pages/(public)/route.tsx +9 -0
  133. package/templates/marketplace/apps/fe/src/pages/__root.tsx +164 -0
  134. package/templates/marketplace/apps/fe/src/providers/AppErrorBoundary.tsx +10 -0
  135. package/templates/marketplace/apps/fe/src/providers/OpenApiRuntimeProvider.tsx +31 -0
  136. package/templates/marketplace/apps/fe/src/providers/index.tsx +44 -0
  137. package/templates/marketplace/apps/fe/src/providers/jwt.provider.tsx +95 -0
  138. package/templates/marketplace/apps/fe/src/routeTree.gen.ts +435 -0
  139. package/templates/marketplace/apps/fe/src/styles/base.css +103 -0
  140. package/templates/marketplace/apps/fe/src/styles/fonts/fonts.tsx +10 -0
  141. package/templates/marketplace/apps/fe/src/styles/fonts/general-sans.css +31 -0
  142. package/templates/marketplace/apps/fe/src/styles/globals.css +28 -0
  143. package/templates/marketplace/apps/fe/src/styles/overrides/defaults/button.override.ts +536 -0
  144. package/templates/marketplace/apps/fe/src/styles/overrides/defaults/checkbox.override.ts +71 -0
  145. package/templates/marketplace/apps/fe/src/styles/overrides/defaults/input.override.ts +252 -0
  146. package/templates/marketplace/apps/fe/src/styles/overrides/defaults/label.override.ts +91 -0
  147. package/templates/marketplace/apps/fe/src/styles/overrides/defaults/modal.override.ts +57 -0
  148. package/templates/marketplace/apps/fe/src/styles/overrides/defaults/radio.override.ts +46 -0
  149. package/templates/marketplace/apps/fe/src/styles/overrides/defaults/table.override.ts +104 -0
  150. package/templates/marketplace/apps/fe/src/styles/overrides/defaults/tag.override.ts +66 -0
  151. package/templates/marketplace/apps/fe/src/styles/overrides/defaults/typography.override.ts +115 -0
  152. package/templates/marketplace/apps/fe/src/styles/overrides/outline.clsx.ts +10 -0
  153. package/templates/marketplace/apps/fe/src/styles/overrides/uiOverrides.override.ts +60 -0
  154. package/templates/marketplace/apps/fe/src/styles/theme.css +2177 -0
  155. package/templates/marketplace/apps/fe/src/types/i18next.d.ts +12 -0
  156. package/templates/marketplace/apps/fe/src/types/table.d.ts +17 -0
  157. package/templates/marketplace/apps/fe/src/types/ui.d.ts +26 -0
  158. package/templates/marketplace/apps/fe/src/types/vite-env.d.ts +20 -0
  159. package/templates/marketplace/apps/fe/src/utils/date.utils.ts +17 -0
  160. package/templates/marketplace/apps/fe/src/utils/image-fallback.ts +9 -0
  161. package/templates/marketplace/apps/fe/src/utils/listing-form.test.ts +69 -0
  162. package/templates/marketplace/apps/fe/src/utils/listing-form.ts +77 -0
  163. package/templates/marketplace/apps/fe/src/utils/listing-submit.ts +29 -0
  164. package/templates/marketplace/apps/fe/src/utils/number.utils.ts +12 -0
  165. package/templates/marketplace/apps/fe/src/utils/string.utils.ts +5 -0
  166. package/templates/marketplace/apps/fe/src/vite-env.d.ts +1 -0
  167. package/templates/marketplace/apps/fe/tsconfig.app.json +32 -0
  168. package/templates/marketplace/apps/fe/tsconfig.json +9 -0
  169. package/templates/marketplace/apps/fe/tsconfig.node.json +31 -0
  170. package/templates/marketplace/apps/fe/vite.config.ts +125 -0
  171. package/templates/marketplace/database.ts +154 -0
  172. package/templates/marketplace/openapi.json +2303 -0
  173. package/templates/marketplace/oxfmt.config.js +23 -0
  174. package/templates/marketplace/package.json +18 -0
  175. package/templates/marketplace/rulesync.jsonc +18 -0
  176. package/templates/marketplace/tsconfig.json +11 -0
  177. package/templates/space/api/_lib.ts +9 -2
  178. package/templates/space/package.json +1 -1
@@ -0,0 +1,2303 @@
1
+ {
2
+ "info": {
3
+ "title": "Marketplace API",
4
+ "description": "OpenAPI spec for the Tiny marketplace backend and reserved /api/user auth.",
5
+ "version": "1.0.0"
6
+ },
7
+ "servers": [
8
+ {
9
+ "url": "/",
10
+ "description": "Current origin"
11
+ }
12
+ ],
13
+ "openapi": "3.0.3",
14
+ "components": {
15
+ "schemas": {
16
+ "HealthResponse": {
17
+ "type": "object",
18
+ "properties": {
19
+ "ok": {
20
+ "type": "boolean",
21
+ "enum": [
22
+ true
23
+ ]
24
+ }
25
+ },
26
+ "required": [
27
+ "ok"
28
+ ]
29
+ },
30
+ "MeUser": {
31
+ "type": "object",
32
+ "properties": {
33
+ "id": {
34
+ "type": "string"
35
+ },
36
+ "email": {
37
+ "type": "string"
38
+ },
39
+ "name": {
40
+ "type": "string",
41
+ "nullable": true
42
+ }
43
+ },
44
+ "required": [
45
+ "id",
46
+ "email"
47
+ ]
48
+ },
49
+ "MeResponse": {
50
+ "type": "object",
51
+ "properties": {
52
+ "user": {
53
+ "$ref": "#/components/schemas/MeUser"
54
+ }
55
+ },
56
+ "required": [
57
+ "user"
58
+ ]
59
+ },
60
+ "UserMeResponse": {
61
+ "type": "object",
62
+ "properties": {
63
+ "id": {
64
+ "type": "string"
65
+ },
66
+ "name": {
67
+ "nullable": true,
68
+ "type": "string"
69
+ },
70
+ "email": {
71
+ "nullable": true,
72
+ "type": "string",
73
+ "format": "email"
74
+ }
75
+ },
76
+ "required": [
77
+ "id",
78
+ "name",
79
+ "email"
80
+ ]
81
+ },
82
+ "UserMeUpdateRequest": {
83
+ "type": "object",
84
+ "properties": {
85
+ "name": {
86
+ "type": "string"
87
+ },
88
+ "email": {
89
+ "type": "string",
90
+ "minLength": 1,
91
+ "format": "email"
92
+ }
93
+ }
94
+ },
95
+ "UserPushTokensResponse": {
96
+ "type": "array",
97
+ "items": {
98
+ "$ref": "#/components/schemas/UserPushTokensCreateResponse"
99
+ }
100
+ },
101
+ "UserPushTokenCreate": {
102
+ "type": "object",
103
+ "properties": {
104
+ "token": {
105
+ "type": "string",
106
+ "minLength": 1
107
+ },
108
+ "provider": {
109
+ "type": "string",
110
+ "minLength": 1
111
+ },
112
+ "title": {
113
+ "nullable": true,
114
+ "type": "string"
115
+ },
116
+ "expiresAt": {
117
+ "nullable": true,
118
+ "type": "string"
119
+ }
120
+ },
121
+ "required": [
122
+ "token",
123
+ "provider"
124
+ ]
125
+ },
126
+ "UserPushTokensCreateResponse": {
127
+ "type": "object",
128
+ "properties": {
129
+ "id": {
130
+ "type": "string"
131
+ },
132
+ "resourceName": {
133
+ "type": "string"
134
+ },
135
+ "resourceLabel": {
136
+ "nullable": true,
137
+ "type": "string"
138
+ },
139
+ "module": {
140
+ "nullable": true,
141
+ "type": "string"
142
+ },
143
+ "resourceId": {
144
+ "nullable": true,
145
+ "type": "string"
146
+ },
147
+ "token": {
148
+ "type": "string"
149
+ },
150
+ "provider": {
151
+ "type": "string"
152
+ },
153
+ "expiresAt": {
154
+ "nullable": true,
155
+ "type": "string"
156
+ },
157
+ "title": {
158
+ "nullable": true,
159
+ "type": "string"
160
+ },
161
+ "createdAt": {
162
+ "type": "string"
163
+ },
164
+ "updatedAt": {
165
+ "type": "string"
166
+ }
167
+ },
168
+ "required": [
169
+ "id",
170
+ "resourceName",
171
+ "resourceLabel",
172
+ "module",
173
+ "resourceId",
174
+ "token",
175
+ "provider",
176
+ "expiresAt",
177
+ "title",
178
+ "createdAt",
179
+ "updatedAt"
180
+ ]
181
+ },
182
+ "StatusResponse": {
183
+ "type": "object",
184
+ "properties": {
185
+ "status": {
186
+ "type": "string"
187
+ },
188
+ "message": {
189
+ "type": "string"
190
+ },
191
+ "code": {
192
+ "type": "string"
193
+ }
194
+ },
195
+ "required": [
196
+ "status",
197
+ "message",
198
+ "code"
199
+ ]
200
+ },
201
+ "AuthnTokenResponse": {
202
+ "type": "object",
203
+ "properties": {
204
+ "accessToken": {
205
+ "type": "string"
206
+ },
207
+ "refreshToken": {
208
+ "type": "string"
209
+ }
210
+ },
211
+ "required": [
212
+ "accessToken"
213
+ ]
214
+ },
215
+ "UserAuthPasswordLoginRequest": {
216
+ "type": "object",
217
+ "properties": {
218
+ "email": {
219
+ "type": "string",
220
+ "minLength": 1,
221
+ "format": "email"
222
+ },
223
+ "password": {
224
+ "type": "string",
225
+ "minLength": 1
226
+ }
227
+ },
228
+ "required": [
229
+ "email",
230
+ "password"
231
+ ]
232
+ },
233
+ "UserAuthPasswordRegisterRequest": {
234
+ "type": "object",
235
+ "properties": {
236
+ "email": {
237
+ "type": "string",
238
+ "minLength": 1,
239
+ "format": "email"
240
+ },
241
+ "password": {
242
+ "type": "string",
243
+ "minLength": 12
244
+ },
245
+ "name": {
246
+ "type": "string"
247
+ }
248
+ },
249
+ "required": [
250
+ "email",
251
+ "password"
252
+ ]
253
+ },
254
+ "AuthnTokenRequest": {
255
+ "type": "object",
256
+ "properties": {
257
+ "refreshToken": {
258
+ "type": "string",
259
+ "minLength": 1
260
+ }
261
+ },
262
+ "required": [
263
+ "refreshToken"
264
+ ]
265
+ },
266
+ "UserAuthEmailGenerateRequest": {
267
+ "type": "object",
268
+ "properties": {
269
+ "email": {
270
+ "type": "string",
271
+ "format": "email"
272
+ }
273
+ },
274
+ "required": [
275
+ "email"
276
+ ]
277
+ },
278
+ "UserAuthMagicConsumeRequest": {
279
+ "type": "object",
280
+ "properties": {
281
+ "code": {
282
+ "type": "string"
283
+ }
284
+ },
285
+ "required": [
286
+ "code"
287
+ ]
288
+ },
289
+ "ImageDto": {
290
+ "type": "object",
291
+ "properties": {
292
+ "id": {
293
+ "type": "string"
294
+ },
295
+ "url": {
296
+ "type": "string"
297
+ }
298
+ },
299
+ "required": [
300
+ "id",
301
+ "url"
302
+ ]
303
+ },
304
+ "CategoryDto": {
305
+ "type": "object",
306
+ "properties": {
307
+ "id": {
308
+ "type": "string"
309
+ },
310
+ "slug": {
311
+ "type": "string"
312
+ },
313
+ "name": {
314
+ "type": "string"
315
+ }
316
+ },
317
+ "required": [
318
+ "id",
319
+ "slug",
320
+ "name"
321
+ ]
322
+ },
323
+ "ListingDto": {
324
+ "type": "object",
325
+ "properties": {
326
+ "id": {
327
+ "type": "string"
328
+ },
329
+ "sellerId": {
330
+ "type": "string"
331
+ },
332
+ "sellerName": {
333
+ "type": "string",
334
+ "nullable": true
335
+ },
336
+ "sellerEmail": {
337
+ "type": "string"
338
+ },
339
+ "categoryId": {
340
+ "type": "string"
341
+ },
342
+ "title": {
343
+ "type": "string"
344
+ },
345
+ "description": {
346
+ "type": "string",
347
+ "nullable": true
348
+ },
349
+ "priceCents": {
350
+ "type": "integer"
351
+ },
352
+ "quantity": {
353
+ "type": "integer"
354
+ },
355
+ "shippingCents": {
356
+ "type": "integer"
357
+ },
358
+ "shippingDays": {
359
+ "type": "integer"
360
+ },
361
+ "status": {
362
+ "type": "string",
363
+ "enum": [
364
+ "active",
365
+ "inactive"
366
+ ]
367
+ },
368
+ "createdAt": {
369
+ "type": "string"
370
+ },
371
+ "updatedAt": {
372
+ "type": "string"
373
+ },
374
+ "images": {
375
+ "type": "array",
376
+ "items": {
377
+ "$ref": "#/components/schemas/ImageDto"
378
+ }
379
+ },
380
+ "category": {
381
+ "nullable": true,
382
+ "allOf": [
383
+ {
384
+ "$ref": "#/components/schemas/CategoryDto"
385
+ }
386
+ ]
387
+ },
388
+ "sellerAverageRating": {
389
+ "type": "number",
390
+ "nullable": true
391
+ },
392
+ "watchedByMe": {
393
+ "type": "boolean"
394
+ }
395
+ },
396
+ "required": [
397
+ "id",
398
+ "sellerId",
399
+ "sellerEmail",
400
+ "categoryId",
401
+ "title",
402
+ "priceCents",
403
+ "quantity",
404
+ "shippingCents",
405
+ "shippingDays",
406
+ "status",
407
+ "createdAt",
408
+ "updatedAt",
409
+ "images",
410
+ "watchedByMe"
411
+ ]
412
+ },
413
+ "ListingsCreateRequestDto": {
414
+ "type": "object",
415
+ "properties": {
416
+ "title": {
417
+ "type": "string",
418
+ "minLength": 1
419
+ },
420
+ "description": {
421
+ "type": "string"
422
+ },
423
+ "categoryId": {
424
+ "type": "string",
425
+ "minLength": 1
426
+ },
427
+ "priceCents": {
428
+ "type": "integer",
429
+ "minimum": 0
430
+ },
431
+ "quantity": {
432
+ "type": "integer",
433
+ "minimum": 0
434
+ },
435
+ "shippingCents": {
436
+ "type": "integer",
437
+ "minimum": 0
438
+ },
439
+ "shippingDays": {
440
+ "type": "integer",
441
+ "minimum": 1
442
+ },
443
+ "status": {
444
+ "type": "string",
445
+ "enum": [
446
+ "active",
447
+ "inactive"
448
+ ]
449
+ },
450
+ "removeImageIds": {
451
+ "type": "string"
452
+ },
453
+ "file": {
454
+ "type": "string",
455
+ "format": "binary"
456
+ },
457
+ "files": {
458
+ "type": "array",
459
+ "items": {
460
+ "type": "string",
461
+ "format": "binary"
462
+ }
463
+ }
464
+ },
465
+ "required": [
466
+ "title",
467
+ "categoryId",
468
+ "priceCents",
469
+ "quantity",
470
+ "shippingCents",
471
+ "shippingDays"
472
+ ]
473
+ },
474
+ "ListingsGetAllResponse": {
475
+ "type": "array",
476
+ "items": {
477
+ "$ref": "#/components/schemas/ListingDto"
478
+ }
479
+ },
480
+ "ListingsPaginateResponse": {
481
+ "type": "object",
482
+ "properties": {
483
+ "page": {
484
+ "type": "number",
485
+ "nullable": true
486
+ },
487
+ "cursor": {
488
+ "type": "string",
489
+ "nullable": true
490
+ },
491
+ "nextCursor": {
492
+ "type": "string",
493
+ "nullable": true
494
+ },
495
+ "limit": {
496
+ "type": "number"
497
+ },
498
+ "totalItems": {
499
+ "type": "number"
500
+ },
501
+ "items": {
502
+ "type": "array",
503
+ "items": {
504
+ "$ref": "#/components/schemas/ListingDto"
505
+ }
506
+ }
507
+ },
508
+ "required": [
509
+ "limit",
510
+ "totalItems",
511
+ "items"
512
+ ]
513
+ },
514
+ "CartItemDto": {
515
+ "type": "object",
516
+ "properties": {
517
+ "id": {
518
+ "type": "string"
519
+ },
520
+ "userId": {
521
+ "type": "string"
522
+ },
523
+ "listingId": {
524
+ "type": "string"
525
+ },
526
+ "quantity": {
527
+ "type": "integer"
528
+ },
529
+ "listing": {
530
+ "$ref": "#/components/schemas/ListingDto"
531
+ }
532
+ },
533
+ "required": [
534
+ "id",
535
+ "userId",
536
+ "listingId",
537
+ "quantity",
538
+ "listing"
539
+ ]
540
+ },
541
+ "CartGetAllResponse": {
542
+ "type": "array",
543
+ "items": {
544
+ "$ref": "#/components/schemas/CartItemDto"
545
+ }
546
+ },
547
+ "CartCreateRequest": {
548
+ "type": "object",
549
+ "properties": {
550
+ "listingId": {
551
+ "type": "string",
552
+ "minLength": 1
553
+ },
554
+ "quantity": {
555
+ "type": "integer",
556
+ "minimum": 1
557
+ }
558
+ },
559
+ "required": [
560
+ "listingId",
561
+ "quantity"
562
+ ]
563
+ },
564
+ "CartUpdateRequest": {
565
+ "type": "object",
566
+ "properties": {
567
+ "quantity": {
568
+ "type": "integer",
569
+ "minimum": 1
570
+ }
571
+ },
572
+ "required": [
573
+ "quantity"
574
+ ]
575
+ },
576
+ "CheckoutRequest": {
577
+ "type": "object",
578
+ "properties": {
579
+ "shippingName": {
580
+ "type": "string",
581
+ "minLength": 1
582
+ },
583
+ "shippingLine1": {
584
+ "type": "string",
585
+ "minLength": 1
586
+ },
587
+ "shippingLine2": {
588
+ "type": "string"
589
+ },
590
+ "shippingCity": {
591
+ "type": "string",
592
+ "minLength": 1
593
+ },
594
+ "shippingRegion": {
595
+ "type": "string"
596
+ },
597
+ "shippingPostal": {
598
+ "type": "string",
599
+ "minLength": 1
600
+ },
601
+ "shippingCountry": {
602
+ "type": "string",
603
+ "minLength": 1
604
+ },
605
+ "last4": {
606
+ "type": "string",
607
+ "pattern": "^\\d{4}$"
608
+ }
609
+ },
610
+ "required": [
611
+ "shippingName",
612
+ "shippingLine1",
613
+ "shippingCity",
614
+ "shippingPostal",
615
+ "shippingCountry"
616
+ ]
617
+ },
618
+ "OrderItemDto": {
619
+ "type": "object",
620
+ "properties": {
621
+ "id": {
622
+ "type": "string"
623
+ },
624
+ "orderId": {
625
+ "type": "string"
626
+ },
627
+ "listingId": {
628
+ "type": "string"
629
+ },
630
+ "title": {
631
+ "type": "string"
632
+ },
633
+ "qty": {
634
+ "type": "integer"
635
+ },
636
+ "unitPriceCents": {
637
+ "type": "integer"
638
+ }
639
+ },
640
+ "required": [
641
+ "id",
642
+ "orderId",
643
+ "listingId",
644
+ "title",
645
+ "qty",
646
+ "unitPriceCents"
647
+ ]
648
+ },
649
+ "OrderDto": {
650
+ "type": "object",
651
+ "properties": {
652
+ "id": {
653
+ "type": "string"
654
+ },
655
+ "buyerId": {
656
+ "type": "string"
657
+ },
658
+ "buyerEmail": {
659
+ "type": "string"
660
+ },
661
+ "sellerId": {
662
+ "type": "string"
663
+ },
664
+ "sellerEmail": {
665
+ "type": "string"
666
+ },
667
+ "status": {
668
+ "type": "string",
669
+ "enum": [
670
+ "paid",
671
+ "shipped",
672
+ "completed"
673
+ ]
674
+ },
675
+ "shippingName": {
676
+ "type": "string"
677
+ },
678
+ "shippingLine1": {
679
+ "type": "string"
680
+ },
681
+ "shippingLine2": {
682
+ "type": "string",
683
+ "nullable": true
684
+ },
685
+ "shippingCity": {
686
+ "type": "string"
687
+ },
688
+ "shippingRegion": {
689
+ "type": "string",
690
+ "nullable": true
691
+ },
692
+ "shippingPostal": {
693
+ "type": "string"
694
+ },
695
+ "shippingCountry": {
696
+ "type": "string"
697
+ },
698
+ "shippingCents": {
699
+ "type": "integer"
700
+ },
701
+ "totalCents": {
702
+ "type": "integer"
703
+ },
704
+ "last4": {
705
+ "type": "string",
706
+ "nullable": true
707
+ },
708
+ "createdAt": {
709
+ "type": "string"
710
+ },
711
+ "updatedAt": {
712
+ "type": "string"
713
+ },
714
+ "items": {
715
+ "type": "array",
716
+ "items": {
717
+ "$ref": "#/components/schemas/OrderItemDto"
718
+ }
719
+ }
720
+ },
721
+ "required": [
722
+ "id",
723
+ "buyerId",
724
+ "buyerEmail",
725
+ "sellerId",
726
+ "sellerEmail",
727
+ "status",
728
+ "shippingName",
729
+ "shippingLine1",
730
+ "shippingCity",
731
+ "shippingPostal",
732
+ "shippingCountry",
733
+ "shippingCents",
734
+ "totalCents",
735
+ "createdAt",
736
+ "updatedAt",
737
+ "items"
738
+ ]
739
+ },
740
+ "OrdersGetAllResponse": {
741
+ "type": "array",
742
+ "items": {
743
+ "$ref": "#/components/schemas/OrderDto"
744
+ }
745
+ },
746
+ "WatchItemDto": {
747
+ "type": "object",
748
+ "properties": {
749
+ "id": {
750
+ "type": "string"
751
+ },
752
+ "userId": {
753
+ "type": "string"
754
+ },
755
+ "listingId": {
756
+ "type": "string"
757
+ },
758
+ "listing": {
759
+ "$ref": "#/components/schemas/ListingDto"
760
+ }
761
+ },
762
+ "required": [
763
+ "id",
764
+ "userId",
765
+ "listingId",
766
+ "listing"
767
+ ]
768
+ },
769
+ "WatchesGetAllResponse": {
770
+ "type": "array",
771
+ "items": {
772
+ "$ref": "#/components/schemas/WatchItemDto"
773
+ }
774
+ },
775
+ "WatchCreateRequest": {
776
+ "type": "object",
777
+ "properties": {
778
+ "listingId": {
779
+ "type": "string",
780
+ "minLength": 1
781
+ }
782
+ },
783
+ "required": [
784
+ "listingId"
785
+ ]
786
+ },
787
+ "ReviewDto": {
788
+ "type": "object",
789
+ "properties": {
790
+ "id": {
791
+ "type": "string"
792
+ },
793
+ "listingId": {
794
+ "type": "string"
795
+ },
796
+ "orderId": {
797
+ "type": "string"
798
+ },
799
+ "buyerId": {
800
+ "type": "string"
801
+ },
802
+ "rating": {
803
+ "type": "integer",
804
+ "minimum": 1,
805
+ "maximum": 5
806
+ },
807
+ "body": {
808
+ "type": "string",
809
+ "nullable": true
810
+ },
811
+ "createdAt": {
812
+ "type": "string"
813
+ }
814
+ },
815
+ "required": [
816
+ "id",
817
+ "listingId",
818
+ "orderId",
819
+ "buyerId",
820
+ "rating",
821
+ "createdAt"
822
+ ]
823
+ },
824
+ "ReviewsGetAllResponse": {
825
+ "type": "array",
826
+ "items": {
827
+ "$ref": "#/components/schemas/ReviewDto"
828
+ }
829
+ },
830
+ "ReviewCreateRequest": {
831
+ "type": "object",
832
+ "properties": {
833
+ "listingId": {
834
+ "type": "string",
835
+ "minLength": 1
836
+ },
837
+ "orderId": {
838
+ "type": "string",
839
+ "minLength": 1
840
+ },
841
+ "rating": {
842
+ "type": "integer",
843
+ "minimum": 1,
844
+ "maximum": 5
845
+ },
846
+ "body": {
847
+ "type": "string"
848
+ }
849
+ },
850
+ "required": [
851
+ "listingId",
852
+ "orderId",
853
+ "rating"
854
+ ]
855
+ },
856
+ "CategoriesGetAllResponse": {
857
+ "type": "array",
858
+ "items": {
859
+ "$ref": "#/components/schemas/CategoryDto"
860
+ }
861
+ }
862
+ },
863
+ "securitySchemes": {
864
+ "bearerAuth": {
865
+ "type": "http",
866
+ "scheme": "bearer"
867
+ }
868
+ }
869
+ },
870
+ "paths": {
871
+ "/api/user/me": {
872
+ "get": {
873
+ "operationId": "UserMeController_get",
874
+ "tags": [
875
+ "User"
876
+ ],
877
+ "responses": {
878
+ "200": {
879
+ "description": "OK",
880
+ "content": {
881
+ "application/json": {
882
+ "schema": {
883
+ "$ref": "#/components/schemas/UserMeResponse"
884
+ }
885
+ }
886
+ }
887
+ },
888
+ "401": {
889
+ "description": "Unauthorized"
890
+ },
891
+ "403": {
892
+ "description": "Forbidden"
893
+ }
894
+ },
895
+ "security": [
896
+ {
897
+ "bearerAuth": []
898
+ }
899
+ ],
900
+ "x-bl": "Returns the authenticated user's profile for a valid access token.",
901
+ "x-acl": [
902
+ {
903
+ "action": "read",
904
+ "subject": "User"
905
+ }
906
+ ]
907
+ },
908
+ "put": {
909
+ "operationId": "UserMeController_update",
910
+ "tags": [
911
+ "User"
912
+ ],
913
+ "requestBody": {
914
+ "required": true,
915
+ "content": {
916
+ "application/json": {
917
+ "schema": {
918
+ "$ref": "#/components/schemas/UserMeUpdateRequest"
919
+ }
920
+ }
921
+ }
922
+ },
923
+ "responses": {
924
+ "200": {
925
+ "description": "OK",
926
+ "content": {
927
+ "application/json": {
928
+ "schema": {
929
+ "$ref": "#/components/schemas/UserMeResponse"
930
+ }
931
+ }
932
+ }
933
+ },
934
+ "401": {
935
+ "description": "Unauthorized"
936
+ },
937
+ "403": {
938
+ "description": "Forbidden"
939
+ }
940
+ },
941
+ "security": [
942
+ {
943
+ "bearerAuth": []
944
+ }
945
+ ],
946
+ "x-bl": "Updates the authenticated user's own name and email, enforcing unique email ownership, and returns the updated profile.",
947
+ "x-acl": [
948
+ {
949
+ "action": "update",
950
+ "subject": "User"
951
+ }
952
+ ]
953
+ }
954
+ },
955
+ "/api/user/push-tokens": {
956
+ "get": {
957
+ "operationId": "UserMePushTokensController_list",
958
+ "tags": [
959
+ "User"
960
+ ],
961
+ "responses": {
962
+ "200": {
963
+ "description": "OK",
964
+ "content": {
965
+ "application/json": {
966
+ "schema": {
967
+ "$ref": "#/components/schemas/UserPushTokensResponse"
968
+ }
969
+ }
970
+ }
971
+ }
972
+ },
973
+ "security": [
974
+ {
975
+ "bearerAuth": []
976
+ }
977
+ ],
978
+ "x-bl": "Lists push notification tokens owned by the authenticated user."
979
+ },
980
+ "post": {
981
+ "operationId": "UserMePushTokensController_create",
982
+ "tags": [
983
+ "User"
984
+ ],
985
+ "requestBody": {
986
+ "required": true,
987
+ "content": {
988
+ "application/json": {
989
+ "schema": {
990
+ "$ref": "#/components/schemas/UserPushTokenCreate"
991
+ }
992
+ }
993
+ }
994
+ },
995
+ "responses": {
996
+ "201": {
997
+ "description": "OK",
998
+ "content": {
999
+ "application/json": {
1000
+ "schema": {
1001
+ "$ref": "#/components/schemas/UserPushTokensCreateResponse"
1002
+ }
1003
+ }
1004
+ }
1005
+ }
1006
+ },
1007
+ "security": [
1008
+ {
1009
+ "bearerAuth": []
1010
+ }
1011
+ ],
1012
+ "x-bl": "Registers or refreshes a push notification token for the authenticated user."
1013
+ }
1014
+ },
1015
+ "/api/user/push-tokens/{id}": {
1016
+ "delete": {
1017
+ "operationId": "UserMePushTokensController_remove",
1018
+ "tags": [
1019
+ "User"
1020
+ ],
1021
+ "parameters": [
1022
+ {
1023
+ "name": "id",
1024
+ "in": "path",
1025
+ "required": true,
1026
+ "schema": {
1027
+ "type": "string"
1028
+ }
1029
+ }
1030
+ ],
1031
+ "responses": {
1032
+ "200": {
1033
+ "description": "OK",
1034
+ "content": {
1035
+ "application/json": {
1036
+ "schema": {
1037
+ "$ref": "#/components/schemas/UserPushTokensCreateResponse"
1038
+ }
1039
+ }
1040
+ }
1041
+ }
1042
+ },
1043
+ "security": [
1044
+ {
1045
+ "bearerAuth": []
1046
+ }
1047
+ ],
1048
+ "x-bl": "Deletes a push notification token only when owned by the authenticated user."
1049
+ }
1050
+ },
1051
+ "/api/user/auth/magic-link": {
1052
+ "get": {
1053
+ "operationId": "UserAuthMagicLinkController_generate",
1054
+ "tags": [
1055
+ "User Auth"
1056
+ ],
1057
+ "parameters": [
1058
+ {
1059
+ "name": "email",
1060
+ "in": "query",
1061
+ "required": true,
1062
+ "schema": {
1063
+ "type": "string",
1064
+ "format": "email"
1065
+ },
1066
+ "allowEmptyValue": true,
1067
+ "allowReserved": true
1068
+ }
1069
+ ],
1070
+ "responses": {
1071
+ "200": {
1072
+ "description": "OK",
1073
+ "content": {
1074
+ "application/json": {
1075
+ "schema": {
1076
+ "$ref": "#/components/schemas/StatusResponse"
1077
+ }
1078
+ }
1079
+ }
1080
+ }
1081
+ },
1082
+ "x-bl": "For an existing local user, creates a short-lived single-use magic login code and emails a callback link containing type=magic and the code. Returns the same generic success message regardless of whether an identity exists to prevent account enumeration."
1083
+ }
1084
+ },
1085
+ "/api/user/auth/magic-link/callback": {
1086
+ "get": {
1087
+ "operationId": "UserAuthMagicLinkController_consume",
1088
+ "tags": [
1089
+ "User Auth"
1090
+ ],
1091
+ "parameters": [
1092
+ {
1093
+ "name": "code",
1094
+ "in": "query",
1095
+ "required": true,
1096
+ "schema": {
1097
+ "type": "string"
1098
+ },
1099
+ "allowEmptyValue": true,
1100
+ "allowReserved": true
1101
+ }
1102
+ ],
1103
+ "responses": {
1104
+ "200": {
1105
+ "description": "OK",
1106
+ "content": {
1107
+ "application/json": {
1108
+ "schema": {
1109
+ "$ref": "#/components/schemas/AuthnTokenResponse"
1110
+ }
1111
+ }
1112
+ }
1113
+ }
1114
+ },
1115
+ "x-bl": "Consumes a valid, unexpired, previously unused magic login code for an existing local user, permanently marks the code used, and returns access and refresh tokens. Rejects invalid, expired, or reused codes."
1116
+ }
1117
+ },
1118
+ "/api/user/auth/login": {
1119
+ "post": {
1120
+ "operationId": "UserAuthLocalPasswordController_login",
1121
+ "tags": [
1122
+ "User Auth"
1123
+ ],
1124
+ "requestBody": {
1125
+ "required": true,
1126
+ "content": {
1127
+ "application/json": {
1128
+ "schema": {
1129
+ "$ref": "#/components/schemas/UserAuthPasswordLoginRequest"
1130
+ }
1131
+ }
1132
+ }
1133
+ },
1134
+ "responses": {
1135
+ "200": {
1136
+ "description": "OK",
1137
+ "content": {
1138
+ "application/json": {
1139
+ "schema": {
1140
+ "$ref": "#/components/schemas/AuthnTokenResponse"
1141
+ }
1142
+ }
1143
+ }
1144
+ }
1145
+ },
1146
+ "x-bl": "Validates local user credentials and returns access and refresh tokens for authenticated API requests."
1147
+ }
1148
+ },
1149
+ "/api/user/auth/register": {
1150
+ "post": {
1151
+ "operationId": "UserAuthLocalPasswordController_register",
1152
+ "tags": [
1153
+ "User Auth"
1154
+ ],
1155
+ "requestBody": {
1156
+ "required": true,
1157
+ "content": {
1158
+ "application/json": {
1159
+ "schema": {
1160
+ "$ref": "#/components/schemas/UserAuthPasswordRegisterRequest"
1161
+ }
1162
+ }
1163
+ }
1164
+ },
1165
+ "responses": {
1166
+ "201": {
1167
+ "description": "OK",
1168
+ "content": {
1169
+ "application/json": {
1170
+ "schema": {
1171
+ "$ref": "#/components/schemas/AuthnTokenResponse"
1172
+ }
1173
+ }
1174
+ }
1175
+ }
1176
+ },
1177
+ "x-bl": "Validates registration input, enforces unique email, creates a local user, sends a welcome email to the registered address, and returns access and refresh tokens."
1178
+ }
1179
+ },
1180
+ "/api/user/auth/refresh": {
1181
+ "post": {
1182
+ "operationId": "UserAuthJwtController_accessToken",
1183
+ "tags": [
1184
+ "User Auth"
1185
+ ],
1186
+ "requestBody": {
1187
+ "required": true,
1188
+ "content": {
1189
+ "application/json": {
1190
+ "schema": {
1191
+ "$ref": "#/components/schemas/AuthnTokenRequest"
1192
+ }
1193
+ }
1194
+ }
1195
+ },
1196
+ "responses": {
1197
+ "200": {
1198
+ "description": "OK",
1199
+ "content": {
1200
+ "application/json": {
1201
+ "schema": {
1202
+ "$ref": "#/components/schemas/AuthnTokenResponse"
1203
+ }
1204
+ }
1205
+ }
1206
+ }
1207
+ },
1208
+ "x-bl": "Validates a refresh token for an existing user and returns a new access and refresh token pair."
1209
+ }
1210
+ },
1211
+ "/api/user/auth/google/callback": {
1212
+ "get": {
1213
+ "operationId": "UserAuthGoogleController_login",
1214
+ "tags": [
1215
+ "User Auth"
1216
+ ],
1217
+ "responses": {
1218
+ "200": {
1219
+ "description": "OK",
1220
+ "content": {
1221
+ "application/json": {
1222
+ "schema": {
1223
+ "$ref": "#/components/schemas/AuthnTokenResponse"
1224
+ }
1225
+ }
1226
+ }
1227
+ }
1228
+ },
1229
+ "x-bl": "Completes Google authentication and returns access and refresh tokens."
1230
+ }
1231
+ },
1232
+ "/api/user/auth/apple/callback": {
1233
+ "get": {
1234
+ "operationId": "UserAuthAppleController_login",
1235
+ "tags": [
1236
+ "User Auth"
1237
+ ],
1238
+ "responses": {
1239
+ "200": {
1240
+ "description": "OK",
1241
+ "content": {
1242
+ "application/json": {
1243
+ "schema": {
1244
+ "$ref": "#/components/schemas/AuthnTokenResponse"
1245
+ }
1246
+ }
1247
+ }
1248
+ }
1249
+ },
1250
+ "x-bl": "Completes deterministic fake Apple authentication and returns access and refresh tokens."
1251
+ }
1252
+ },
1253
+ "/api/user/auth/forgot-password": {
1254
+ "post": {
1255
+ "operationId": "UserAuthForgotPasswordController_requestReset",
1256
+ "tags": [
1257
+ "User Auth"
1258
+ ],
1259
+ "requestBody": {
1260
+ "required": true,
1261
+ "content": {
1262
+ "application/json": {
1263
+ "schema": {
1264
+ "$ref": "#/components/schemas/UserAuthEmailGenerateRequest"
1265
+ }
1266
+ }
1267
+ }
1268
+ },
1269
+ "responses": {
1270
+ "200": {
1271
+ "description": "OK",
1272
+ "content": {
1273
+ "application/json": {
1274
+ "schema": {
1275
+ "$ref": "#/components/schemas/StatusResponse"
1276
+ }
1277
+ }
1278
+ }
1279
+ }
1280
+ },
1281
+ "x-bl": "For an existing user, creates a short-lived password reset code and emails it while preventing account enumeration."
1282
+ }
1283
+ },
1284
+ "/api/user/auth/forgot-password/callback": {
1285
+ "post": {
1286
+ "operationId": "UserAuthForgotPasswordController_consumeReset",
1287
+ "tags": [
1288
+ "User Auth"
1289
+ ],
1290
+ "requestBody": {
1291
+ "required": true,
1292
+ "content": {
1293
+ "application/json": {
1294
+ "schema": {
1295
+ "$ref": "#/components/schemas/UserAuthMagicConsumeRequest"
1296
+ }
1297
+ }
1298
+ }
1299
+ },
1300
+ "responses": {
1301
+ "200": {
1302
+ "description": "OK",
1303
+ "content": {
1304
+ "application/json": {
1305
+ "schema": {
1306
+ "$ref": "#/components/schemas/StatusResponse"
1307
+ }
1308
+ }
1309
+ }
1310
+ }
1311
+ },
1312
+ "x-bl": "Consumes a valid unused password reset code."
1313
+ }
1314
+ },
1315
+ "/api/health": {
1316
+ "get": {
1317
+ "operationId": "HealthController_get",
1318
+ "tags": [
1319
+ "Health"
1320
+ ],
1321
+ "responses": {
1322
+ "200": {
1323
+ "description": "OK",
1324
+ "content": {
1325
+ "application/json": {
1326
+ "schema": {
1327
+ "$ref": "#/components/schemas/HealthResponse"
1328
+ }
1329
+ }
1330
+ }
1331
+ }
1332
+ }
1333
+ }
1334
+ },
1335
+ "/api/me": {
1336
+ "get": {
1337
+ "operationId": "MeController_get",
1338
+ "tags": [
1339
+ "Me"
1340
+ ],
1341
+ "security": [
1342
+ {
1343
+ "bearerAuth": []
1344
+ }
1345
+ ],
1346
+ "responses": {
1347
+ "200": {
1348
+ "description": "OK",
1349
+ "content": {
1350
+ "application/json": {
1351
+ "schema": {
1352
+ "$ref": "#/components/schemas/MeResponse"
1353
+ }
1354
+ }
1355
+ }
1356
+ },
1357
+ "401": {
1358
+ "description": "Unauthorized"
1359
+ }
1360
+ }
1361
+ }
1362
+ },
1363
+ "/api/categories": {
1364
+ "get": {
1365
+ "operationId": "CategoryController_getAll",
1366
+ "tags": [
1367
+ "Category"
1368
+ ],
1369
+ "security": [
1370
+ {
1371
+ "bearerAuth": []
1372
+ }
1373
+ ],
1374
+ "responses": {
1375
+ "200": {
1376
+ "description": "OK",
1377
+ "content": {
1378
+ "application/json": {
1379
+ "schema": {
1380
+ "$ref": "#/components/schemas/CategoriesGetAllResponse"
1381
+ }
1382
+ }
1383
+ }
1384
+ },
1385
+ "401": {
1386
+ "description": "Unauthorized"
1387
+ },
1388
+ "403": {
1389
+ "description": "Forbidden"
1390
+ }
1391
+ }
1392
+ }
1393
+ },
1394
+ "/api/listings": {
1395
+ "get": {
1396
+ "operationId": "ListingController_getAll",
1397
+ "tags": [
1398
+ "Listing"
1399
+ ],
1400
+ "security": [
1401
+ {
1402
+ "bearerAuth": []
1403
+ }
1404
+ ],
1405
+ "parameters": [
1406
+ {
1407
+ "name": "mine",
1408
+ "in": "query",
1409
+ "schema": {
1410
+ "type": "string"
1411
+ }
1412
+ },
1413
+ {
1414
+ "name": "search",
1415
+ "in": "query",
1416
+ "schema": {
1417
+ "type": "string"
1418
+ }
1419
+ },
1420
+ {
1421
+ "name": "categoryId",
1422
+ "in": "query",
1423
+ "schema": {
1424
+ "type": "string"
1425
+ }
1426
+ }
1427
+ ],
1428
+ "responses": {
1429
+ "200": {
1430
+ "description": "OK",
1431
+ "content": {
1432
+ "application/json": {
1433
+ "schema": {
1434
+ "$ref": "#/components/schemas/ListingsGetAllResponse"
1435
+ }
1436
+ }
1437
+ }
1438
+ },
1439
+ "401": {
1440
+ "description": "Unauthorized"
1441
+ },
1442
+ "403": {
1443
+ "description": "Forbidden"
1444
+ }
1445
+ }
1446
+ },
1447
+ "post": {
1448
+ "operationId": "ListingController_create",
1449
+ "tags": [
1450
+ "Listing"
1451
+ ],
1452
+ "security": [
1453
+ {
1454
+ "bearerAuth": []
1455
+ }
1456
+ ],
1457
+ "requestBody": {
1458
+ "required": true,
1459
+ "content": {
1460
+ "multipart/form-data": {
1461
+ "schema": {
1462
+ "$ref": "#/components/schemas/ListingsCreateRequestDto"
1463
+ }
1464
+ }
1465
+ }
1466
+ },
1467
+ "responses": {
1468
+ "200": {
1469
+ "description": "OK",
1470
+ "content": {
1471
+ "application/json": {
1472
+ "schema": {
1473
+ "$ref": "#/components/schemas/ListingDto"
1474
+ }
1475
+ }
1476
+ }
1477
+ },
1478
+ "401": {
1479
+ "description": "Unauthorized"
1480
+ },
1481
+ "403": {
1482
+ "description": "Forbidden"
1483
+ }
1484
+ }
1485
+ }
1486
+ },
1487
+ "/api/listings/paginate": {
1488
+ "get": {
1489
+ "operationId": "ListingController_paginate",
1490
+ "tags": [
1491
+ "Listing"
1492
+ ],
1493
+ "security": [
1494
+ {
1495
+ "bearerAuth": []
1496
+ }
1497
+ ],
1498
+ "parameters": [
1499
+ {
1500
+ "name": "page",
1501
+ "in": "query",
1502
+ "schema": {
1503
+ "type": "integer"
1504
+ }
1505
+ },
1506
+ {
1507
+ "name": "limit",
1508
+ "in": "query",
1509
+ "schema": {
1510
+ "type": "integer"
1511
+ }
1512
+ },
1513
+ {
1514
+ "name": "search",
1515
+ "in": "query",
1516
+ "schema": {
1517
+ "type": "string"
1518
+ }
1519
+ },
1520
+ {
1521
+ "name": "categoryId",
1522
+ "in": "query",
1523
+ "schema": {
1524
+ "type": "string"
1525
+ }
1526
+ }
1527
+ ],
1528
+ "responses": {
1529
+ "200": {
1530
+ "description": "OK",
1531
+ "content": {
1532
+ "application/json": {
1533
+ "schema": {
1534
+ "$ref": "#/components/schemas/ListingsPaginateResponse"
1535
+ }
1536
+ }
1537
+ }
1538
+ },
1539
+ "401": {
1540
+ "description": "Unauthorized"
1541
+ },
1542
+ "403": {
1543
+ "description": "Forbidden"
1544
+ }
1545
+ }
1546
+ }
1547
+ },
1548
+ "/api/listings/{id}": {
1549
+ "get": {
1550
+ "operationId": "ListingController_getById",
1551
+ "tags": [
1552
+ "Listing"
1553
+ ],
1554
+ "security": [
1555
+ {
1556
+ "bearerAuth": []
1557
+ }
1558
+ ],
1559
+ "parameters": [
1560
+ {
1561
+ "name": "id",
1562
+ "in": "path",
1563
+ "required": true,
1564
+ "schema": {
1565
+ "type": "string"
1566
+ }
1567
+ }
1568
+ ],
1569
+ "responses": {
1570
+ "200": {
1571
+ "description": "OK",
1572
+ "content": {
1573
+ "application/json": {
1574
+ "schema": {
1575
+ "$ref": "#/components/schemas/ListingDto"
1576
+ }
1577
+ }
1578
+ }
1579
+ },
1580
+ "401": {
1581
+ "description": "Unauthorized"
1582
+ },
1583
+ "403": {
1584
+ "description": "Forbidden"
1585
+ }
1586
+ }
1587
+ },
1588
+ "put": {
1589
+ "operationId": "ListingController_update",
1590
+ "tags": [
1591
+ "Listing"
1592
+ ],
1593
+ "security": [
1594
+ {
1595
+ "bearerAuth": []
1596
+ }
1597
+ ],
1598
+ "parameters": [
1599
+ {
1600
+ "name": "id",
1601
+ "in": "path",
1602
+ "required": true,
1603
+ "schema": {
1604
+ "type": "string"
1605
+ }
1606
+ }
1607
+ ],
1608
+ "requestBody": {
1609
+ "required": true,
1610
+ "content": {
1611
+ "multipart/form-data": {
1612
+ "schema": {
1613
+ "$ref": "#/components/schemas/ListingsCreateRequestDto"
1614
+ }
1615
+ }
1616
+ }
1617
+ },
1618
+ "responses": {
1619
+ "200": {
1620
+ "description": "OK",
1621
+ "content": {
1622
+ "application/json": {
1623
+ "schema": {
1624
+ "$ref": "#/components/schemas/ListingDto"
1625
+ }
1626
+ }
1627
+ }
1628
+ },
1629
+ "401": {
1630
+ "description": "Unauthorized"
1631
+ },
1632
+ "403": {
1633
+ "description": "Forbidden"
1634
+ }
1635
+ }
1636
+ },
1637
+ "delete": {
1638
+ "operationId": "ListingController_delete",
1639
+ "tags": [
1640
+ "Listing"
1641
+ ],
1642
+ "security": [
1643
+ {
1644
+ "bearerAuth": []
1645
+ }
1646
+ ],
1647
+ "parameters": [
1648
+ {
1649
+ "name": "id",
1650
+ "in": "path",
1651
+ "required": true,
1652
+ "schema": {
1653
+ "type": "string"
1654
+ }
1655
+ }
1656
+ ],
1657
+ "responses": {
1658
+ "200": {
1659
+ "description": "OK",
1660
+ "content": {
1661
+ "application/json": {
1662
+ "schema": {
1663
+ "$ref": "#/components/schemas/ListingDto"
1664
+ }
1665
+ }
1666
+ }
1667
+ },
1668
+ "401": {
1669
+ "description": "Unauthorized"
1670
+ },
1671
+ "403": {
1672
+ "description": "Forbidden"
1673
+ }
1674
+ }
1675
+ }
1676
+ },
1677
+ "/api/cart": {
1678
+ "get": {
1679
+ "operationId": "CartController_getAll",
1680
+ "tags": [
1681
+ "Cart"
1682
+ ],
1683
+ "security": [
1684
+ {
1685
+ "bearerAuth": []
1686
+ }
1687
+ ],
1688
+ "responses": {
1689
+ "200": {
1690
+ "description": "OK",
1691
+ "content": {
1692
+ "application/json": {
1693
+ "schema": {
1694
+ "$ref": "#/components/schemas/CartGetAllResponse"
1695
+ }
1696
+ }
1697
+ }
1698
+ },
1699
+ "401": {
1700
+ "description": "Unauthorized"
1701
+ },
1702
+ "403": {
1703
+ "description": "Forbidden"
1704
+ }
1705
+ }
1706
+ },
1707
+ "post": {
1708
+ "operationId": "CartController_create",
1709
+ "tags": [
1710
+ "Cart"
1711
+ ],
1712
+ "security": [
1713
+ {
1714
+ "bearerAuth": []
1715
+ }
1716
+ ],
1717
+ "requestBody": {
1718
+ "required": true,
1719
+ "content": {
1720
+ "application/json": {
1721
+ "schema": {
1722
+ "$ref": "#/components/schemas/CartCreateRequest"
1723
+ }
1724
+ }
1725
+ }
1726
+ },
1727
+ "responses": {
1728
+ "200": {
1729
+ "description": "OK",
1730
+ "content": {
1731
+ "application/json": {
1732
+ "schema": {
1733
+ "$ref": "#/components/schemas/CartItemDto"
1734
+ }
1735
+ }
1736
+ }
1737
+ },
1738
+ "401": {
1739
+ "description": "Unauthorized"
1740
+ },
1741
+ "403": {
1742
+ "description": "Forbidden"
1743
+ }
1744
+ }
1745
+ }
1746
+ },
1747
+ "/api/cart/{id}": {
1748
+ "put": {
1749
+ "operationId": "CartController_update",
1750
+ "tags": [
1751
+ "Cart"
1752
+ ],
1753
+ "security": [
1754
+ {
1755
+ "bearerAuth": []
1756
+ }
1757
+ ],
1758
+ "parameters": [
1759
+ {
1760
+ "name": "id",
1761
+ "in": "path",
1762
+ "required": true,
1763
+ "schema": {
1764
+ "type": "string"
1765
+ }
1766
+ }
1767
+ ],
1768
+ "requestBody": {
1769
+ "required": true,
1770
+ "content": {
1771
+ "application/json": {
1772
+ "schema": {
1773
+ "$ref": "#/components/schemas/CartUpdateRequest"
1774
+ }
1775
+ }
1776
+ }
1777
+ },
1778
+ "responses": {
1779
+ "200": {
1780
+ "description": "OK",
1781
+ "content": {
1782
+ "application/json": {
1783
+ "schema": {
1784
+ "$ref": "#/components/schemas/CartItemDto"
1785
+ }
1786
+ }
1787
+ }
1788
+ },
1789
+ "401": {
1790
+ "description": "Unauthorized"
1791
+ },
1792
+ "403": {
1793
+ "description": "Forbidden"
1794
+ }
1795
+ }
1796
+ },
1797
+ "delete": {
1798
+ "operationId": "CartController_delete",
1799
+ "tags": [
1800
+ "Cart"
1801
+ ],
1802
+ "security": [
1803
+ {
1804
+ "bearerAuth": []
1805
+ }
1806
+ ],
1807
+ "parameters": [
1808
+ {
1809
+ "name": "id",
1810
+ "in": "path",
1811
+ "required": true,
1812
+ "schema": {
1813
+ "type": "string"
1814
+ }
1815
+ }
1816
+ ],
1817
+ "responses": {
1818
+ "204": {
1819
+ "description": "OK"
1820
+ },
1821
+ "401": {
1822
+ "description": "Unauthorized"
1823
+ },
1824
+ "403": {
1825
+ "description": "Forbidden"
1826
+ }
1827
+ }
1828
+ }
1829
+ },
1830
+ "/api/checkout": {
1831
+ "post": {
1832
+ "operationId": "CheckoutController_create",
1833
+ "tags": [
1834
+ "Checkout"
1835
+ ],
1836
+ "security": [
1837
+ {
1838
+ "bearerAuth": []
1839
+ }
1840
+ ],
1841
+ "requestBody": {
1842
+ "required": true,
1843
+ "content": {
1844
+ "application/json": {
1845
+ "schema": {
1846
+ "$ref": "#/components/schemas/CheckoutRequest"
1847
+ }
1848
+ }
1849
+ }
1850
+ },
1851
+ "responses": {
1852
+ "200": {
1853
+ "description": "OK",
1854
+ "content": {
1855
+ "application/json": {
1856
+ "schema": {
1857
+ "$ref": "#/components/schemas/OrdersGetAllResponse"
1858
+ }
1859
+ }
1860
+ }
1861
+ },
1862
+ "401": {
1863
+ "description": "Unauthorized"
1864
+ },
1865
+ "403": {
1866
+ "description": "Forbidden"
1867
+ }
1868
+ }
1869
+ }
1870
+ },
1871
+ "/api/purchases": {
1872
+ "get": {
1873
+ "operationId": "PurchaseController_getAll",
1874
+ "tags": [
1875
+ "Purchase"
1876
+ ],
1877
+ "security": [
1878
+ {
1879
+ "bearerAuth": []
1880
+ }
1881
+ ],
1882
+ "responses": {
1883
+ "200": {
1884
+ "description": "OK",
1885
+ "content": {
1886
+ "application/json": {
1887
+ "schema": {
1888
+ "$ref": "#/components/schemas/OrdersGetAllResponse"
1889
+ }
1890
+ }
1891
+ }
1892
+ },
1893
+ "401": {
1894
+ "description": "Unauthorized"
1895
+ },
1896
+ "403": {
1897
+ "description": "Forbidden"
1898
+ }
1899
+ }
1900
+ }
1901
+ },
1902
+ "/api/sales": {
1903
+ "get": {
1904
+ "operationId": "SaleController_getAll",
1905
+ "tags": [
1906
+ "Sale"
1907
+ ],
1908
+ "security": [
1909
+ {
1910
+ "bearerAuth": []
1911
+ }
1912
+ ],
1913
+ "responses": {
1914
+ "200": {
1915
+ "description": "OK",
1916
+ "content": {
1917
+ "application/json": {
1918
+ "schema": {
1919
+ "$ref": "#/components/schemas/OrdersGetAllResponse"
1920
+ }
1921
+ }
1922
+ }
1923
+ },
1924
+ "401": {
1925
+ "description": "Unauthorized"
1926
+ },
1927
+ "403": {
1928
+ "description": "Forbidden"
1929
+ }
1930
+ }
1931
+ }
1932
+ },
1933
+ "/api/orders/{id}": {
1934
+ "get": {
1935
+ "operationId": "OrderController_getById",
1936
+ "tags": [
1937
+ "Order"
1938
+ ],
1939
+ "security": [
1940
+ {
1941
+ "bearerAuth": []
1942
+ }
1943
+ ],
1944
+ "parameters": [
1945
+ {
1946
+ "name": "id",
1947
+ "in": "path",
1948
+ "required": true,
1949
+ "schema": {
1950
+ "type": "string"
1951
+ }
1952
+ }
1953
+ ],
1954
+ "responses": {
1955
+ "200": {
1956
+ "description": "OK",
1957
+ "content": {
1958
+ "application/json": {
1959
+ "schema": {
1960
+ "$ref": "#/components/schemas/OrderDto"
1961
+ }
1962
+ }
1963
+ }
1964
+ },
1965
+ "401": {
1966
+ "description": "Unauthorized"
1967
+ },
1968
+ "403": {
1969
+ "description": "Forbidden"
1970
+ }
1971
+ }
1972
+ }
1973
+ },
1974
+ "/api/orders/{id}/ship": {
1975
+ "post": {
1976
+ "operationId": "OrderController_ship",
1977
+ "tags": [
1978
+ "Order"
1979
+ ],
1980
+ "security": [
1981
+ {
1982
+ "bearerAuth": []
1983
+ }
1984
+ ],
1985
+ "parameters": [
1986
+ {
1987
+ "name": "id",
1988
+ "in": "path",
1989
+ "required": true,
1990
+ "schema": {
1991
+ "type": "string"
1992
+ }
1993
+ }
1994
+ ],
1995
+ "responses": {
1996
+ "200": {
1997
+ "description": "OK",
1998
+ "content": {
1999
+ "application/json": {
2000
+ "schema": {
2001
+ "$ref": "#/components/schemas/OrderDto"
2002
+ }
2003
+ }
2004
+ }
2005
+ },
2006
+ "401": {
2007
+ "description": "Unauthorized"
2008
+ },
2009
+ "403": {
2010
+ "description": "Forbidden"
2011
+ }
2012
+ }
2013
+ }
2014
+ },
2015
+ "/api/orders/{id}/complete": {
2016
+ "post": {
2017
+ "operationId": "OrderController_complete",
2018
+ "tags": [
2019
+ "Order"
2020
+ ],
2021
+ "security": [
2022
+ {
2023
+ "bearerAuth": []
2024
+ }
2025
+ ],
2026
+ "parameters": [
2027
+ {
2028
+ "name": "id",
2029
+ "in": "path",
2030
+ "required": true,
2031
+ "schema": {
2032
+ "type": "string"
2033
+ }
2034
+ }
2035
+ ],
2036
+ "responses": {
2037
+ "200": {
2038
+ "description": "OK",
2039
+ "content": {
2040
+ "application/json": {
2041
+ "schema": {
2042
+ "$ref": "#/components/schemas/OrderDto"
2043
+ }
2044
+ }
2045
+ }
2046
+ },
2047
+ "401": {
2048
+ "description": "Unauthorized"
2049
+ },
2050
+ "403": {
2051
+ "description": "Forbidden"
2052
+ }
2053
+ }
2054
+ }
2055
+ },
2056
+ "/api/watches": {
2057
+ "get": {
2058
+ "operationId": "WatchController_getAll",
2059
+ "tags": [
2060
+ "Watch"
2061
+ ],
2062
+ "security": [
2063
+ {
2064
+ "bearerAuth": []
2065
+ }
2066
+ ],
2067
+ "responses": {
2068
+ "200": {
2069
+ "description": "OK",
2070
+ "content": {
2071
+ "application/json": {
2072
+ "schema": {
2073
+ "$ref": "#/components/schemas/WatchesGetAllResponse"
2074
+ }
2075
+ }
2076
+ }
2077
+ },
2078
+ "401": {
2079
+ "description": "Unauthorized"
2080
+ },
2081
+ "403": {
2082
+ "description": "Forbidden"
2083
+ }
2084
+ }
2085
+ },
2086
+ "post": {
2087
+ "operationId": "WatchController_create",
2088
+ "tags": [
2089
+ "Watch"
2090
+ ],
2091
+ "security": [
2092
+ {
2093
+ "bearerAuth": []
2094
+ }
2095
+ ],
2096
+ "requestBody": {
2097
+ "required": true,
2098
+ "content": {
2099
+ "application/json": {
2100
+ "schema": {
2101
+ "$ref": "#/components/schemas/WatchCreateRequest"
2102
+ }
2103
+ }
2104
+ }
2105
+ },
2106
+ "responses": {
2107
+ "200": {
2108
+ "description": "OK",
2109
+ "content": {
2110
+ "application/json": {
2111
+ "schema": {
2112
+ "$ref": "#/components/schemas/WatchItemDto"
2113
+ }
2114
+ }
2115
+ }
2116
+ },
2117
+ "401": {
2118
+ "description": "Unauthorized"
2119
+ },
2120
+ "403": {
2121
+ "description": "Forbidden"
2122
+ }
2123
+ }
2124
+ }
2125
+ },
2126
+ "/api/watches/{listingId}": {
2127
+ "delete": {
2128
+ "operationId": "WatchController_delete",
2129
+ "tags": [
2130
+ "Watch"
2131
+ ],
2132
+ "security": [
2133
+ {
2134
+ "bearerAuth": []
2135
+ }
2136
+ ],
2137
+ "parameters": [
2138
+ {
2139
+ "name": "listingId",
2140
+ "in": "path",
2141
+ "required": true,
2142
+ "schema": {
2143
+ "type": "string"
2144
+ }
2145
+ }
2146
+ ],
2147
+ "responses": {
2148
+ "204": {
2149
+ "description": "OK"
2150
+ },
2151
+ "401": {
2152
+ "description": "Unauthorized"
2153
+ },
2154
+ "403": {
2155
+ "description": "Forbidden"
2156
+ }
2157
+ }
2158
+ }
2159
+ },
2160
+ "/api/reviews": {
2161
+ "get": {
2162
+ "operationId": "ReviewController_getAll",
2163
+ "tags": [
2164
+ "Review"
2165
+ ],
2166
+ "security": [
2167
+ {
2168
+ "bearerAuth": []
2169
+ }
2170
+ ],
2171
+ "parameters": [
2172
+ {
2173
+ "name": "listingId",
2174
+ "in": "query",
2175
+ "required": true,
2176
+ "schema": {
2177
+ "type": "string"
2178
+ }
2179
+ }
2180
+ ],
2181
+ "responses": {
2182
+ "200": {
2183
+ "description": "OK",
2184
+ "content": {
2185
+ "application/json": {
2186
+ "schema": {
2187
+ "$ref": "#/components/schemas/ReviewsGetAllResponse"
2188
+ }
2189
+ }
2190
+ }
2191
+ },
2192
+ "401": {
2193
+ "description": "Unauthorized"
2194
+ },
2195
+ "403": {
2196
+ "description": "Forbidden"
2197
+ }
2198
+ }
2199
+ },
2200
+ "post": {
2201
+ "operationId": "ReviewController_create",
2202
+ "tags": [
2203
+ "Review"
2204
+ ],
2205
+ "security": [
2206
+ {
2207
+ "bearerAuth": []
2208
+ }
2209
+ ],
2210
+ "requestBody": {
2211
+ "required": true,
2212
+ "content": {
2213
+ "application/json": {
2214
+ "schema": {
2215
+ "$ref": "#/components/schemas/ReviewCreateRequest"
2216
+ }
2217
+ }
2218
+ }
2219
+ },
2220
+ "responses": {
2221
+ "200": {
2222
+ "description": "OK",
2223
+ "content": {
2224
+ "application/json": {
2225
+ "schema": {
2226
+ "$ref": "#/components/schemas/ReviewDto"
2227
+ }
2228
+ }
2229
+ }
2230
+ },
2231
+ "401": {
2232
+ "description": "Unauthorized"
2233
+ },
2234
+ "403": {
2235
+ "description": "Forbidden"
2236
+ }
2237
+ }
2238
+ }
2239
+ }
2240
+ },
2241
+ "tags": [
2242
+ {
2243
+ "name": "common",
2244
+ "x-robodev-hidden": true
2245
+ },
2246
+ {
2247
+ "name": "User",
2248
+ "x-robodev-hidden": true,
2249
+ "x-robodev-owned-tables": [
2250
+ "User",
2251
+ "PushNotificationToken"
2252
+ ]
2253
+ },
2254
+ {
2255
+ "name": "User Auth",
2256
+ "x-robodev-hidden": true,
2257
+ "x-robodev-owned-tables": [
2258
+ "AuthnIdentity",
2259
+ "AuthnNonce"
2260
+ ]
2261
+ },
2262
+ {
2263
+ "name": "Health"
2264
+ },
2265
+ {
2266
+ "name": "Me"
2267
+ },
2268
+ {
2269
+ "name": "Category"
2270
+ },
2271
+ {
2272
+ "name": "Listing"
2273
+ },
2274
+ {
2275
+ "name": "Cart"
2276
+ },
2277
+ {
2278
+ "name": "Checkout"
2279
+ },
2280
+ {
2281
+ "name": "Purchase"
2282
+ },
2283
+ {
2284
+ "name": "Sale"
2285
+ },
2286
+ {
2287
+ "name": "Order"
2288
+ },
2289
+ {
2290
+ "name": "Watch"
2291
+ },
2292
+ {
2293
+ "name": "Review"
2294
+ }
2295
+ ],
2296
+ "x-robodev-user-roles": [
2297
+ {
2298
+ "name": "CLIENT",
2299
+ "description": "Default role for regular users",
2300
+ "isDefault": true
2301
+ }
2302
+ ]
2303
+ }