@betterportal/auth-default 10.1.61 → 10.1.63

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 (70) hide show
  1. package/lib/bp-contracts/org.betterportal.auth.default.json +1194 -748
  2. package/lib/defaultAuthManifest.d.ts +1 -1
  3. package/lib/defaultAuthManifest.d.ts.map +1 -1
  4. package/lib/defaultAuthManifest.js +1 -1
  5. package/lib/defaultAuthManifest.js.map +1 -1
  6. package/lib/plugins/service-betterportal-auth-default/.bp-generated/registry.d.ts.map +1 -1
  7. package/lib/plugins/service-betterportal-auth-default/.bp-generated/registry.js +19 -72
  8. package/lib/plugins/service-betterportal-auth-default/.bp-generated/registry.js.map +1 -1
  9. package/lib/plugins/service-betterportal-auth-default/bp-routes/login/GET.d.ts +3 -1
  10. package/lib/plugins/service-betterportal-auth-default/bp-routes/login/GET.d.ts.map +1 -1
  11. package/lib/plugins/service-betterportal-auth-default/bp-routes/login/GET.js +3 -1
  12. package/lib/plugins/service-betterportal-auth-default/bp-routes/login/GET.js.map +1 -1
  13. package/lib/plugins/service-betterportal-auth-default/bp-routes/login/POST.d.ts +3 -1
  14. package/lib/plugins/service-betterportal-auth-default/bp-routes/login/POST.d.ts.map +1 -1
  15. package/lib/plugins/service-betterportal-auth-default/bp-routes/login/POST.js +3 -1
  16. package/lib/plugins/service-betterportal-auth-default/bp-routes/login/POST.js.map +1 -1
  17. package/lib/plugins/service-betterportal-auth-default/bp-routes/login/index.d.ts +1 -1
  18. package/lib/plugins/service-betterportal-auth-default/bp-routes/login/index.d.ts.map +1 -1
  19. package/lib/plugins/service-betterportal-auth-default/bp-routes/login/index.js +1 -1
  20. package/lib/plugins/service-betterportal-auth-default/bp-routes/login/index.js.map +1 -1
  21. package/lib/plugins/service-betterportal-auth-default/bp-routes/login/route.impl.d.ts.map +1 -1
  22. package/lib/plugins/service-betterportal-auth-default/bp-routes/login/route.impl.js +6 -6
  23. package/lib/plugins/service-betterportal-auth-default/bp-routes/login/route.impl.js.map +1 -1
  24. package/lib/plugins/service-betterportal-auth-default/bp-routes/logout/GET.d.ts +3 -1
  25. package/lib/plugins/service-betterportal-auth-default/bp-routes/logout/GET.d.ts.map +1 -1
  26. package/lib/plugins/service-betterportal-auth-default/bp-routes/logout/GET.js +3 -1
  27. package/lib/plugins/service-betterportal-auth-default/bp-routes/logout/GET.js.map +1 -1
  28. package/lib/plugins/service-betterportal-auth-default/bp-routes/logout/POST.d.ts +3 -1
  29. package/lib/plugins/service-betterportal-auth-default/bp-routes/logout/POST.d.ts.map +1 -1
  30. package/lib/plugins/service-betterportal-auth-default/bp-routes/logout/POST.js +3 -1
  31. package/lib/plugins/service-betterportal-auth-default/bp-routes/logout/POST.js.map +1 -1
  32. package/lib/plugins/service-betterportal-auth-default/bp-routes/logout/index.d.ts +1 -1
  33. package/lib/plugins/service-betterportal-auth-default/bp-routes/logout/index.d.ts.map +1 -1
  34. package/lib/plugins/service-betterportal-auth-default/bp-routes/logout/index.js +1 -1
  35. package/lib/plugins/service-betterportal-auth-default/bp-routes/logout/index.js.map +1 -1
  36. package/lib/plugins/service-betterportal-auth-default/bp-routes/logout/route.impl.d.ts.map +1 -1
  37. package/lib/plugins/service-betterportal-auth-default/bp-routes/logout/route.impl.js +4 -4
  38. package/lib/plugins/service-betterportal-auth-default/bp-routes/logout/route.impl.js.map +1 -1
  39. package/lib/plugins/service-betterportal-auth-default/bp-routes/refresh/POST.d.ts +3 -1
  40. package/lib/plugins/service-betterportal-auth-default/bp-routes/refresh/POST.d.ts.map +1 -1
  41. package/lib/plugins/service-betterportal-auth-default/bp-routes/refresh/POST.js +3 -1
  42. package/lib/plugins/service-betterportal-auth-default/bp-routes/refresh/POST.js.map +1 -1
  43. package/lib/plugins/service-betterportal-auth-default/bp-routes/refresh/index.d.ts +1 -1
  44. package/lib/plugins/service-betterportal-auth-default/bp-routes/refresh/index.d.ts.map +1 -1
  45. package/lib/plugins/service-betterportal-auth-default/bp-routes/refresh/index.js +1 -1
  46. package/lib/plugins/service-betterportal-auth-default/bp-routes/refresh/index.js.map +1 -1
  47. package/lib/plugins/service-betterportal-auth-default/bp-routes/refresh/route.impl.d.ts.map +1 -1
  48. package/lib/plugins/service-betterportal-auth-default/bp-routes/refresh/route.impl.js +4 -4
  49. package/lib/plugins/service-betterportal-auth-default/bp-routes/refresh/route.impl.js.map +1 -1
  50. package/lib/plugins/service-betterportal-auth-default/bp-routes/register/GET.d.ts +3 -1
  51. package/lib/plugins/service-betterportal-auth-default/bp-routes/register/GET.d.ts.map +1 -1
  52. package/lib/plugins/service-betterportal-auth-default/bp-routes/register/GET.js +3 -1
  53. package/lib/plugins/service-betterportal-auth-default/bp-routes/register/GET.js.map +1 -1
  54. package/lib/plugins/service-betterportal-auth-default/bp-routes/register/POST.d.ts +3 -1
  55. package/lib/plugins/service-betterportal-auth-default/bp-routes/register/POST.d.ts.map +1 -1
  56. package/lib/plugins/service-betterportal-auth-default/bp-routes/register/POST.js +3 -1
  57. package/lib/plugins/service-betterportal-auth-default/bp-routes/register/POST.js.map +1 -1
  58. package/lib/plugins/service-betterportal-auth-default/bp-routes/register/index.d.ts +1 -1
  59. package/lib/plugins/service-betterportal-auth-default/bp-routes/register/index.d.ts.map +1 -1
  60. package/lib/plugins/service-betterportal-auth-default/bp-routes/register/index.js +1 -1
  61. package/lib/plugins/service-betterportal-auth-default/bp-routes/register/index.js.map +1 -1
  62. package/lib/plugins/service-betterportal-auth-default/bp-routes/register/route.impl.d.ts.map +1 -1
  63. package/lib/plugins/service-betterportal-auth-default/bp-routes/register/route.impl.js +6 -6
  64. package/lib/plugins/service-betterportal-auth-default/bp-routes/register/route.impl.js.map +1 -1
  65. package/lib/plugins/service-betterportal-auth-default/index.d.ts.map +1 -1
  66. package/lib/plugins/service-betterportal-auth-default/index.js +1 -1
  67. package/lib/plugins/service-betterportal-auth-default/index.js.map +1 -1
  68. package/lib/schemas/service-betterportal-auth-default.json +1 -1
  69. package/lib/schemas/service-betterportal-auth-default.plugin.json +1 -1
  70. package/package.json +3 -3
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "manifest": {
3
- "protocolVersion": 1,
3
+ "protocolVersion": 2,
4
4
  "pluginId": "org.betterportal.auth.default",
5
5
  "title": "BetterPortal Default Auth",
6
6
  "description": "JWT-issuing auth service (RS256 + JWKS + bcrypt user store).",
7
- "version": "10.1.61",
7
+ "version": "10.1.63",
8
8
  "category": "service",
9
9
  "deploymentModes": [
10
10
  "self-hosted"
@@ -30,326 +30,560 @@
30
30
  "description": "Authenticate with username and password to receive a JWT.",
31
31
  "path": "/login",
32
32
  "pathVariants": [],
33
- "methods": [
34
- "GET",
35
- "POST"
36
- ],
37
33
  "paramsSchema": {},
38
- "querySchema": {
39
- "anyvaliVersion": "1.0",
40
- "schemaVersion": "1.1",
41
- "root": {
42
- "kind": "object",
43
- "properties": {
44
- "action": {
45
- "kind": "optional",
46
- "inner": {
47
- "kind": "string"
34
+ "operations": [
35
+ {
36
+ "operationId": "auth.login.view",
37
+ "method": "GET",
38
+ "title": "Login",
39
+ "description": "Authenticate with username and password to receive a JWT.",
40
+ "querySchema": {
41
+ "anyvaliVersion": "1.0",
42
+ "schemaVersion": "1.1",
43
+ "root": {
44
+ "kind": "object",
45
+ "properties": {
46
+ "action": {
47
+ "kind": "optional",
48
+ "inner": {
49
+ "kind": "string"
50
+ },
51
+ "metadata": {
52
+ "description": "Optional login route action, currently supports logout."
53
+ }
54
+ },
55
+ "next": {
56
+ "kind": "optional",
57
+ "inner": {
58
+ "kind": "string"
59
+ },
60
+ "metadata": {
61
+ "description": "The view path that redirected to the login page and should be redirected back to after a successful login."
62
+ }
63
+ }
48
64
  },
49
- "metadata": {
50
- "description": "Optional login route action, currently supports logout."
51
- }
65
+ "required": [],
66
+ "unknownKeys": "strip"
52
67
  },
53
- "next": {
54
- "kind": "optional",
55
- "inner": {
56
- "kind": "string"
57
- },
58
- "metadata": {
59
- "description": "The view path that redirected to the login page and should be redirected back to after a successful login."
60
- }
61
- }
68
+ "definitions": {},
69
+ "extensions": {}
62
70
  },
63
- "required": [],
64
- "unknownKeys": "strip"
65
- },
66
- "definitions": {},
67
- "extensions": {}
68
- },
69
- "headersSchema": {
70
- "anyvaliVersion": "1.0",
71
- "schemaVersion": "1.1",
72
- "root": {
73
- "kind": "object",
74
- "properties": {},
75
- "required": [],
76
- "unknownKeys": "strip"
77
- },
78
- "definitions": {},
79
- "extensions": {}
80
- },
81
- "bodySchema": {
82
- "anyvaliVersion": "1.0",
83
- "schemaVersion": "1.1",
84
- "root": {
85
- "kind": "object",
86
- "properties": {
87
- "username": {
88
- "kind": "string",
89
- "minLength": 1,
90
- "metadata": {
91
- "description": "Username for the account signing in."
92
- }
93
- },
94
- "password": {
95
- "kind": "string",
96
- "minLength": 1,
97
- "metadata": {
98
- "description": "Password for the account signing in."
99
- }
100
- },
101
- "next": {
102
- "kind": "optional",
103
- "inner": {
104
- "kind": "string"
71
+ "headersSchema": {},
72
+ "bodySchema": {},
73
+ "jsonResponseSchema": {
74
+ "anyvaliVersion": "1.0",
75
+ "schemaVersion": "1.1",
76
+ "root": {
77
+ "kind": "object",
78
+ "properties": {
79
+ "status": {
80
+ "kind": "enum",
81
+ "values": [
82
+ "ok",
83
+ "error"
84
+ ],
85
+ "metadata": {
86
+ "description": "Login request outcome."
87
+ }
88
+ },
89
+ "message": {
90
+ "kind": "optional",
91
+ "inner": {
92
+ "kind": "string"
93
+ },
94
+ "metadata": {
95
+ "description": "Human-readable status or error message for the renderer."
96
+ }
97
+ },
98
+ "accessToken": {
99
+ "kind": "optional",
100
+ "inner": {
101
+ "kind": "string"
102
+ },
103
+ "metadata": {
104
+ "description": "Signed JWT access token returned on successful login."
105
+ }
106
+ },
107
+ "refreshToken": {
108
+ "kind": "optional",
109
+ "inner": {
110
+ "kind": "string"
111
+ },
112
+ "metadata": {
113
+ "description": "Signed JWT refresh token returned on successful login."
114
+ }
115
+ },
116
+ "expiresInSeconds": {
117
+ "kind": "optional",
118
+ "inner": {
119
+ "kind": "int",
120
+ "min": 1
121
+ },
122
+ "metadata": {
123
+ "description": "Access token lifetime in seconds."
124
+ }
125
+ },
126
+ "user": {
127
+ "kind": "optional",
128
+ "inner": {
129
+ "kind": "object",
130
+ "properties": {
131
+ "id": {
132
+ "kind": "string",
133
+ "metadata": {
134
+ "description": "Stable UUIDv7 user id."
135
+ }
136
+ },
137
+ "username": {
138
+ "kind": "string",
139
+ "metadata": {
140
+ "description": "Account username."
141
+ }
142
+ },
143
+ "email": {
144
+ "kind": "optional",
145
+ "inner": {
146
+ "kind": "string"
147
+ },
148
+ "metadata": {
149
+ "description": "User email address, when set."
150
+ }
151
+ },
152
+ "name": {
153
+ "kind": "optional",
154
+ "inner": {
155
+ "kind": "string"
156
+ },
157
+ "metadata": {
158
+ "description": "Display name, when set."
159
+ }
160
+ }
161
+ },
162
+ "required": [
163
+ "id",
164
+ "username"
165
+ ],
166
+ "unknownKeys": "strip",
167
+ "metadata": {
168
+ "description": "Authenticated user summary."
169
+ }
170
+ }
171
+ },
172
+ "requiresFirstAdmin": {
173
+ "kind": "optional",
174
+ "inner": {
175
+ "kind": "bool"
176
+ },
177
+ "metadata": {
178
+ "description": "True while the auth service has zero users; the theme renderer should redirect to first-admin registration instead of showing the login form."
179
+ }
180
+ },
181
+ "firstAdminUrl": {
182
+ "kind": "optional",
183
+ "inner": {
184
+ "kind": "string"
185
+ },
186
+ "metadata": {
187
+ "description": "Absolute self-origin URL of this auth service's register view so the theme can load it in-shell without knowing the auth origin."
188
+ }
189
+ },
190
+ "alreadyLoggedIn": {
191
+ "kind": "optional",
192
+ "inner": {
193
+ "kind": "bool"
194
+ },
195
+ "metadata": {
196
+ "description": "True when the GET request already carried a valid access token; the theme renderer should show a signed-in state instead of the login form."
197
+ }
198
+ },
199
+ "loggedOut": {
200
+ "kind": "optional",
201
+ "inner": {
202
+ "kind": "bool"
203
+ },
204
+ "metadata": {
205
+ "description": "True after the login route handled ?action=logout."
206
+ }
207
+ },
208
+ "logoutUrl": {
209
+ "kind": "optional",
210
+ "inner": {
211
+ "kind": "string"
212
+ },
213
+ "metadata": {
214
+ "description": "Tenant-app path of the logout view from app auth config."
215
+ }
216
+ },
217
+ "nextUrl": {
218
+ "kind": "optional",
219
+ "inner": {
220
+ "kind": "string"
221
+ },
222
+ "metadata": {
223
+ "description": "Echo of the next path when already signed in; the theme renderer should redirect there immediately."
224
+ }
225
+ }
105
226
  },
106
- "metadata": {
107
- "description": "The view path to soft-navigate to after a successful login."
227
+ "required": [
228
+ "status"
229
+ ],
230
+ "unknownKeys": "strip"
231
+ },
232
+ "definitions": {},
233
+ "extensions": {}
234
+ },
235
+ "metadataResponseSchema": {},
236
+ "renderable": true,
237
+ "html": {
238
+ "renderers": {
239
+ "bootstrap5": {
240
+ "defaultRenderer": "default",
241
+ "renderModes": [
242
+ "page",
243
+ "fragment"
244
+ ],
245
+ "slots": [
246
+ "main",
247
+ "nav.profile"
248
+ ],
249
+ "renderers": [
250
+ {
251
+ "id": "default",
252
+ "title": "Default Content",
253
+ "slotId": "main",
254
+ "renderModes": [
255
+ "page",
256
+ "fragment"
257
+ ]
258
+ },
259
+ {
260
+ "id": "nav.profile",
261
+ "title": "nav.profile",
262
+ "slotId": "nav.profile",
263
+ "renderModes": [
264
+ "fragment"
265
+ ]
266
+ }
267
+ ]
108
268
  }
109
269
  }
110
270
  },
111
- "required": [
112
- "username",
113
- "password"
271
+ "auth": {
272
+ "required": false,
273
+ "callers": [
274
+ "user"
275
+ ],
276
+ "permissions": []
277
+ },
278
+ "sitemap": {
279
+ "kind": "default"
280
+ },
281
+ "robots": [],
282
+ "role": "auth.login",
283
+ "dependencies": [
284
+ "auth.login",
285
+ "auth.logout.view",
286
+ "auth.refresh",
287
+ "auth.register.view"
114
288
  ],
115
- "unknownKeys": "strip"
289
+ "chrome": {
290
+ "fullScreen": true
291
+ },
292
+ "apiContracts": [],
293
+ "demoScenarios": [],
294
+ "cacheHints": {
295
+ "ttlSeconds": 0,
296
+ "varyBy": []
297
+ }
116
298
  },
117
- "definitions": {},
118
- "extensions": {}
119
- },
120
- "jsonResponseSchema": {
121
- "anyvaliVersion": "1.0",
122
- "schemaVersion": "1.1",
123
- "root": {
124
- "kind": "object",
125
- "properties": {
126
- "status": {
127
- "kind": "enum",
128
- "values": [
129
- "ok",
130
- "error"
131
- ],
132
- "metadata": {
133
- "description": "Login request outcome."
134
- }
135
- },
136
- "message": {
137
- "kind": "optional",
138
- "inner": {
139
- "kind": "string"
140
- },
141
- "metadata": {
142
- "description": "Human-readable status or error message for the renderer."
143
- }
144
- },
145
- "accessToken": {
146
- "kind": "optional",
147
- "inner": {
148
- "kind": "string"
149
- },
150
- "metadata": {
151
- "description": "Signed JWT access token returned on successful login."
152
- }
153
- },
154
- "refreshToken": {
155
- "kind": "optional",
156
- "inner": {
157
- "kind": "string"
299
+ {
300
+ "operationId": "auth.login",
301
+ "method": "POST",
302
+ "title": "Login",
303
+ "description": "Authenticate with username and password to receive a JWT.",
304
+ "querySchema": {
305
+ "anyvaliVersion": "1.0",
306
+ "schemaVersion": "1.1",
307
+ "root": {
308
+ "kind": "object",
309
+ "properties": {
310
+ "action": {
311
+ "kind": "optional",
312
+ "inner": {
313
+ "kind": "string"
314
+ },
315
+ "metadata": {
316
+ "description": "Optional login route action, currently supports logout."
317
+ }
318
+ },
319
+ "next": {
320
+ "kind": "optional",
321
+ "inner": {
322
+ "kind": "string"
323
+ },
324
+ "metadata": {
325
+ "description": "The view path that redirected to the login page and should be redirected back to after a successful login."
326
+ }
327
+ }
158
328
  },
159
- "metadata": {
160
- "description": "Signed JWT refresh token returned on successful login."
161
- }
329
+ "required": [],
330
+ "unknownKeys": "strip"
162
331
  },
163
- "expiresInSeconds": {
164
- "kind": "optional",
165
- "inner": {
166
- "kind": "int",
167
- "min": 1
332
+ "definitions": {},
333
+ "extensions": {}
334
+ },
335
+ "headersSchema": {},
336
+ "bodySchema": {
337
+ "anyvaliVersion": "1.0",
338
+ "schemaVersion": "1.1",
339
+ "root": {
340
+ "kind": "object",
341
+ "properties": {
342
+ "username": {
343
+ "kind": "string",
344
+ "minLength": 1,
345
+ "metadata": {
346
+ "description": "Username for the account signing in."
347
+ }
348
+ },
349
+ "password": {
350
+ "kind": "string",
351
+ "minLength": 1,
352
+ "metadata": {
353
+ "description": "Password for the account signing in."
354
+ }
355
+ },
356
+ "next": {
357
+ "kind": "optional",
358
+ "inner": {
359
+ "kind": "string"
360
+ },
361
+ "metadata": {
362
+ "description": "The view path to soft-navigate to after a successful login."
363
+ }
364
+ }
168
365
  },
169
- "metadata": {
170
- "description": "Access token lifetime in seconds."
171
- }
366
+ "required": [
367
+ "username",
368
+ "password"
369
+ ],
370
+ "unknownKeys": "strip"
172
371
  },
173
- "user": {
174
- "kind": "optional",
175
- "inner": {
176
- "kind": "object",
177
- "properties": {
178
- "id": {
179
- "kind": "string",
180
- "metadata": {
181
- "description": "Stable UUIDv7 user id."
182
- }
372
+ "definitions": {},
373
+ "extensions": {}
374
+ },
375
+ "jsonResponseSchema": {
376
+ "anyvaliVersion": "1.0",
377
+ "schemaVersion": "1.1",
378
+ "root": {
379
+ "kind": "object",
380
+ "properties": {
381
+ "status": {
382
+ "kind": "enum",
383
+ "values": [
384
+ "ok",
385
+ "error"
386
+ ],
387
+ "metadata": {
388
+ "description": "Login request outcome."
389
+ }
390
+ },
391
+ "message": {
392
+ "kind": "optional",
393
+ "inner": {
394
+ "kind": "string"
183
395
  },
184
- "username": {
185
- "kind": "string",
186
- "metadata": {
187
- "description": "Account username."
188
- }
396
+ "metadata": {
397
+ "description": "Human-readable status or error message for the renderer."
398
+ }
399
+ },
400
+ "accessToken": {
401
+ "kind": "optional",
402
+ "inner": {
403
+ "kind": "string"
189
404
  },
190
- "email": {
191
- "kind": "optional",
192
- "inner": {
193
- "kind": "string"
194
- },
195
- "metadata": {
196
- "description": "User email address, when set."
197
- }
405
+ "metadata": {
406
+ "description": "Signed JWT access token returned on successful login."
407
+ }
408
+ },
409
+ "refreshToken": {
410
+ "kind": "optional",
411
+ "inner": {
412
+ "kind": "string"
198
413
  },
199
- "name": {
200
- "kind": "optional",
201
- "inner": {
202
- "kind": "string"
414
+ "metadata": {
415
+ "description": "Signed JWT refresh token returned on successful login."
416
+ }
417
+ },
418
+ "expiresInSeconds": {
419
+ "kind": "optional",
420
+ "inner": {
421
+ "kind": "int",
422
+ "min": 1
423
+ },
424
+ "metadata": {
425
+ "description": "Access token lifetime in seconds."
426
+ }
427
+ },
428
+ "user": {
429
+ "kind": "optional",
430
+ "inner": {
431
+ "kind": "object",
432
+ "properties": {
433
+ "id": {
434
+ "kind": "string",
435
+ "metadata": {
436
+ "description": "Stable UUIDv7 user id."
437
+ }
438
+ },
439
+ "username": {
440
+ "kind": "string",
441
+ "metadata": {
442
+ "description": "Account username."
443
+ }
444
+ },
445
+ "email": {
446
+ "kind": "optional",
447
+ "inner": {
448
+ "kind": "string"
449
+ },
450
+ "metadata": {
451
+ "description": "User email address, when set."
452
+ }
453
+ },
454
+ "name": {
455
+ "kind": "optional",
456
+ "inner": {
457
+ "kind": "string"
458
+ },
459
+ "metadata": {
460
+ "description": "Display name, when set."
461
+ }
462
+ }
203
463
  },
464
+ "required": [
465
+ "id",
466
+ "username"
467
+ ],
468
+ "unknownKeys": "strip",
204
469
  "metadata": {
205
- "description": "Display name, when set."
470
+ "description": "Authenticated user summary."
206
471
  }
207
472
  }
208
473
  },
209
- "required": [
210
- "id",
211
- "username"
212
- ],
213
- "unknownKeys": "strip",
214
- "metadata": {
215
- "description": "Authenticated user summary."
474
+ "requiresFirstAdmin": {
475
+ "kind": "optional",
476
+ "inner": {
477
+ "kind": "bool"
478
+ },
479
+ "metadata": {
480
+ "description": "True while the auth service has zero users; the theme renderer should redirect to first-admin registration instead of showing the login form."
481
+ }
482
+ },
483
+ "firstAdminUrl": {
484
+ "kind": "optional",
485
+ "inner": {
486
+ "kind": "string"
487
+ },
488
+ "metadata": {
489
+ "description": "Absolute self-origin URL of this auth service's register view so the theme can load it in-shell without knowing the auth origin."
490
+ }
491
+ },
492
+ "alreadyLoggedIn": {
493
+ "kind": "optional",
494
+ "inner": {
495
+ "kind": "bool"
496
+ },
497
+ "metadata": {
498
+ "description": "True when the GET request already carried a valid access token; the theme renderer should show a signed-in state instead of the login form."
499
+ }
500
+ },
501
+ "loggedOut": {
502
+ "kind": "optional",
503
+ "inner": {
504
+ "kind": "bool"
505
+ },
506
+ "metadata": {
507
+ "description": "True after the login route handled ?action=logout."
508
+ }
509
+ },
510
+ "logoutUrl": {
511
+ "kind": "optional",
512
+ "inner": {
513
+ "kind": "string"
514
+ },
515
+ "metadata": {
516
+ "description": "Tenant-app path of the logout view from app auth config."
517
+ }
518
+ },
519
+ "nextUrl": {
520
+ "kind": "optional",
521
+ "inner": {
522
+ "kind": "string"
523
+ },
524
+ "metadata": {
525
+ "description": "Echo of the next path when already signed in; the theme renderer should redirect there immediately."
526
+ }
216
527
  }
217
- }
218
- },
219
- "requiresFirstAdmin": {
220
- "kind": "optional",
221
- "inner": {
222
- "kind": "bool"
223
- },
224
- "metadata": {
225
- "description": "True while the auth service has zero users; the theme renderer should redirect to first-admin registration instead of showing the login form."
226
- }
227
- },
228
- "firstAdminUrl": {
229
- "kind": "optional",
230
- "inner": {
231
- "kind": "string"
232
- },
233
- "metadata": {
234
- "description": "Absolute self-origin URL of this auth service's register view so the theme can load it in-shell without knowing the auth origin."
235
- }
236
- },
237
- "alreadyLoggedIn": {
238
- "kind": "optional",
239
- "inner": {
240
- "kind": "bool"
241
528
  },
242
- "metadata": {
243
- "description": "True when the GET request already carried a valid access token; the theme renderer should show a signed-in state instead of the login form."
244
- }
245
- },
246
- "loggedOut": {
247
- "kind": "optional",
248
- "inner": {
249
- "kind": "bool"
250
- },
251
- "metadata": {
252
- "description": "True after the login route handled ?action=logout."
253
- }
254
- },
255
- "logoutUrl": {
256
- "kind": "optional",
257
- "inner": {
258
- "kind": "string"
259
- },
260
- "metadata": {
261
- "description": "Tenant-app path of the logout view from app auth config."
262
- }
529
+ "required": [
530
+ "status"
531
+ ],
532
+ "unknownKeys": "strip"
263
533
  },
264
- "nextUrl": {
265
- "kind": "optional",
266
- "inner": {
267
- "kind": "string"
268
- },
269
- "metadata": {
270
- "description": "Echo of the next path when already signed in; the theme renderer should redirect there immediately."
271
- }
272
- }
534
+ "definitions": {},
535
+ "extensions": {}
273
536
  },
274
- "required": [
275
- "status"
276
- ],
277
- "unknownKeys": "strip"
278
- },
279
- "definitions": {},
280
- "extensions": {}
281
- },
282
- "metadataResponseSchema": {},
283
- "renderable": true,
284
- "html": {
285
- "renderers": {
286
- "bootstrap5": {
287
- "defaultRenderer": "default",
288
- "renderModes": [
289
- "page",
290
- "fragment"
291
- ],
292
- "slots": [
293
- "main",
294
- "nav.profile"
295
- ],
296
- "renderers": [
297
- {
298
- "id": "default",
299
- "title": "Default Content",
300
- "slotId": "main",
301
- "renderModes": [
302
- "page",
303
- "fragment"
304
- ]
305
- },
306
- {
307
- "id": "default",
308
- "title": "Default Content",
309
- "slotId": "main",
310
- "renderModes": [
311
- "page",
312
- "fragment"
313
- ]
314
- },
315
- {
316
- "id": "nav.profile",
317
- "title": "nav.profile",
318
- "slotId": "nav.profile",
537
+ "metadataResponseSchema": {},
538
+ "renderable": true,
539
+ "html": {
540
+ "renderers": {
541
+ "bootstrap5": {
542
+ "defaultRenderer": "default",
319
543
  "renderModes": [
320
- "fragment"
544
+ "page"
545
+ ],
546
+ "slots": [
547
+ "main"
548
+ ],
549
+ "renderers": [
550
+ {
551
+ "id": "default",
552
+ "title": "Default Content",
553
+ "slotId": "main",
554
+ "renderModes": [
555
+ "page",
556
+ "fragment"
557
+ ]
558
+ }
321
559
  ]
322
560
  }
323
- ]
561
+ }
562
+ },
563
+ "auth": {
564
+ "required": false,
565
+ "callers": [
566
+ "user"
567
+ ],
568
+ "permissions": []
569
+ },
570
+ "sitemap": {
571
+ "kind": "default"
572
+ },
573
+ "robots": [],
574
+ "role": "auth.login",
575
+ "dependencies": [],
576
+ "chrome": {
577
+ "fullScreen": true
578
+ },
579
+ "apiContracts": [],
580
+ "demoScenarios": [],
581
+ "cacheHints": {
582
+ "ttlSeconds": 0,
583
+ "varyBy": []
324
584
  }
325
585
  }
326
- },
327
- "auth": {
328
- "required": false,
329
- "callers": [
330
- "user"
331
- ],
332
- "permissions": []
333
- },
334
- "sitemap": {
335
- "kind": "default"
336
- },
337
- "robots": [],
338
- "role": "auth.login",
339
- "dependencies": [
340
- "logout.index",
341
- "refresh.index",
342
- "register.index"
343
- ],
344
- "chrome": {
345
- "fullScreen": true
346
- },
347
- "apiContracts": [],
348
- "demoScenarios": [],
349
- "cacheHints": {
350
- "ttlSeconds": 0,
351
- "varyBy": []
352
- }
586
+ ]
353
587
  },
354
588
  {
355
589
  "viewId": "logout.index",
@@ -357,132 +591,179 @@
357
591
  "description": "Clear the authentication token from the client.",
358
592
  "path": "/logout",
359
593
  "pathVariants": [],
360
- "methods": [
361
- "GET",
362
- "POST"
363
- ],
364
594
  "paramsSchema": {},
365
- "querySchema": {
366
- "anyvaliVersion": "1.0",
367
- "schemaVersion": "1.1",
368
- "root": {
369
- "kind": "object",
370
- "properties": {},
371
- "required": [],
372
- "unknownKeys": "strip"
373
- },
374
- "definitions": {},
375
- "extensions": {}
376
- },
377
- "headersSchema": {
378
- "anyvaliVersion": "1.0",
379
- "schemaVersion": "1.1",
380
- "root": {
381
- "kind": "object",
382
- "properties": {},
383
- "required": [],
384
- "unknownKeys": "strip"
385
- },
386
- "definitions": {},
387
- "extensions": {}
388
- },
389
- "bodySchema": {
390
- "anyvaliVersion": "1.0",
391
- "schemaVersion": "1.1",
392
- "root": {
393
- "kind": "object",
394
- "properties": {},
395
- "required": [],
396
- "unknownKeys": "strip"
397
- },
398
- "definitions": {},
399
- "extensions": {}
400
- },
401
- "jsonResponseSchema": {
402
- "anyvaliVersion": "1.0",
403
- "schemaVersion": "1.1",
404
- "root": {
405
- "kind": "object",
406
- "properties": {
407
- "status": {
408
- "kind": "enum",
409
- "values": [
410
- "ok"
595
+ "operations": [
596
+ {
597
+ "operationId": "auth.logout.view",
598
+ "method": "GET",
599
+ "title": "Logout",
600
+ "description": "Clear the authentication token from the client.",
601
+ "querySchema": {},
602
+ "headersSchema": {},
603
+ "bodySchema": {},
604
+ "jsonResponseSchema": {
605
+ "anyvaliVersion": "1.0",
606
+ "schemaVersion": "1.1",
607
+ "root": {
608
+ "kind": "object",
609
+ "properties": {
610
+ "status": {
611
+ "kind": "enum",
612
+ "values": [
613
+ "ok"
614
+ ],
615
+ "metadata": {
616
+ "description": "Logout request outcome."
617
+ }
618
+ },
619
+ "message": {
620
+ "kind": "string",
621
+ "metadata": {
622
+ "description": "Human-readable logout status for the renderer."
623
+ }
624
+ }
625
+ },
626
+ "required": [
627
+ "status",
628
+ "message"
411
629
  ],
412
- "metadata": {
413
- "description": "Logout request outcome."
414
- }
630
+ "unknownKeys": "strip"
415
631
  },
416
- "message": {
417
- "kind": "string",
418
- "metadata": {
419
- "description": "Human-readable logout status for the renderer."
632
+ "definitions": {},
633
+ "extensions": {}
634
+ },
635
+ "metadataResponseSchema": {},
636
+ "renderable": true,
637
+ "html": {
638
+ "renderers": {
639
+ "bootstrap5": {
640
+ "defaultRenderer": "default",
641
+ "renderModes": [
642
+ "page"
643
+ ],
644
+ "slots": [
645
+ "main"
646
+ ],
647
+ "renderers": [
648
+ {
649
+ "id": "default",
650
+ "title": "Default Content",
651
+ "slotId": "main",
652
+ "renderModes": [
653
+ "page",
654
+ "fragment"
655
+ ]
656
+ }
657
+ ]
420
658
  }
421
659
  }
422
660
  },
423
- "required": [
424
- "status",
425
- "message"
426
- ],
427
- "unknownKeys": "strip"
428
- },
429
- "definitions": {},
430
- "extensions": {}
431
- },
432
- "metadataResponseSchema": {},
433
- "renderable": true,
434
- "html": {
435
- "renderers": {
436
- "bootstrap5": {
437
- "defaultRenderer": "default",
438
- "renderModes": [
439
- "page"
661
+ "auth": {
662
+ "required": false,
663
+ "callers": [
664
+ "user"
440
665
  ],
441
- "slots": [
442
- "main"
443
- ],
444
- "renderers": [
445
- {
446
- "id": "default",
447
- "title": "Default Content",
448
- "slotId": "main",
449
- "renderModes": [
450
- "page",
451
- "fragment"
452
- ]
666
+ "permissions": []
667
+ },
668
+ "sitemap": {
669
+ "kind": "default"
670
+ },
671
+ "robots": [],
672
+ "role": "auth.logout",
673
+ "dependencies": [],
674
+ "apiContracts": [],
675
+ "demoScenarios": [],
676
+ "cacheHints": {
677
+ "ttlSeconds": 0,
678
+ "varyBy": []
679
+ }
680
+ },
681
+ {
682
+ "operationId": "auth.logout",
683
+ "method": "POST",
684
+ "title": "Logout",
685
+ "description": "Clear the authentication token from the client.",
686
+ "querySchema": {},
687
+ "headersSchema": {},
688
+ "bodySchema": {},
689
+ "jsonResponseSchema": {
690
+ "anyvaliVersion": "1.0",
691
+ "schemaVersion": "1.1",
692
+ "root": {
693
+ "kind": "object",
694
+ "properties": {
695
+ "status": {
696
+ "kind": "enum",
697
+ "values": [
698
+ "ok"
699
+ ],
700
+ "metadata": {
701
+ "description": "Logout request outcome."
702
+ }
703
+ },
704
+ "message": {
705
+ "kind": "string",
706
+ "metadata": {
707
+ "description": "Human-readable logout status for the renderer."
708
+ }
709
+ }
453
710
  },
454
- {
455
- "id": "default",
456
- "title": "Default Content",
457
- "slotId": "main",
711
+ "required": [
712
+ "status",
713
+ "message"
714
+ ],
715
+ "unknownKeys": "strip"
716
+ },
717
+ "definitions": {},
718
+ "extensions": {}
719
+ },
720
+ "metadataResponseSchema": {},
721
+ "renderable": true,
722
+ "html": {
723
+ "renderers": {
724
+ "bootstrap5": {
725
+ "defaultRenderer": "default",
458
726
  "renderModes": [
459
- "page",
460
- "fragment"
727
+ "page"
728
+ ],
729
+ "slots": [
730
+ "main"
731
+ ],
732
+ "renderers": [
733
+ {
734
+ "id": "default",
735
+ "title": "Default Content",
736
+ "slotId": "main",
737
+ "renderModes": [
738
+ "page",
739
+ "fragment"
740
+ ]
741
+ }
461
742
  ]
462
743
  }
463
- ]
744
+ }
745
+ },
746
+ "auth": {
747
+ "required": false,
748
+ "callers": [
749
+ "user"
750
+ ],
751
+ "permissions": []
752
+ },
753
+ "sitemap": {
754
+ "kind": "default"
755
+ },
756
+ "robots": [],
757
+ "role": "auth.logout",
758
+ "dependencies": [],
759
+ "apiContracts": [],
760
+ "demoScenarios": [],
761
+ "cacheHints": {
762
+ "ttlSeconds": 0,
763
+ "varyBy": []
464
764
  }
465
765
  }
466
- },
467
- "auth": {
468
- "required": false,
469
- "callers": [
470
- "user"
471
- ],
472
- "permissions": []
473
- },
474
- "sitemap": {
475
- "kind": "default"
476
- },
477
- "robots": [],
478
- "role": "auth.logout",
479
- "dependencies": [],
480
- "apiContracts": [],
481
- "demoScenarios": [],
482
- "cacheHints": {
483
- "ttlSeconds": 0,
484
- "varyBy": []
485
- }
766
+ ]
486
767
  },
487
768
  {
488
769
  "viewId": "refresh.index",
@@ -490,142 +771,136 @@
490
771
  "description": "Exchange a refresh token for a new access token.",
491
772
  "path": "/refresh",
492
773
  "pathVariants": [],
493
- "methods": [
494
- "POST"
495
- ],
496
774
  "paramsSchema": {},
497
- "querySchema": {
498
- "anyvaliVersion": "1.0",
499
- "schemaVersion": "1.1",
500
- "root": {
501
- "kind": "object",
502
- "properties": {},
503
- "required": [],
504
- "unknownKeys": "strip"
505
- },
506
- "definitions": {},
507
- "extensions": {}
508
- },
509
- "headersSchema": {
510
- "anyvaliVersion": "1.0",
511
- "schemaVersion": "1.1",
512
- "root": {
513
- "kind": "object",
514
- "properties": {
515
- "x-bp-refresh": {
516
- "kind": "optional",
517
- "inner": {
518
- "kind": "string",
519
- "minLength": 1
520
- }
521
- }
522
- },
523
- "required": [],
524
- "unknownKeys": "strip"
525
- },
526
- "definitions": {},
527
- "extensions": {}
528
- },
529
- "bodySchema": {
530
- "anyvaliVersion": "1.0",
531
- "schemaVersion": "1.1",
532
- "root": {
533
- "kind": "object",
534
- "properties": {
535
- "refreshToken": {
536
- "kind": "optional",
537
- "inner": {
538
- "kind": "string",
539
- "minLength": 1,
540
- "metadata": {
541
- "description": "Signed refresh token issued by the auth service."
775
+ "operations": [
776
+ {
777
+ "operationId": "auth.refresh",
778
+ "method": "POST",
779
+ "title": "Refresh Token",
780
+ "description": "Exchange a refresh token for a new access token.",
781
+ "querySchema": {},
782
+ "headersSchema": {
783
+ "anyvaliVersion": "1.0",
784
+ "schemaVersion": "1.1",
785
+ "root": {
786
+ "kind": "object",
787
+ "properties": {
788
+ "x-bp-refresh": {
789
+ "kind": "optional",
790
+ "inner": {
791
+ "kind": "string",
792
+ "minLength": 1
793
+ }
542
794
  }
543
- }
544
- }
545
- },
546
- "required": [],
547
- "unknownKeys": "strip"
548
- },
549
- "definitions": {},
550
- "extensions": {}
551
- },
552
- "jsonResponseSchema": {
553
- "anyvaliVersion": "1.0",
554
- "schemaVersion": "1.1",
555
- "root": {
556
- "kind": "object",
557
- "properties": {
558
- "status": {
559
- "kind": "enum",
560
- "values": [
561
- "ok",
562
- "error"
563
- ],
564
- "metadata": {
565
- "description": "Refresh request outcome."
566
- }
567
- },
568
- "message": {
569
- "kind": "optional",
570
- "inner": {
571
- "kind": "string"
572
795
  },
573
- "metadata": {
574
- "description": "Human-readable status or error message for the renderer."
575
- }
796
+ "required": [],
797
+ "unknownKeys": "strip"
576
798
  },
577
- "accessToken": {
578
- "kind": "optional",
579
- "inner": {
580
- "kind": "string"
799
+ "definitions": {},
800
+ "extensions": {}
801
+ },
802
+ "bodySchema": {
803
+ "anyvaliVersion": "1.0",
804
+ "schemaVersion": "1.1",
805
+ "root": {
806
+ "kind": "object",
807
+ "properties": {
808
+ "refreshToken": {
809
+ "kind": "optional",
810
+ "inner": {
811
+ "kind": "string",
812
+ "minLength": 1,
813
+ "metadata": {
814
+ "description": "Signed refresh token issued by the auth service."
815
+ }
816
+ }
817
+ }
581
818
  },
582
- "metadata": {
583
- "description": "New signed JWT access token returned when refresh succeeds."
584
- }
819
+ "required": [],
820
+ "unknownKeys": "strip"
585
821
  },
586
- "expiresInSeconds": {
587
- "kind": "optional",
588
- "inner": {
589
- "kind": "int",
590
- "min": 1
822
+ "definitions": {},
823
+ "extensions": {}
824
+ },
825
+ "jsonResponseSchema": {
826
+ "anyvaliVersion": "1.0",
827
+ "schemaVersion": "1.1",
828
+ "root": {
829
+ "kind": "object",
830
+ "properties": {
831
+ "status": {
832
+ "kind": "enum",
833
+ "values": [
834
+ "ok",
835
+ "error"
836
+ ],
837
+ "metadata": {
838
+ "description": "Refresh request outcome."
839
+ }
840
+ },
841
+ "message": {
842
+ "kind": "optional",
843
+ "inner": {
844
+ "kind": "string"
845
+ },
846
+ "metadata": {
847
+ "description": "Human-readable status or error message for the renderer."
848
+ }
849
+ },
850
+ "accessToken": {
851
+ "kind": "optional",
852
+ "inner": {
853
+ "kind": "string"
854
+ },
855
+ "metadata": {
856
+ "description": "New signed JWT access token returned when refresh succeeds."
857
+ }
858
+ },
859
+ "expiresInSeconds": {
860
+ "kind": "optional",
861
+ "inner": {
862
+ "kind": "int",
863
+ "min": 1
864
+ },
865
+ "metadata": {
866
+ "description": "New access token lifetime in seconds."
867
+ }
868
+ }
591
869
  },
592
- "metadata": {
593
- "description": "New access token lifetime in seconds."
594
- }
595
- }
870
+ "required": [
871
+ "status"
872
+ ],
873
+ "unknownKeys": "strip"
874
+ },
875
+ "definitions": {},
876
+ "extensions": {}
596
877
  },
597
- "required": [
598
- "status"
599
- ],
600
- "unknownKeys": "strip"
601
- },
602
- "definitions": {},
603
- "extensions": {}
604
- },
605
- "metadataResponseSchema": {},
606
- "renderable": false,
607
- "html": {
608
- "renderers": {}
609
- },
610
- "auth": {
611
- "required": false,
612
- "callers": [
613
- "user"
614
- ],
615
- "permissions": []
616
- },
617
- "sitemap": {
618
- "kind": "default"
619
- },
620
- "robots": [],
621
- "role": "auth.refresh",
622
- "dependencies": [],
623
- "apiContracts": [],
624
- "demoScenarios": [],
625
- "cacheHints": {
626
- "ttlSeconds": 0,
627
- "varyBy": []
628
- }
878
+ "metadataResponseSchema": {},
879
+ "renderable": false,
880
+ "html": {
881
+ "renderers": {}
882
+ },
883
+ "auth": {
884
+ "required": false,
885
+ "callers": [
886
+ "user"
887
+ ],
888
+ "permissions": []
889
+ },
890
+ "sitemap": {
891
+ "kind": "default"
892
+ },
893
+ "robots": [],
894
+ "role": "auth.refresh",
895
+ "dependencies": [],
896
+ "apiContracts": [],
897
+ "demoScenarios": [],
898
+ "cacheHints": {
899
+ "ttlSeconds": 0,
900
+ "varyBy": []
901
+ }
902
+ }
903
+ ]
629
904
  },
630
905
  {
631
906
  "viewId": "register.index",
@@ -633,239 +908,389 @@
633
908
  "description": "Open registration for the very first user. Once any user exists, this endpoint requires admin auth.",
634
909
  "path": "/register",
635
910
  "pathVariants": [],
636
- "methods": [
637
- "GET",
638
- "POST"
639
- ],
640
911
  "paramsSchema": {},
641
- "querySchema": {
642
- "anyvaliVersion": "1.0",
643
- "schemaVersion": "1.1",
644
- "root": {
645
- "kind": "object",
646
- "properties": {
647
- "next": {
648
- "kind": "optional",
649
- "inner": {
650
- "kind": "string"
912
+ "operations": [
913
+ {
914
+ "operationId": "auth.register.view",
915
+ "method": "GET",
916
+ "title": "Register First Admin",
917
+ "description": "Open registration for the very first user. Once any user exists, this endpoint requires admin auth.",
918
+ "querySchema": {
919
+ "anyvaliVersion": "1.0",
920
+ "schemaVersion": "1.1",
921
+ "root": {
922
+ "kind": "object",
923
+ "properties": {
924
+ "next": {
925
+ "kind": "optional",
926
+ "inner": {
927
+ "kind": "string"
928
+ },
929
+ "metadata": {
930
+ "description": "The view path to pass through to login after first-admin registration."
931
+ }
932
+ }
651
933
  },
652
- "metadata": {
653
- "description": "The view path to pass through to login after first-admin registration."
654
- }
655
- }
656
- },
657
- "required": [],
658
- "unknownKeys": "strip"
659
- },
660
- "definitions": {},
661
- "extensions": {}
662
- },
663
- "headersSchema": {
664
- "anyvaliVersion": "1.0",
665
- "schemaVersion": "1.1",
666
- "root": {
667
- "kind": "object",
668
- "properties": {},
669
- "required": [],
670
- "unknownKeys": "strip"
671
- },
672
- "definitions": {},
673
- "extensions": {}
674
- },
675
- "bodySchema": {
676
- "anyvaliVersion": "1.0",
677
- "schemaVersion": "1.1",
678
- "root": {
679
- "kind": "object",
680
- "properties": {
681
- "username": {
682
- "kind": "string",
683
- "minLength": 1,
684
- "metadata": {
685
- "description": "Username for the first admin account."
686
- }
934
+ "required": [],
935
+ "unknownKeys": "strip"
687
936
  },
688
- "password": {
689
- "kind": "string",
690
- "minLength": 8,
691
- "metadata": {
692
- "description": "Password for the first admin account."
693
- }
694
- },
695
- "email": {
696
- "kind": "optional",
697
- "inner": {
698
- "kind": "string"
937
+ "definitions": {},
938
+ "extensions": {}
939
+ },
940
+ "headersSchema": {},
941
+ "bodySchema": {},
942
+ "jsonResponseSchema": {
943
+ "anyvaliVersion": "1.0",
944
+ "schemaVersion": "1.1",
945
+ "root": {
946
+ "kind": "object",
947
+ "properties": {
948
+ "status": {
949
+ "kind": "enum",
950
+ "values": [
951
+ "ok",
952
+ "error"
953
+ ],
954
+ "metadata": {
955
+ "description": "Registration request outcome."
956
+ }
957
+ },
958
+ "message": {
959
+ "kind": "optional",
960
+ "inner": {
961
+ "kind": "string"
962
+ },
963
+ "metadata": {
964
+ "description": "Human-readable status or error message for the renderer."
965
+ }
966
+ },
967
+ "user": {
968
+ "kind": "optional",
969
+ "inner": {
970
+ "kind": "object",
971
+ "properties": {
972
+ "id": {
973
+ "kind": "string",
974
+ "metadata": {
975
+ "description": "Stable UUIDv7 user id."
976
+ }
977
+ },
978
+ "username": {
979
+ "kind": "string",
980
+ "metadata": {
981
+ "description": "Created account username."
982
+ }
983
+ },
984
+ "isFirstAdmin": {
985
+ "kind": "bool",
986
+ "metadata": {
987
+ "description": "True when this account is the deployment's first admin."
988
+ }
989
+ }
990
+ },
991
+ "required": [
992
+ "id",
993
+ "username",
994
+ "isFirstAdmin"
995
+ ],
996
+ "unknownKeys": "strip",
997
+ "metadata": {
998
+ "description": "Created first-admin user summary."
999
+ }
1000
+ }
1001
+ },
1002
+ "registrationOpen": {
1003
+ "kind": "optional",
1004
+ "inner": {
1005
+ "kind": "bool"
1006
+ },
1007
+ "metadata": {
1008
+ "description": "True while the auth service has zero users; once false, the renderer should send the browser to login."
1009
+ }
1010
+ },
1011
+ "loginUrl": {
1012
+ "kind": "optional",
1013
+ "inner": {
1014
+ "kind": "string"
1015
+ },
1016
+ "metadata": {
1017
+ "description": "Absolute self-origin URL of this auth service's login view, used when registration is closed and after successful first-admin creation."
1018
+ }
1019
+ }
699
1020
  },
700
- "metadata": {
701
- "description": "Email address for the first admin account."
702
- }
1021
+ "required": [
1022
+ "status"
1023
+ ],
1024
+ "unknownKeys": "strip"
703
1025
  },
704
- "name": {
705
- "kind": "optional",
706
- "inner": {
707
- "kind": "string"
708
- },
709
- "metadata": {
710
- "description": "Display name for the first admin account."
1026
+ "definitions": {},
1027
+ "extensions": {}
1028
+ },
1029
+ "metadataResponseSchema": {},
1030
+ "renderable": true,
1031
+ "html": {
1032
+ "renderers": {
1033
+ "bootstrap5": {
1034
+ "defaultRenderer": "default",
1035
+ "renderModes": [
1036
+ "page"
1037
+ ],
1038
+ "slots": [
1039
+ "main"
1040
+ ],
1041
+ "renderers": [
1042
+ {
1043
+ "id": "default",
1044
+ "title": "Default Content",
1045
+ "slotId": "main",
1046
+ "renderModes": [
1047
+ "page",
1048
+ "fragment"
1049
+ ]
1050
+ }
1051
+ ]
711
1052
  }
712
1053
  }
713
1054
  },
714
- "required": [
715
- "username",
716
- "password"
1055
+ "auth": {
1056
+ "required": false,
1057
+ "callers": [
1058
+ "user"
1059
+ ],
1060
+ "permissions": []
1061
+ },
1062
+ "sitemap": {
1063
+ "kind": "default"
1064
+ },
1065
+ "robots": [],
1066
+ "role": "auth.register",
1067
+ "dependencies": [
1068
+ "auth.register",
1069
+ "auth.login.view"
717
1070
  ],
718
- "unknownKeys": "strip"
1071
+ "chrome": {
1072
+ "fullScreen": true
1073
+ },
1074
+ "apiContracts": [],
1075
+ "demoScenarios": [],
1076
+ "cacheHints": {
1077
+ "ttlSeconds": 0,
1078
+ "varyBy": []
1079
+ }
719
1080
  },
720
- "definitions": {},
721
- "extensions": {}
722
- },
723
- "jsonResponseSchema": {
724
- "anyvaliVersion": "1.0",
725
- "schemaVersion": "1.1",
726
- "root": {
727
- "kind": "object",
728
- "properties": {
729
- "status": {
730
- "kind": "enum",
731
- "values": [
732
- "ok",
733
- "error"
734
- ],
735
- "metadata": {
736
- "description": "Registration request outcome."
737
- }
1081
+ {
1082
+ "operationId": "auth.register",
1083
+ "method": "POST",
1084
+ "title": "Register First Admin",
1085
+ "description": "Open registration for the very first user. Once any user exists, this endpoint requires admin auth.",
1086
+ "querySchema": {
1087
+ "anyvaliVersion": "1.0",
1088
+ "schemaVersion": "1.1",
1089
+ "root": {
1090
+ "kind": "object",
1091
+ "properties": {
1092
+ "next": {
1093
+ "kind": "optional",
1094
+ "inner": {
1095
+ "kind": "string"
1096
+ },
1097
+ "metadata": {
1098
+ "description": "The view path to pass through to login after first-admin registration."
1099
+ }
1100
+ }
1101
+ },
1102
+ "required": [],
1103
+ "unknownKeys": "strip"
738
1104
  },
739
- "message": {
740
- "kind": "optional",
741
- "inner": {
742
- "kind": "string"
1105
+ "definitions": {},
1106
+ "extensions": {}
1107
+ },
1108
+ "headersSchema": {},
1109
+ "bodySchema": {
1110
+ "anyvaliVersion": "1.0",
1111
+ "schemaVersion": "1.1",
1112
+ "root": {
1113
+ "kind": "object",
1114
+ "properties": {
1115
+ "username": {
1116
+ "kind": "string",
1117
+ "minLength": 1,
1118
+ "metadata": {
1119
+ "description": "Username for the first admin account."
1120
+ }
1121
+ },
1122
+ "password": {
1123
+ "kind": "string",
1124
+ "minLength": 8,
1125
+ "metadata": {
1126
+ "description": "Password for the first admin account."
1127
+ }
1128
+ },
1129
+ "email": {
1130
+ "kind": "optional",
1131
+ "inner": {
1132
+ "kind": "string"
1133
+ },
1134
+ "metadata": {
1135
+ "description": "Email address for the first admin account."
1136
+ }
1137
+ },
1138
+ "name": {
1139
+ "kind": "optional",
1140
+ "inner": {
1141
+ "kind": "string"
1142
+ },
1143
+ "metadata": {
1144
+ "description": "Display name for the first admin account."
1145
+ }
1146
+ }
743
1147
  },
744
- "metadata": {
745
- "description": "Human-readable status or error message for the renderer."
746
- }
1148
+ "required": [
1149
+ "username",
1150
+ "password"
1151
+ ],
1152
+ "unknownKeys": "strip"
747
1153
  },
748
- "user": {
749
- "kind": "optional",
750
- "inner": {
751
- "kind": "object",
752
- "properties": {
753
- "id": {
754
- "kind": "string",
755
- "metadata": {
756
- "description": "Stable UUIDv7 user id."
757
- }
1154
+ "definitions": {},
1155
+ "extensions": {}
1156
+ },
1157
+ "jsonResponseSchema": {
1158
+ "anyvaliVersion": "1.0",
1159
+ "schemaVersion": "1.1",
1160
+ "root": {
1161
+ "kind": "object",
1162
+ "properties": {
1163
+ "status": {
1164
+ "kind": "enum",
1165
+ "values": [
1166
+ "ok",
1167
+ "error"
1168
+ ],
1169
+ "metadata": {
1170
+ "description": "Registration request outcome."
1171
+ }
1172
+ },
1173
+ "message": {
1174
+ "kind": "optional",
1175
+ "inner": {
1176
+ "kind": "string"
758
1177
  },
759
- "username": {
760
- "kind": "string",
1178
+ "metadata": {
1179
+ "description": "Human-readable status or error message for the renderer."
1180
+ }
1181
+ },
1182
+ "user": {
1183
+ "kind": "optional",
1184
+ "inner": {
1185
+ "kind": "object",
1186
+ "properties": {
1187
+ "id": {
1188
+ "kind": "string",
1189
+ "metadata": {
1190
+ "description": "Stable UUIDv7 user id."
1191
+ }
1192
+ },
1193
+ "username": {
1194
+ "kind": "string",
1195
+ "metadata": {
1196
+ "description": "Created account username."
1197
+ }
1198
+ },
1199
+ "isFirstAdmin": {
1200
+ "kind": "bool",
1201
+ "metadata": {
1202
+ "description": "True when this account is the deployment's first admin."
1203
+ }
1204
+ }
1205
+ },
1206
+ "required": [
1207
+ "id",
1208
+ "username",
1209
+ "isFirstAdmin"
1210
+ ],
1211
+ "unknownKeys": "strip",
761
1212
  "metadata": {
762
- "description": "Created account username."
1213
+ "description": "Created first-admin user summary."
763
1214
  }
1215
+ }
1216
+ },
1217
+ "registrationOpen": {
1218
+ "kind": "optional",
1219
+ "inner": {
1220
+ "kind": "bool"
764
1221
  },
765
- "isFirstAdmin": {
766
- "kind": "bool",
767
- "metadata": {
768
- "description": "True when this account is the deployment's first admin."
769
- }
1222
+ "metadata": {
1223
+ "description": "True while the auth service has zero users; once false, the renderer should send the browser to login."
770
1224
  }
771
1225
  },
772
- "required": [
773
- "id",
774
- "username",
775
- "isFirstAdmin"
776
- ],
777
- "unknownKeys": "strip",
778
- "metadata": {
779
- "description": "Created first-admin user summary."
1226
+ "loginUrl": {
1227
+ "kind": "optional",
1228
+ "inner": {
1229
+ "kind": "string"
1230
+ },
1231
+ "metadata": {
1232
+ "description": "Absolute self-origin URL of this auth service's login view, used when registration is closed and after successful first-admin creation."
1233
+ }
780
1234
  }
781
- }
782
- },
783
- "registrationOpen": {
784
- "kind": "optional",
785
- "inner": {
786
- "kind": "bool"
787
1235
  },
788
- "metadata": {
789
- "description": "True while the auth service has zero users; once false, the renderer should send the browser to login."
790
- }
1236
+ "required": [
1237
+ "status"
1238
+ ],
1239
+ "unknownKeys": "strip"
791
1240
  },
792
- "loginUrl": {
793
- "kind": "optional",
794
- "inner": {
795
- "kind": "string"
796
- },
797
- "metadata": {
798
- "description": "Absolute self-origin URL of this auth service's login view, used when registration is closed and after successful first-admin creation."
799
- }
800
- }
1241
+ "definitions": {},
1242
+ "extensions": {}
801
1243
  },
802
- "required": [
803
- "status"
804
- ],
805
- "unknownKeys": "strip"
806
- },
807
- "definitions": {},
808
- "extensions": {}
809
- },
810
- "metadataResponseSchema": {},
811
- "renderable": true,
812
- "html": {
813
- "renderers": {
814
- "bootstrap5": {
815
- "defaultRenderer": "default",
816
- "renderModes": [
817
- "page"
818
- ],
819
- "slots": [
820
- "main"
821
- ],
822
- "renderers": [
823
- {
824
- "id": "default",
825
- "title": "Default Content",
826
- "slotId": "main",
1244
+ "metadataResponseSchema": {},
1245
+ "renderable": true,
1246
+ "html": {
1247
+ "renderers": {
1248
+ "bootstrap5": {
1249
+ "defaultRenderer": "default",
827
1250
  "renderModes": [
828
- "page",
829
- "fragment"
830
- ]
831
- },
832
- {
833
- "id": "default",
834
- "title": "Default Content",
835
- "slotId": "main",
836
- "renderModes": [
837
- "page",
838
- "fragment"
1251
+ "page"
1252
+ ],
1253
+ "slots": [
1254
+ "main"
1255
+ ],
1256
+ "renderers": [
1257
+ {
1258
+ "id": "default",
1259
+ "title": "Default Content",
1260
+ "slotId": "main",
1261
+ "renderModes": [
1262
+ "page",
1263
+ "fragment"
1264
+ ]
1265
+ }
839
1266
  ]
840
1267
  }
841
- ]
1268
+ }
1269
+ },
1270
+ "auth": {
1271
+ "required": false,
1272
+ "callers": [
1273
+ "user"
1274
+ ],
1275
+ "permissions": []
1276
+ },
1277
+ "sitemap": {
1278
+ "kind": "default"
1279
+ },
1280
+ "robots": [],
1281
+ "role": "auth.register",
1282
+ "dependencies": [],
1283
+ "chrome": {
1284
+ "fullScreen": true
1285
+ },
1286
+ "apiContracts": [],
1287
+ "demoScenarios": [],
1288
+ "cacheHints": {
1289
+ "ttlSeconds": 0,
1290
+ "varyBy": []
842
1291
  }
843
1292
  }
844
- },
845
- "auth": {
846
- "required": false,
847
- "callers": [
848
- "user"
849
- ],
850
- "permissions": []
851
- },
852
- "sitemap": {
853
- "kind": "default"
854
- },
855
- "robots": [],
856
- "role": "auth.register",
857
- "dependencies": [
858
- "login.index"
859
- ],
860
- "chrome": {
861
- "fullScreen": true
862
- },
863
- "apiContracts": [],
864
- "demoScenarios": [],
865
- "cacheHints": {
866
- "ttlSeconds": 0,
867
- "varyBy": []
868
- }
1293
+ ]
869
1294
  }
870
1295
  ],
871
1296
  "configSchemas": [],
@@ -884,9 +1309,15 @@
884
1309
  "viewId": "login.index",
885
1310
  "path": "/login",
886
1311
  "pathVariants": [],
887
- "methods": [
888
- "GET",
889
- "POST"
1312
+ "operations": [
1313
+ {
1314
+ "operationId": "auth.login.view",
1315
+ "method": "GET"
1316
+ },
1317
+ {
1318
+ "operationId": "auth.login",
1319
+ "method": "POST"
1320
+ }
890
1321
  ],
891
1322
  "paramNames": [],
892
1323
  "renderers": [
@@ -908,9 +1339,15 @@
908
1339
  "viewId": "logout.index",
909
1340
  "path": "/logout",
910
1341
  "pathVariants": [],
911
- "methods": [
912
- "GET",
913
- "POST"
1342
+ "operations": [
1343
+ {
1344
+ "operationId": "auth.logout.view",
1345
+ "method": "GET"
1346
+ },
1347
+ {
1348
+ "operationId": "auth.logout",
1349
+ "method": "POST"
1350
+ }
914
1351
  ],
915
1352
  "paramNames": [],
916
1353
  "renderers": [
@@ -924,8 +1361,11 @@
924
1361
  "viewId": "refresh.index",
925
1362
  "path": "/refresh",
926
1363
  "pathVariants": [],
927
- "methods": [
928
- "POST"
1364
+ "operations": [
1365
+ {
1366
+ "operationId": "auth.refresh",
1367
+ "method": "POST"
1368
+ }
929
1369
  ],
930
1370
  "paramNames": [],
931
1371
  "renderers": [],
@@ -937,9 +1377,15 @@
937
1377
  "viewId": "register.index",
938
1378
  "path": "/register",
939
1379
  "pathVariants": [],
940
- "methods": [
941
- "GET",
942
- "POST"
1380
+ "operations": [
1381
+ {
1382
+ "operationId": "auth.register.view",
1383
+ "method": "GET"
1384
+ },
1385
+ {
1386
+ "operationId": "auth.register",
1387
+ "method": "POST"
1388
+ }
943
1389
  ],
944
1390
  "paramNames": [],
945
1391
  "renderers": [