robodev 0.47.3 → 0.48.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 (172) hide show
  1. package/package.json +3 -3
  2. package/src/emit-starter.test.ts +6 -3
  3. package/templates/auth-chat/ROBODEV.md +7 -1
  4. package/templates/auth-chat/package.json +2 -2
  5. package/templates/backend/ROBODEV.md +7 -1
  6. package/templates/backend/package.json +2 -2
  7. package/templates/catalog.json +5 -0
  8. package/templates/empty/ROBODEV.md +7 -1
  9. package/templates/empty/package.json +2 -2
  10. package/templates/marketplace/ROBODEV.md +7 -1
  11. package/templates/marketplace/package.json +2 -2
  12. package/templates/povio/.config/local.spa.template.yml +27 -0
  13. package/templates/povio/.oxlint-base.json +29 -0
  14. package/templates/povio/.oxlintrc.json +78 -0
  15. package/templates/povio/.rulesync/rules/frontend-api-boundary.md +36 -0
  16. package/templates/povio/.rulesync/rules/frontend-component-structure.md +40 -0
  17. package/templates/povio/.rulesync/rules/frontend-forms.md +27 -0
  18. package/templates/povio/.rulesync/rules/frontend-notifications.md +24 -0
  19. package/templates/povio/.rulesync/rules/frontend-povio-components.md +42 -0
  20. package/templates/povio/.rulesync/rules/frontend-povio-ui.md +45 -0
  21. package/templates/povio/.rulesync/rules/frontend-query-autocomplete.md +24 -0
  22. package/templates/povio/.rulesync/rules/frontend-tables-and-lists.md +26 -0
  23. package/templates/povio/.rulesync/rules/frontend-translations.md +25 -0
  24. package/templates/povio/.rulesync/rules/project-overview.md +32 -0
  25. package/templates/povio/.rulesync/rules/robodev-api.md +30 -0
  26. package/templates/povio/.rulesync/rules/robodev-auth.md +40 -0
  27. package/templates/povio/.rulesync/rules/robodev-database.md +22 -0
  28. package/templates/povio/.rulesync/rules/role-based-app-structure.md +36 -0
  29. package/templates/povio/.rulesync/skills/media-feature/SKILL.md +21 -0
  30. package/templates/povio/.rulesync/skills/povio-ui-styling/SKILL.md +211 -0
  31. package/templates/povio/.rulesync/skills/povio-ui-styling/agents/openai.yaml +4 -0
  32. package/templates/povio/.rulesync/skills/robodev-api-route/SKILL.md +13 -0
  33. package/templates/povio/.rulesync/skills/robodev-table/SKILL.md +12 -0
  34. package/templates/povio/README.md +40 -0
  35. package/templates/povio/ROBODEV.md +84 -0
  36. package/templates/povio/apps/fe/index.html +24 -0
  37. package/templates/povio/apps/fe/openapi-codegen.config.ts +72 -0
  38. package/templates/povio/apps/fe/package.json +71 -0
  39. package/templates/povio/apps/fe/public/apple-touch-icon.png +0 -0
  40. package/templates/povio/apps/fe/public/favicon-96x96.png +0 -0
  41. package/templates/povio/apps/fe/public/favicon.ico +0 -0
  42. package/templates/povio/apps/fe/public/favicon.svg +3 -0
  43. package/templates/povio/apps/fe/public/site.webmanifest +21 -0
  44. package/templates/povio/apps/fe/public/web-app-manifest-192x192.png +0 -0
  45. package/templates/povio/apps/fe/public/web-app-manifest-512x512.png +0 -0
  46. package/templates/povio/apps/fe/src/assets/locales/en/translation.json +166 -0
  47. package/templates/povio/apps/fe/src/clients/app-rest-client.ts +15 -0
  48. package/templates/povio/apps/fe/src/clients/auth-token-store.ts +101 -0
  49. package/templates/povio/apps/fe/src/clients/rest/app-error-handler.ts +31 -0
  50. package/templates/povio/apps/fe/src/clients/rest/interceptors/authorization-header.interceptor.ts +15 -0
  51. package/templates/povio/apps/fe/src/clients/rest/interceptors/refresh-token.interceptor.ts +45 -0
  52. package/templates/povio/apps/fe/src/clients/rest/interceptors/response.interceptor.ts +17 -0
  53. package/templates/povio/apps/fe/src/components/404.tsx +18 -0
  54. package/templates/povio/apps/fe/src/components/features/auth/AuthBrandPanel.tsx +60 -0
  55. package/templates/povio/apps/fe/src/components/features/auth/AuthLayout.tsx +23 -0
  56. package/templates/povio/apps/fe/src/components/features/auth/LoginPage.tsx +111 -0
  57. package/templates/povio/apps/fe/src/components/features/auth/RegisterPage.tsx +143 -0
  58. package/templates/povio/apps/fe/src/components/features/home/HomePage.tsx +21 -0
  59. package/templates/povio/apps/fe/src/components/features/profile/ProfilePage.tsx +96 -0
  60. package/templates/povio/apps/fe/src/components/layout/AppLayout.tsx +19 -0
  61. package/templates/povio/apps/fe/src/components/layout/app-header/AppHeader.tsx +91 -0
  62. package/templates/povio/apps/fe/src/components/layout/app-header/MobileNavigation.tsx +51 -0
  63. package/templates/povio/apps/fe/src/components/layout/app-header/NavLink.tsx +29 -0
  64. package/templates/povio/apps/fe/src/components/shared/branding/BrandLogo.tsx +13 -0
  65. package/templates/povio/apps/fe/src/components/shared/error/ErrorFallback.tsx +43 -0
  66. package/templates/povio/apps/fe/src/components/shared/error/ErrorText.tsx +20 -0
  67. package/templates/povio/apps/fe/src/components/shared/error/NotFound.tsx +36 -0
  68. package/templates/povio/apps/fe/src/components/shared/forms/RequiredLabel.tsx +21 -0
  69. package/templates/povio/apps/fe/src/components/shared/forms/RowInputWrapper.tsx +50 -0
  70. package/templates/povio/apps/fe/src/components/shared/head/AppHead.tsx +32 -0
  71. package/templates/povio/apps/fe/src/components/shared/head/DefaultAppHead.tsx +34 -0
  72. package/templates/povio/apps/fe/src/components/shared/layout/LoadingState.tsx +9 -0
  73. package/templates/povio/apps/fe/src/components/shared/layout/ThinPageWrapper.tsx +5 -0
  74. package/templates/povio/apps/fe/src/components/shared/page/PageHeader.tsx +69 -0
  75. package/templates/povio/apps/fe/src/components/shared/ui/Card.tsx +60 -0
  76. package/templates/povio/apps/fe/src/components/shared/ui/GoogleLoginButton.tsx +19 -0
  77. package/templates/povio/apps/fe/src/components/shared/ui/RequiredLabel.tsx +22 -0
  78. package/templates/povio/apps/fe/src/components/shared/ui/TableActions.tsx +22 -0
  79. package/templates/povio/apps/fe/src/config/app.config.ts +23 -0
  80. package/templates/povio/apps/fe/src/config/i18n.ts +37 -0
  81. package/templates/povio/apps/fe/src/config/inits/logger.ts +7 -0
  82. package/templates/povio/apps/fe/src/config/jwt.config.ts +2 -0
  83. package/templates/povio/apps/fe/src/config/query.config.ts +20 -0
  84. package/templates/povio/apps/fe/src/hooks/useAuth.ts +5 -0
  85. package/templates/povio/apps/fe/src/main.tsx +52 -0
  86. package/templates/povio/apps/fe/src/pages/(guest)/login.tsx +23 -0
  87. package/templates/povio/apps/fe/src/pages/(guest)/register.tsx +23 -0
  88. package/templates/povio/apps/fe/src/pages/(guest)/route.tsx +18 -0
  89. package/templates/povio/apps/fe/src/pages/(private)/index.tsx +23 -0
  90. package/templates/povio/apps/fe/src/pages/(private)/profile.tsx +23 -0
  91. package/templates/povio/apps/fe/src/pages/(private)/route.tsx +18 -0
  92. package/templates/povio/apps/fe/src/pages/(public)/auth.tsx +37 -0
  93. package/templates/povio/apps/fe/src/pages/(public)/route.tsx +9 -0
  94. package/templates/povio/apps/fe/src/pages/__root.tsx +133 -0
  95. package/templates/povio/apps/fe/src/providers/AppErrorBoundary.tsx +44 -0
  96. package/templates/povio/apps/fe/src/providers/OpenApiRuntimeProvider.tsx +31 -0
  97. package/templates/povio/apps/fe/src/providers/index.tsx +44 -0
  98. package/templates/povio/apps/fe/src/providers/jwt.provider.tsx +95 -0
  99. package/templates/povio/apps/fe/src/routeTree.gen.ts +225 -0
  100. package/templates/povio/apps/fe/src/styles/base.css +84 -0
  101. package/templates/povio/apps/fe/src/styles/fonts/fonts.tsx +10 -0
  102. package/templates/povio/apps/fe/src/styles/globals.css +26 -0
  103. package/templates/povio/apps/fe/src/styles/overrides/defaults/button.override.ts +536 -0
  104. package/templates/povio/apps/fe/src/styles/overrides/defaults/checkbox.override.ts +71 -0
  105. package/templates/povio/apps/fe/src/styles/overrides/defaults/input.override.ts +252 -0
  106. package/templates/povio/apps/fe/src/styles/overrides/defaults/label.override.ts +91 -0
  107. package/templates/povio/apps/fe/src/styles/overrides/defaults/modal.override.ts +62 -0
  108. package/templates/povio/apps/fe/src/styles/overrides/defaults/radio.override.ts +46 -0
  109. package/templates/povio/apps/fe/src/styles/overrides/defaults/table.override.ts +104 -0
  110. package/templates/povio/apps/fe/src/styles/overrides/defaults/tag.override.ts +66 -0
  111. package/templates/povio/apps/fe/src/styles/overrides/defaults/typography.override.ts +115 -0
  112. package/templates/povio/apps/fe/src/styles/overrides/outline.clsx.ts +10 -0
  113. package/templates/povio/apps/fe/src/styles/overrides/uiOverrides.override.ts +60 -0
  114. package/templates/povio/apps/fe/src/styles/theme.css +2177 -0
  115. package/templates/povio/apps/fe/src/types/i18next.d.ts +12 -0
  116. package/templates/povio/apps/fe/src/types/table.d.ts +17 -0
  117. package/templates/povio/apps/fe/src/types/ui.d.ts +26 -0
  118. package/templates/povio/apps/fe/src/types/vite-env.d.ts +13 -0
  119. package/templates/povio/apps/fe/src/utils/date.utils.ts +17 -0
  120. package/templates/povio/apps/fe/src/utils/image-fallback.ts +9 -0
  121. package/templates/povio/apps/fe/src/utils/number.utils.ts +12 -0
  122. package/templates/povio/apps/fe/src/utils/string.utils.ts +5 -0
  123. package/templates/povio/apps/fe/src/vite-env.d.ts +1 -0
  124. package/templates/povio/apps/fe/tsconfig.app.json +32 -0
  125. package/templates/povio/apps/fe/tsconfig.json +9 -0
  126. package/templates/povio/apps/fe/tsconfig.node.json +31 -0
  127. package/templates/povio/apps/fe/vite.config.ts +150 -0
  128. package/templates/povio/openapi.json +911 -0
  129. package/templates/povio/oxfmt.config.js +23 -0
  130. package/templates/povio/package.json +19 -0
  131. package/templates/povio/robodev/api/_lib.ts +99 -0
  132. package/templates/povio/robodev/api/health.ts +7 -0
  133. package/templates/povio/robodev/database.ts +28 -0
  134. package/templates/povio/robodev/package.json +4 -0
  135. package/templates/povio/rulesync.jsonc +18 -0
  136. package/templates/povio/tsconfig.json +11 -0
  137. package/templates/shadcn/.rulesync/rules/frontend-api-boundary.md +29 -0
  138. package/templates/shadcn/.rulesync/rules/frontend-component-structure.md +19 -0
  139. package/templates/shadcn/.rulesync/rules/frontend-hosted-ui.md +38 -0
  140. package/templates/shadcn/.rulesync/rules/project-overview.md +29 -0
  141. package/templates/shadcn/.rulesync/rules/robodev-api.md +22 -0
  142. package/templates/shadcn/.rulesync/rules/robodev-auth.md +47 -0
  143. package/templates/shadcn/.rulesync/rules/robodev-database.md +21 -0
  144. package/templates/shadcn/.rulesync/skills/robodev-crud-page/SKILL.md +181 -0
  145. package/templates/shadcn/README.md +9 -4
  146. package/templates/shadcn/ROBODEV.md +14 -6
  147. package/templates/shadcn/package.json +4 -6
  148. package/templates/shadcn/rulesync.jsonc +18 -0
  149. package/templates/shadcn/src/App.tsx +12 -3
  150. package/templates/shadcn/src/app.css +359 -0
  151. package/templates/shadcn/src/components/auth/AuthCard.tsx +29 -0
  152. package/templates/shadcn/src/components/ui/badge.tsx +17 -0
  153. package/templates/shadcn/src/components/ui/card.tsx +28 -0
  154. package/templates/shadcn/src/components/ui/dialog.tsx +38 -0
  155. package/templates/shadcn/src/components/ui/empty-state.tsx +17 -0
  156. package/templates/shadcn/src/components/ui/input.tsx +8 -0
  157. package/templates/shadcn/src/components/ui/label.tsx +8 -0
  158. package/templates/shadcn/src/components/ui/skeleton.tsx +6 -0
  159. package/templates/shadcn/src/components/ui/spinner.tsx +3 -0
  160. package/templates/shadcn/src/components/ui/table.tsx +30 -0
  161. package/templates/shadcn/src/components/ui/textarea.tsx +8 -0
  162. package/templates/shadcn/src/lib/auth.tsx +72 -0
  163. package/templates/shadcn/src/lib/client.ts +8 -0
  164. package/templates/shadcn/src/pages/Home.tsx +15 -0
  165. package/templates/shadcn/src/pages/Login.tsx +70 -0
  166. package/templates/shadcn/src/pages/NotFound.tsx +14 -0
  167. package/templates/shadcn/src/pages/Register.tsx +82 -0
  168. package/templates/space/ROBODEV.md +7 -1
  169. package/templates/space/package.json +2 -2
  170. package/templates/shadcn/components.json +0 -21
  171. package/templates/shadcn/postcss.config.js +0 -6
  172. package/templates/shadcn/tailwind.config.ts +0 -42
@@ -0,0 +1,911 @@
1
+ {
2
+ "info": {
3
+ "title": "Tiny Template Fake API",
4
+ "description": "OpenAPI spec for the Tiny Robodev backend and reserved /api/user auth.",
5
+ "version": "3.0.0"
6
+ },
7
+ "servers": [
8
+ {
9
+ "url": "/",
10
+ "description": "Current origin"
11
+ }
12
+ ],
13
+ "openapi": "3.0.3",
14
+ "components": {
15
+ "schemas": {
16
+ "UserMeResponse": {
17
+ "type": "object",
18
+ "properties": {
19
+ "id": {
20
+ "type": "string"
21
+ },
22
+ "name": {
23
+ "nullable": true,
24
+ "type": "string"
25
+ },
26
+ "email": {
27
+ "nullable": true,
28
+ "type": "string",
29
+ "format": "email"
30
+ }
31
+ },
32
+ "required": [
33
+ "id",
34
+ "name",
35
+ "email"
36
+ ]
37
+ },
38
+ "UserMeUpdateRequest": {
39
+ "type": "object",
40
+ "properties": {
41
+ "name": {
42
+ "type": "string"
43
+ },
44
+ "email": {
45
+ "type": "string",
46
+ "minLength": 1,
47
+ "format": "email"
48
+ }
49
+ }
50
+ },
51
+ "UserPushTokensResponse": {
52
+ "type": "array",
53
+ "items": {
54
+ "$ref": "#/components/schemas/UserPushTokensCreateResponse"
55
+ }
56
+ },
57
+ "UserPushTokenCreate": {
58
+ "type": "object",
59
+ "properties": {
60
+ "token": {
61
+ "type": "string",
62
+ "minLength": 1
63
+ },
64
+ "provider": {
65
+ "type": "string",
66
+ "minLength": 1
67
+ },
68
+ "title": {
69
+ "nullable": true,
70
+ "type": "string"
71
+ },
72
+ "expiresAt": {
73
+ "nullable": true,
74
+ "type": "string"
75
+ }
76
+ },
77
+ "required": [
78
+ "token",
79
+ "provider"
80
+ ]
81
+ },
82
+ "UserPushTokensCreateResponse": {
83
+ "type": "object",
84
+ "properties": {
85
+ "id": {
86
+ "type": "string"
87
+ },
88
+ "resourceName": {
89
+ "type": "string"
90
+ },
91
+ "resourceLabel": {
92
+ "nullable": true,
93
+ "type": "string"
94
+ },
95
+ "module": {
96
+ "nullable": true,
97
+ "type": "string"
98
+ },
99
+ "resourceId": {
100
+ "nullable": true,
101
+ "type": "string"
102
+ },
103
+ "token": {
104
+ "type": "string"
105
+ },
106
+ "provider": {
107
+ "type": "string"
108
+ },
109
+ "expiresAt": {
110
+ "nullable": true,
111
+ "type": "string"
112
+ },
113
+ "title": {
114
+ "nullable": true,
115
+ "type": "string"
116
+ },
117
+ "createdAt": {
118
+ "type": "string"
119
+ },
120
+ "updatedAt": {
121
+ "type": "string"
122
+ }
123
+ },
124
+ "required": [
125
+ "id",
126
+ "resourceName",
127
+ "resourceLabel",
128
+ "module",
129
+ "resourceId",
130
+ "token",
131
+ "provider",
132
+ "expiresAt",
133
+ "title",
134
+ "createdAt",
135
+ "updatedAt"
136
+ ]
137
+ },
138
+ "UserPushTokenId": {
139
+ "type": "object",
140
+ "properties": {
141
+ "id": {
142
+ "type": "string"
143
+ }
144
+ },
145
+ "required": [
146
+ "id"
147
+ ]
148
+ },
149
+ "UserPushTokensRemoveResponse": {
150
+ "type": "object",
151
+ "properties": {
152
+ "id": {
153
+ "type": "string"
154
+ },
155
+ "resourceName": {
156
+ "type": "string"
157
+ },
158
+ "resourceLabel": {
159
+ "nullable": true,
160
+ "type": "string"
161
+ },
162
+ "module": {
163
+ "nullable": true,
164
+ "type": "string"
165
+ },
166
+ "resourceId": {
167
+ "nullable": true,
168
+ "type": "string"
169
+ },
170
+ "token": {
171
+ "type": "string"
172
+ },
173
+ "provider": {
174
+ "type": "string"
175
+ },
176
+ "expiresAt": {
177
+ "nullable": true,
178
+ "type": "string"
179
+ },
180
+ "title": {
181
+ "nullable": true,
182
+ "type": "string"
183
+ },
184
+ "createdAt": {
185
+ "type": "string"
186
+ },
187
+ "updatedAt": {
188
+ "type": "string"
189
+ }
190
+ },
191
+ "required": [
192
+ "id",
193
+ "resourceName",
194
+ "resourceLabel",
195
+ "module",
196
+ "resourceId",
197
+ "token",
198
+ "provider",
199
+ "expiresAt",
200
+ "title",
201
+ "createdAt",
202
+ "updatedAt"
203
+ ]
204
+ },
205
+ "StatusResponse": {
206
+ "type": "object",
207
+ "properties": {
208
+ "status": {
209
+ "type": "string"
210
+ },
211
+ "message": {
212
+ "type": "string"
213
+ },
214
+ "code": {
215
+ "type": "string"
216
+ }
217
+ },
218
+ "required": [
219
+ "status",
220
+ "message",
221
+ "code"
222
+ ]
223
+ },
224
+ "UserAuthMagicConsumeRequest": {
225
+ "type": "object",
226
+ "properties": {
227
+ "code": {
228
+ "type": "string"
229
+ }
230
+ },
231
+ "required": [
232
+ "code"
233
+ ]
234
+ },
235
+ "AuthnTokenResponse": {
236
+ "type": "object",
237
+ "properties": {
238
+ "accessToken": {
239
+ "type": "string"
240
+ },
241
+ "refreshToken": {
242
+ "type": "string"
243
+ }
244
+ },
245
+ "required": [
246
+ "accessToken"
247
+ ]
248
+ },
249
+ "UserAuthPasswordLoginRequest": {
250
+ "type": "object",
251
+ "properties": {
252
+ "email": {
253
+ "type": "string",
254
+ "minLength": 1,
255
+ "format": "email"
256
+ },
257
+ "password": {
258
+ "type": "string",
259
+ "minLength": 1
260
+ }
261
+ },
262
+ "required": [
263
+ "email",
264
+ "password"
265
+ ]
266
+ },
267
+ "UserAuthPasswordRegisterRequest": {
268
+ "type": "object",
269
+ "properties": {
270
+ "email": {
271
+ "type": "string",
272
+ "minLength": 1,
273
+ "format": "email"
274
+ },
275
+ "password": {
276
+ "type": "string",
277
+ "minLength": 12
278
+ },
279
+ "name": {
280
+ "type": "string"
281
+ }
282
+ },
283
+ "required": [
284
+ "email",
285
+ "password"
286
+ ]
287
+ },
288
+ "AuthnTokenRequest": {
289
+ "type": "object",
290
+ "properties": {
291
+ "refreshToken": {
292
+ "type": "string",
293
+ "minLength": 1
294
+ }
295
+ },
296
+ "required": [
297
+ "refreshToken"
298
+ ]
299
+ },
300
+ "Label": {
301
+ "type": "object",
302
+ "properties": {
303
+ "id": {
304
+ "type": "string"
305
+ },
306
+ "label": {
307
+ "type": "string"
308
+ }
309
+ },
310
+ "required": [
311
+ "id",
312
+ "label"
313
+ ]
314
+ },
315
+ "PaginationDto": {
316
+ "type": "object",
317
+ "properties": {
318
+ "page": {
319
+ "nullable": true,
320
+ "type": "number"
321
+ },
322
+ "cursor": {
323
+ "nullable": true,
324
+ "type": "string"
325
+ },
326
+ "nextCursor": {
327
+ "nullable": true,
328
+ "type": "string"
329
+ },
330
+ "limit": {
331
+ "type": "number"
332
+ },
333
+ "totalItems": {
334
+ "type": "number"
335
+ }
336
+ },
337
+ "required": [
338
+ "limit",
339
+ "totalItems"
340
+ ]
341
+ },
342
+ "PaginationQuery": {
343
+ "type": "object",
344
+ "properties": {
345
+ "page": {
346
+ "type": "integer",
347
+ "minimum": -9007199254740991,
348
+ "maximum": 9007199254740991,
349
+ "exclusiveMinimum": 0
350
+ },
351
+ "cursor": {
352
+ "nullable": true,
353
+ "allOf": [
354
+ {
355
+ "$ref": "#/components/schemas/paginationCursor"
356
+ }
357
+ ]
358
+ },
359
+ "limit": {
360
+ "type": "number",
361
+ "maximum": 20,
362
+ "exclusiveMinimum": 0,
363
+ "default": 20
364
+ }
365
+ }
366
+ },
367
+ "paginationCursor": {
368
+ "type": "string",
369
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*(?::.+)?$"
370
+ },
371
+ "HealthResponse": {
372
+ "type": "object",
373
+ "required": [
374
+ "ok"
375
+ ],
376
+ "properties": {
377
+ "ok": {
378
+ "type": "boolean",
379
+ "enum": [
380
+ true
381
+ ]
382
+ }
383
+ }
384
+ },
385
+ "UserAuthEmailGenerateRequest": {
386
+ "type": "object",
387
+ "properties": {
388
+ "email": {
389
+ "type": "string",
390
+ "format": "email"
391
+ }
392
+ },
393
+ "required": [
394
+ "email"
395
+ ]
396
+ }
397
+ },
398
+ "securitySchemes": {
399
+ "bearerAuth": {
400
+ "type": "http",
401
+ "scheme": "bearer"
402
+ }
403
+ }
404
+ },
405
+ "paths": {
406
+ "/api/user/me": {
407
+ "get": {
408
+ "operationId": "UserMeController_get",
409
+ "tags": [
410
+ "User"
411
+ ],
412
+ "responses": {
413
+ "200": {
414
+ "description": "OK",
415
+ "content": {
416
+ "application/json": {
417
+ "schema": {
418
+ "$ref": "#/components/schemas/UserMeResponse"
419
+ }
420
+ }
421
+ }
422
+ },
423
+ "401": {
424
+ "description": "Unauthorized"
425
+ },
426
+ "403": {
427
+ "description": "Forbidden"
428
+ }
429
+ },
430
+ "security": [
431
+ {
432
+ "bearerAuth": []
433
+ }
434
+ ],
435
+ "x-bl": "Returns the authenticated user's profile for a valid access token.",
436
+ "x-acl": [
437
+ {
438
+ "action": "read",
439
+ "subject": "User"
440
+ }
441
+ ]
442
+ },
443
+ "put": {
444
+ "operationId": "UserMeController_update",
445
+ "tags": [
446
+ "User"
447
+ ],
448
+ "requestBody": {
449
+ "required": true,
450
+ "content": {
451
+ "application/json": {
452
+ "schema": {
453
+ "$ref": "#/components/schemas/UserMeUpdateRequest"
454
+ }
455
+ }
456
+ }
457
+ },
458
+ "responses": {
459
+ "200": {
460
+ "description": "OK",
461
+ "content": {
462
+ "application/json": {
463
+ "schema": {
464
+ "$ref": "#/components/schemas/UserMeResponse"
465
+ }
466
+ }
467
+ }
468
+ },
469
+ "401": {
470
+ "description": "Unauthorized"
471
+ },
472
+ "403": {
473
+ "description": "Forbidden"
474
+ }
475
+ },
476
+ "security": [
477
+ {
478
+ "bearerAuth": []
479
+ }
480
+ ],
481
+ "x-bl": "Updates the authenticated user's own name and email, enforcing unique email ownership, and returns the updated profile.",
482
+ "x-acl": [
483
+ {
484
+ "action": "update",
485
+ "subject": "User"
486
+ }
487
+ ]
488
+ }
489
+ },
490
+ "/api/user/push-tokens": {
491
+ "get": {
492
+ "operationId": "UserMePushTokensController_list",
493
+ "tags": [
494
+ "User"
495
+ ],
496
+ "responses": {
497
+ "200": {
498
+ "description": "OK",
499
+ "content": {
500
+ "application/json": {
501
+ "schema": {
502
+ "$ref": "#/components/schemas/UserPushTokensResponse"
503
+ }
504
+ }
505
+ }
506
+ }
507
+ },
508
+ "security": [
509
+ {
510
+ "bearerAuth": []
511
+ }
512
+ ],
513
+ "x-bl": "Lists push notification tokens owned by the authenticated user."
514
+ },
515
+ "post": {
516
+ "operationId": "UserMePushTokensController_create",
517
+ "tags": [
518
+ "User"
519
+ ],
520
+ "requestBody": {
521
+ "required": true,
522
+ "content": {
523
+ "application/json": {
524
+ "schema": {
525
+ "$ref": "#/components/schemas/UserPushTokenCreate"
526
+ }
527
+ }
528
+ }
529
+ },
530
+ "responses": {
531
+ "201": {
532
+ "description": "OK",
533
+ "content": {
534
+ "application/json": {
535
+ "schema": {
536
+ "$ref": "#/components/schemas/UserPushTokensCreateResponse"
537
+ }
538
+ }
539
+ }
540
+ }
541
+ },
542
+ "security": [
543
+ {
544
+ "bearerAuth": []
545
+ }
546
+ ],
547
+ "x-bl": "Registers or refreshes a push notification token for the authenticated user."
548
+ }
549
+ },
550
+ "/api/user/push-tokens/{id}": {
551
+ "delete": {
552
+ "operationId": "UserMePushTokensController_remove",
553
+ "tags": [
554
+ "User"
555
+ ],
556
+ "parameters": [
557
+ {
558
+ "name": "id",
559
+ "in": "path",
560
+ "required": true,
561
+ "schema": {
562
+ "type": "string"
563
+ }
564
+ }
565
+ ],
566
+ "responses": {
567
+ "200": {
568
+ "description": "OK",
569
+ "content": {
570
+ "application/json": {
571
+ "schema": {
572
+ "$ref": "#/components/schemas/UserPushTokensCreateResponse"
573
+ }
574
+ }
575
+ }
576
+ }
577
+ },
578
+ "security": [
579
+ {
580
+ "bearerAuth": []
581
+ }
582
+ ],
583
+ "x-bl": "Deletes a push notification token only when owned by the authenticated user."
584
+ }
585
+ },
586
+ "/api/user/auth/magic-link": {
587
+ "get": {
588
+ "operationId": "UserAuthMagicLinkController_generate",
589
+ "tags": [
590
+ "User Auth"
591
+ ],
592
+ "parameters": [
593
+ {
594
+ "name": "email",
595
+ "in": "query",
596
+ "required": true,
597
+ "schema": {
598
+ "type": "string",
599
+ "format": "email"
600
+ },
601
+ "allowEmptyValue": true,
602
+ "allowReserved": true
603
+ }
604
+ ],
605
+ "responses": {
606
+ "200": {
607
+ "description": "OK",
608
+ "content": {
609
+ "application/json": {
610
+ "schema": {
611
+ "$ref": "#/components/schemas/StatusResponse"
612
+ }
613
+ }
614
+ }
615
+ }
616
+ },
617
+ "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."
618
+ }
619
+ },
620
+ "/api/user/auth/magic-link/callback": {
621
+ "get": {
622
+ "operationId": "UserAuthMagicLinkController_consume",
623
+ "tags": [
624
+ "User Auth"
625
+ ],
626
+ "parameters": [
627
+ {
628
+ "name": "code",
629
+ "in": "query",
630
+ "required": true,
631
+ "schema": {
632
+ "type": "string"
633
+ },
634
+ "allowEmptyValue": true,
635
+ "allowReserved": true
636
+ }
637
+ ],
638
+ "responses": {
639
+ "200": {
640
+ "description": "OK",
641
+ "content": {
642
+ "application/json": {
643
+ "schema": {
644
+ "$ref": "#/components/schemas/AuthnTokenResponse"
645
+ }
646
+ }
647
+ }
648
+ }
649
+ },
650
+ "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."
651
+ }
652
+ },
653
+ "/api/user/auth/login": {
654
+ "post": {
655
+ "operationId": "UserAuthLocalPasswordController_login",
656
+ "tags": [
657
+ "User Auth"
658
+ ],
659
+ "requestBody": {
660
+ "required": true,
661
+ "content": {
662
+ "application/json": {
663
+ "schema": {
664
+ "$ref": "#/components/schemas/UserAuthPasswordLoginRequest"
665
+ }
666
+ }
667
+ }
668
+ },
669
+ "responses": {
670
+ "200": {
671
+ "description": "OK",
672
+ "content": {
673
+ "application/json": {
674
+ "schema": {
675
+ "$ref": "#/components/schemas/AuthnTokenResponse"
676
+ }
677
+ }
678
+ }
679
+ }
680
+ },
681
+ "x-bl": "Validates local user credentials and returns access and refresh tokens for authenticated API requests."
682
+ }
683
+ },
684
+ "/api/user/auth/register": {
685
+ "post": {
686
+ "operationId": "UserAuthLocalPasswordController_register",
687
+ "tags": [
688
+ "User Auth"
689
+ ],
690
+ "requestBody": {
691
+ "required": true,
692
+ "content": {
693
+ "application/json": {
694
+ "schema": {
695
+ "$ref": "#/components/schemas/UserAuthPasswordRegisterRequest"
696
+ }
697
+ }
698
+ }
699
+ },
700
+ "responses": {
701
+ "201": {
702
+ "description": "OK",
703
+ "content": {
704
+ "application/json": {
705
+ "schema": {
706
+ "$ref": "#/components/schemas/AuthnTokenResponse"
707
+ }
708
+ }
709
+ }
710
+ }
711
+ },
712
+ "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."
713
+ }
714
+ },
715
+ "/api/user/auth/refresh": {
716
+ "post": {
717
+ "operationId": "UserAuthJwtController_accessToken",
718
+ "tags": [
719
+ "User Auth"
720
+ ],
721
+ "requestBody": {
722
+ "required": true,
723
+ "content": {
724
+ "application/json": {
725
+ "schema": {
726
+ "$ref": "#/components/schemas/AuthnTokenRequest"
727
+ }
728
+ }
729
+ }
730
+ },
731
+ "responses": {
732
+ "200": {
733
+ "description": "OK",
734
+ "content": {
735
+ "application/json": {
736
+ "schema": {
737
+ "$ref": "#/components/schemas/AuthnTokenResponse"
738
+ }
739
+ }
740
+ }
741
+ }
742
+ },
743
+ "x-bl": "Validates a refresh token for an existing user and returns a new access and refresh token pair."
744
+ }
745
+ },
746
+ "/api/user/auth/google/callback": {
747
+ "get": {
748
+ "operationId": "UserAuthGoogleController_login",
749
+ "tags": [
750
+ "User Auth"
751
+ ],
752
+ "responses": {
753
+ "200": {
754
+ "description": "OK",
755
+ "content": {
756
+ "application/json": {
757
+ "schema": {
758
+ "$ref": "#/components/schemas/AuthnTokenResponse"
759
+ }
760
+ }
761
+ }
762
+ }
763
+ },
764
+ "x-bl": "Completes Google authentication and returns access and refresh tokens."
765
+ }
766
+ },
767
+ "/api/user/auth/apple/callback": {
768
+ "get": {
769
+ "operationId": "UserAuthAppleController_login",
770
+ "tags": [
771
+ "User Auth"
772
+ ],
773
+ "responses": {
774
+ "200": {
775
+ "description": "OK",
776
+ "content": {
777
+ "application/json": {
778
+ "schema": {
779
+ "$ref": "#/components/schemas/AuthnTokenResponse"
780
+ }
781
+ }
782
+ }
783
+ }
784
+ },
785
+ "x-bl": "Completes deterministic fake Apple authentication and returns access and refresh tokens."
786
+ }
787
+ },
788
+ "/api/user/auth/forgot-password": {
789
+ "post": {
790
+ "operationId": "UserAuthForgotPasswordController_requestReset",
791
+ "tags": [
792
+ "User Auth"
793
+ ],
794
+ "requestBody": {
795
+ "required": true,
796
+ "content": {
797
+ "application/json": {
798
+ "schema": {
799
+ "$ref": "#/components/schemas/UserAuthEmailGenerateRequest"
800
+ }
801
+ }
802
+ }
803
+ },
804
+ "responses": {
805
+ "200": {
806
+ "description": "OK",
807
+ "content": {
808
+ "application/json": {
809
+ "schema": {
810
+ "$ref": "#/components/schemas/StatusResponse"
811
+ }
812
+ }
813
+ }
814
+ }
815
+ },
816
+ "x-bl": "For an existing user, creates a short-lived password reset code and emails it while preventing account enumeration."
817
+ }
818
+ },
819
+ "/api/user/auth/forgot-password/callback": {
820
+ "post": {
821
+ "operationId": "UserAuthForgotPasswordController_consumeReset",
822
+ "tags": [
823
+ "User Auth"
824
+ ],
825
+ "requestBody": {
826
+ "required": true,
827
+ "content": {
828
+ "application/json": {
829
+ "schema": {
830
+ "$ref": "#/components/schemas/UserAuthMagicConsumeRequest"
831
+ }
832
+ }
833
+ }
834
+ },
835
+ "responses": {
836
+ "200": {
837
+ "description": "OK",
838
+ "content": {
839
+ "application/json": {
840
+ "schema": {
841
+ "$ref": "#/components/schemas/StatusResponse"
842
+ }
843
+ }
844
+ }
845
+ }
846
+ },
847
+ "x-bl": "Consumes a valid unused password reset code."
848
+ }
849
+ },
850
+ "/api/health": {
851
+ "get": {
852
+ "operationId": "getHealth",
853
+ "summary": "Health",
854
+ "tags": [
855
+ "health"
856
+ ],
857
+ "responses": {
858
+ "200": {
859
+ "description": "OK",
860
+ "content": {
861
+ "application/json": {
862
+ "schema": {
863
+ "$ref": "#/components/schemas/HealthResponse"
864
+ }
865
+ }
866
+ }
867
+ }
868
+ }
869
+ }
870
+ }
871
+ },
872
+ "tags": [
873
+ {
874
+ "name": "common",
875
+ "x-robodev-hidden": true
876
+ },
877
+ {
878
+ "name": "User",
879
+ "x-robodev-hidden": true,
880
+ "x-robodev-owned-tables": [
881
+ "User",
882
+ "PushNotificationToken"
883
+ ]
884
+ },
885
+ {
886
+ "name": "User Auth",
887
+ "x-robodev-hidden": true,
888
+ "x-robodev-owned-tables": [
889
+ "AuthnIdentity",
890
+ "AuthnNonce"
891
+ ]
892
+ },
893
+ {
894
+ "name": "Media",
895
+ "x-robodev-hidden": true,
896
+ "x-robodev-owned-tables": [
897
+ "Media"
898
+ ]
899
+ },
900
+ {
901
+ "name": "health"
902
+ }
903
+ ],
904
+ "x-robodev-user-roles": [
905
+ {
906
+ "name": "CLIENT",
907
+ "description": "Default role for regular users",
908
+ "isDefault": true
909
+ }
910
+ ]
911
+ }