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