@orvello/sdk 0.3.0 → 0.5.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.
package/dist/openapi.json CHANGED
@@ -8486,6 +8486,321 @@
8486
8486
  ]
8487
8487
  }
8488
8488
  },
8489
+ "/invoices/external/:invoiceId/payment-events": {
8490
+ "get": {
8491
+ "operationId": "invoices_payment_events_external",
8492
+ "tags": [
8493
+ "invoices-external"
8494
+ ],
8495
+ "summary": "Replay durable bank payment evidence events",
8496
+ "description": "Per-invoice ordered journal, afterVersion exclusive. Replay does not acknowledge or delete events. Consumers persist their cursor atomically with processing and re-read current payment evidence before commerce actions. Historical invoices without frozen instructions are not enrolled. No global cursor or delivery-order promise across invoices.",
8497
+ "responses": {
8498
+ "200": {
8499
+ "description": "JSON response",
8500
+ "content": {
8501
+ "application/json": {
8502
+ "schema": {
8503
+ "type": "object",
8504
+ "properties": {
8505
+ "success": {
8506
+ "type": "boolean"
8507
+ },
8508
+ "message": {
8509
+ "anyOf": [
8510
+ {
8511
+ "type": "string"
8512
+ },
8513
+ {
8514
+ "type": "null"
8515
+ }
8516
+ ]
8517
+ },
8518
+ "code": {
8519
+ "anyOf": [
8520
+ {
8521
+ "type": "string"
8522
+ },
8523
+ {
8524
+ "type": "null"
8525
+ }
8526
+ ]
8527
+ },
8528
+ "data": {
8529
+ "anyOf": [
8530
+ {
8531
+ "type": "object",
8532
+ "properties": {
8533
+ "events": {
8534
+ "type": "array",
8535
+ "items": {
8536
+ "type": "object",
8537
+ "properties": {
8538
+ "id": {
8539
+ "type": "string"
8540
+ },
8541
+ "type": {
8542
+ "const": "invoice.payment_evidence.changed"
8543
+ },
8544
+ "schemaVersion": {
8545
+ "const": 1
8546
+ },
8547
+ "invoiceId": {
8548
+ "type": "integer",
8549
+ "exclusiveMinimum": 0
8550
+ },
8551
+ "version": {
8552
+ "type": "integer",
8553
+ "exclusiveMinimum": 0
8554
+ },
8555
+ "cause": {
8556
+ "type": "string"
8557
+ },
8558
+ "occurredAt": {
8559
+ "type": "string",
8560
+ "format": "date-time"
8561
+ },
8562
+ "evidence": {
8563
+ "type": "object",
8564
+ "properties": {
8565
+ "invoiceId": {
8566
+ "type": "integer",
8567
+ "exclusiveMinimum": 0
8568
+ },
8569
+ "invoiceNumber": {
8570
+ "type": "string"
8571
+ },
8572
+ "currency": {
8573
+ "type": "string"
8574
+ },
8575
+ "invoiceStatus": {
8576
+ "type": "string"
8577
+ },
8578
+ "paidSource": {
8579
+ "anyOf": [
8580
+ {
8581
+ "type": "string"
8582
+ },
8583
+ {
8584
+ "type": "null"
8585
+ }
8586
+ ]
8587
+ },
8588
+ "receivingAccountId": {
8589
+ "anyOf": [
8590
+ {
8591
+ "type": "integer",
8592
+ "exclusiveMinimum": 0
8593
+ },
8594
+ {
8595
+ "type": "null"
8596
+ }
8597
+ ]
8598
+ },
8599
+ "invoiceAmount": {
8600
+ "type": "string"
8601
+ },
8602
+ "bankReceivedAmount": {
8603
+ "type": "string"
8604
+ },
8605
+ "bankRefundedAmount": {
8606
+ "type": "string"
8607
+ },
8608
+ "bankNetAmount": {
8609
+ "type": "string"
8610
+ },
8611
+ "nonCashSettlementAmount": {
8612
+ "type": "string"
8613
+ },
8614
+ "outstandingBankAmount": {
8615
+ "type": "string"
8616
+ },
8617
+ "overpaidBankAmount": {
8618
+ "type": "string"
8619
+ },
8620
+ "state": {
8621
+ "type": "string",
8622
+ "enum": [
8623
+ "unpaid",
8624
+ "partial",
8625
+ "covered",
8626
+ "overpaid",
8627
+ "review_required",
8628
+ "ineligible"
8629
+ ]
8630
+ },
8631
+ "bankPaymentConfirmed": {
8632
+ "type": "boolean"
8633
+ },
8634
+ "issues": {
8635
+ "type": "array",
8636
+ "items": {
8637
+ "type": "string",
8638
+ "enum": [
8639
+ "missing_receiving_account",
8640
+ "invalid_invoice_amount",
8641
+ "ineligible_invoice",
8642
+ "missing_payment",
8643
+ "wrong_account",
8644
+ "currency_mismatch",
8645
+ "invalid_amount",
8646
+ "unsupported_source",
8647
+ "invalid_direction",
8648
+ "payment_overallocated",
8649
+ "non_cash_settlement",
8650
+ "status_without_bank_evidence",
8651
+ "negative_bank_balance"
8652
+ ]
8653
+ }
8654
+ },
8655
+ "bankAllocationIds": {
8656
+ "type": "array",
8657
+ "items": {
8658
+ "type": "integer",
8659
+ "exclusiveMinimum": 0
8660
+ }
8661
+ },
8662
+ "excludedAllocationIds": {
8663
+ "type": "array",
8664
+ "items": {
8665
+ "type": "integer",
8666
+ "exclusiveMinimum": 0
8667
+ }
8668
+ },
8669
+ "reversedAllocationCount": {
8670
+ "type": "integer",
8671
+ "minimum": 0
8672
+ },
8673
+ "revision": {
8674
+ "type": "string",
8675
+ "pattern": "^[a-f0-9]{64}$"
8676
+ },
8677
+ "observedAt": {
8678
+ "type": "string",
8679
+ "format": "date-time"
8680
+ }
8681
+ },
8682
+ "required": [
8683
+ "invoiceId",
8684
+ "invoiceNumber",
8685
+ "currency",
8686
+ "invoiceStatus",
8687
+ "paidSource",
8688
+ "receivingAccountId",
8689
+ "invoiceAmount",
8690
+ "bankReceivedAmount",
8691
+ "bankRefundedAmount",
8692
+ "bankNetAmount",
8693
+ "nonCashSettlementAmount",
8694
+ "outstandingBankAmount",
8695
+ "overpaidBankAmount",
8696
+ "state",
8697
+ "bankPaymentConfirmed",
8698
+ "issues",
8699
+ "bankAllocationIds",
8700
+ "excludedAllocationIds",
8701
+ "reversedAllocationCount",
8702
+ "revision",
8703
+ "observedAt"
8704
+ ],
8705
+ "additionalProperties": false
8706
+ }
8707
+ },
8708
+ "required": [
8709
+ "id",
8710
+ "type",
8711
+ "schemaVersion",
8712
+ "invoiceId",
8713
+ "version",
8714
+ "cause",
8715
+ "occurredAt",
8716
+ "evidence"
8717
+ ],
8718
+ "additionalProperties": false
8719
+ }
8720
+ },
8721
+ "nextVersion": {
8722
+ "type": "integer",
8723
+ "minimum": 0
8724
+ },
8725
+ "hasMore": {
8726
+ "type": "boolean"
8727
+ }
8728
+ },
8729
+ "required": [
8730
+ "events",
8731
+ "nextVersion",
8732
+ "hasMore"
8733
+ ],
8734
+ "additionalProperties": false
8735
+ },
8736
+ {
8737
+ "type": "null"
8738
+ }
8739
+ ]
8740
+ }
8741
+ },
8742
+ "required": [
8743
+ "success",
8744
+ "data"
8745
+ ],
8746
+ "additionalProperties": false
8747
+ }
8748
+ }
8749
+ }
8750
+ }
8751
+ },
8752
+ "parameters": [
8753
+ {
8754
+ "name": "invoiceId",
8755
+ "in": "path",
8756
+ "required": true,
8757
+ "schema": {
8758
+ "type": "integer",
8759
+ "exclusiveMinimum": 0
8760
+ }
8761
+ },
8762
+ {
8763
+ "name": "afterVersion",
8764
+ "in": "query",
8765
+ "required": false,
8766
+ "schema": {
8767
+ "type": "integer",
8768
+ "minimum": 0,
8769
+ "maximum": 2147483647,
8770
+ "default": 0
8771
+ }
8772
+ },
8773
+ {
8774
+ "name": "limit",
8775
+ "in": "query",
8776
+ "required": false,
8777
+ "schema": {
8778
+ "type": "integer",
8779
+ "minimum": 1,
8780
+ "maximum": 100,
8781
+ "default": 50
8782
+ }
8783
+ }
8784
+ ],
8785
+ "security": [
8786
+ {
8787
+ "oauth2Bearer": []
8788
+ },
8789
+ {
8790
+ "companyApiKeyBearer": []
8791
+ }
8792
+ ],
8793
+ "x-auth": {
8794
+ "allowOAuth2": true,
8795
+ "allowApiKey": true,
8796
+ "allowUserSession": false,
8797
+ "requireRole": "viewer"
8798
+ },
8799
+ "x-scopes": [
8800
+ "invoices:read"
8801
+ ]
8802
+ }
8803
+ },
8489
8804
  "/invoices/external/:invoiceId/payment-evidence": {
8490
8805
  "get": {
8491
8806
  "operationId": "invoices_payment_evidence_external",
@@ -8718,6 +9033,153 @@
8718
9033
  ]
8719
9034
  }
8720
9035
  },
9036
+ "/invoices/external/:invoiceId/payment-instructions": {
9037
+ "get": {
9038
+ "operationId": "invoices_payment_instructions_external",
9039
+ "tags": [
9040
+ "invoices-external"
9041
+ ],
9042
+ "summary": "Read immutable bank payment instructions",
9043
+ "description": "Reference and recipient frozen on first issue. Decimal amount is a string. Historical invoices without a snapshot return 409; no reference is created by reading. This is not evidence of payment or permission to provision.",
9044
+ "responses": {
9045
+ "200": {
9046
+ "description": "JSON response",
9047
+ "content": {
9048
+ "application/json": {
9049
+ "schema": {
9050
+ "type": "object",
9051
+ "properties": {
9052
+ "success": {
9053
+ "type": "boolean"
9054
+ },
9055
+ "message": {
9056
+ "anyOf": [
9057
+ {
9058
+ "type": "string"
9059
+ },
9060
+ {
9061
+ "type": "null"
9062
+ }
9063
+ ]
9064
+ },
9065
+ "code": {
9066
+ "anyOf": [
9067
+ {
9068
+ "type": "string"
9069
+ },
9070
+ {
9071
+ "type": "null"
9072
+ }
9073
+ ]
9074
+ },
9075
+ "data": {
9076
+ "anyOf": [
9077
+ {
9078
+ "type": "object",
9079
+ "properties": {
9080
+ "invoiceId": {
9081
+ "type": "integer",
9082
+ "exclusiveMinimum": 0
9083
+ },
9084
+ "reference": {
9085
+ "type": "string"
9086
+ },
9087
+ "accountOwner": {
9088
+ "type": "string"
9089
+ },
9090
+ "iban": {
9091
+ "type": "string"
9092
+ },
9093
+ "bic": {
9094
+ "anyOf": [
9095
+ {
9096
+ "type": "string"
9097
+ },
9098
+ {
9099
+ "type": "null"
9100
+ }
9101
+ ]
9102
+ },
9103
+ "bankName": {
9104
+ "anyOf": [
9105
+ {
9106
+ "type": "string"
9107
+ },
9108
+ {
9109
+ "type": "null"
9110
+ }
9111
+ ]
9112
+ },
9113
+ "currency": {
9114
+ "type": "string"
9115
+ },
9116
+ "invoiceAmount": {
9117
+ "type": "string"
9118
+ },
9119
+ "createdAt": {
9120
+ "type": "string",
9121
+ "format": "date-time"
9122
+ }
9123
+ },
9124
+ "required": [
9125
+ "invoiceId",
9126
+ "reference",
9127
+ "accountOwner",
9128
+ "iban",
9129
+ "bic",
9130
+ "bankName",
9131
+ "currency",
9132
+ "invoiceAmount",
9133
+ "createdAt"
9134
+ ],
9135
+ "additionalProperties": false
9136
+ },
9137
+ {
9138
+ "type": "null"
9139
+ }
9140
+ ]
9141
+ }
9142
+ },
9143
+ "required": [
9144
+ "success",
9145
+ "data"
9146
+ ],
9147
+ "additionalProperties": false
9148
+ }
9149
+ }
9150
+ }
9151
+ }
9152
+ },
9153
+ "parameters": [
9154
+ {
9155
+ "name": "invoiceId",
9156
+ "in": "path",
9157
+ "required": true,
9158
+ "schema": {
9159
+ "type": "integer",
9160
+ "exclusiveMinimum": 0
9161
+ }
9162
+ }
9163
+ ],
9164
+ "security": [
9165
+ {
9166
+ "oauth2Bearer": []
9167
+ },
9168
+ {
9169
+ "companyApiKeyBearer": []
9170
+ }
9171
+ ],
9172
+ "x-auth": {
9173
+ "allowOAuth2": true,
9174
+ "allowApiKey": true,
9175
+ "allowUserSession": false,
9176
+ "requireRole": "viewer"
9177
+ },
9178
+ "x-scopes": [
9179
+ "invoices:read"
9180
+ ]
9181
+ }
9182
+ },
8721
9183
  "/invoices/external": {
8722
9184
  "get": {
8723
9185
  "operationId": "invoices_search_external",
@@ -58486,13 +58948,13 @@
58486
58948
  }
58487
58949
  }
58488
58950
  },
58489
- "/auth/register": {
58951
+ "/auth/mfa/complete": {
58490
58952
  "post": {
58491
- "operationId": "auth_register",
58953
+ "operationId": "auth_mfa_complete",
58492
58954
  "tags": [
58493
58955
  "auth"
58494
58956
  ],
58495
- "summary": "Register a new direct-auth account",
58957
+ "summary": "Complete a first-factor login with TOTP or a recovery code",
58496
58958
  "responses": {
58497
58959
  "200": {
58498
58960
  "description": "JSON response",
@@ -58550,25 +59012,28 @@
58550
59012
  "schema": {
58551
59013
  "type": "object",
58552
59014
  "properties": {
58553
- "email": {
59015
+ "challengeToken": {
58554
59016
  "type": "string",
58555
- "format": "email",
58556
- "maxLength": 320
59017
+ "minLength": 32,
59018
+ "maxLength": 128
58557
59019
  },
58558
- "password": {
59020
+ "code": {
58559
59021
  "type": "string",
58560
- "minLength": 8,
58561
- "maxLength": 256
59022
+ "minLength": 6,
59023
+ "maxLength": 64
58562
59024
  },
58563
- "name": {
59025
+ "kind": {
58564
59026
  "type": "string",
58565
- "minLength": 1,
58566
- "maxLength": 200
59027
+ "enum": [
59028
+ "totp",
59029
+ "recovery"
59030
+ ],
59031
+ "default": "totp"
58567
59032
  }
58568
59033
  },
58569
59034
  "required": [
58570
- "email",
58571
- "password"
59035
+ "challengeToken",
59036
+ "code"
58572
59037
  ],
58573
59038
  "additionalProperties": false
58574
59039
  }
@@ -58577,13 +59042,13 @@
58577
59042
  }
58578
59043
  }
58579
59044
  },
58580
- "/auth/login": {
58581
- "post": {
58582
- "operationId": "auth_login",
59045
+ "/auth/mfa": {
59046
+ "get": {
59047
+ "operationId": "auth_mfa_status",
58583
59048
  "tags": [
58584
59049
  "auth"
58585
59050
  ],
58586
- "summary": "Log in with email + password",
59051
+ "summary": "Read the current product account's MFA status",
58587
59052
  "responses": {
58588
59053
  "200": {
58589
59054
  "description": "JSON response",
@@ -58617,7 +59082,29 @@
58617
59082
  },
58618
59083
  "data": {
58619
59084
  "anyOf": [
58620
- {},
59085
+ {
59086
+ "type": "object",
59087
+ "properties": {
59088
+ "enabled": {
59089
+ "type": "boolean"
59090
+ },
59091
+ "methods": {
59092
+ "type": "array",
59093
+ "items": {
59094
+ "type": "string"
59095
+ }
59096
+ },
59097
+ "recoveryCodesRemaining": {
59098
+ "type": "number"
59099
+ }
59100
+ },
59101
+ "required": [
59102
+ "enabled",
59103
+ "methods",
59104
+ "recoveryCodesRemaining"
59105
+ ],
59106
+ "additionalProperties": false
59107
+ },
58621
59108
  {
58622
59109
  "type": "null"
58623
59110
  }
@@ -58634,42 +59121,21 @@
58634
59121
  }
58635
59122
  }
58636
59123
  },
58637
- "requestBody": {
58638
- "required": true,
58639
- "content": {
58640
- "application/json": {
58641
- "schema": {
58642
- "type": "object",
58643
- "properties": {
58644
- "email": {
58645
- "type": "string",
58646
- "format": "email",
58647
- "maxLength": 320
58648
- },
58649
- "password": {
58650
- "type": "string",
58651
- "minLength": 8,
58652
- "maxLength": 256
58653
- }
58654
- },
58655
- "required": [
58656
- "email",
58657
- "password"
58658
- ],
58659
- "additionalProperties": false
58660
- }
58661
- }
59124
+ "security": [
59125
+ {
59126
+ "frontendBearer": []
58662
59127
  }
58663
- }
59128
+ ],
59129
+ "x-transport": "http"
58664
59130
  }
58665
59131
  },
58666
- "/auth/refresh": {
59132
+ "/auth/mfa/setup": {
58667
59133
  "post": {
58668
- "operationId": "auth_refresh",
59134
+ "operationId": "auth_mfa_setup",
58669
59135
  "tags": [
58670
59136
  "auth"
58671
59137
  ],
58672
- "summary": "Rotate access + refresh tokens",
59138
+ "summary": "Prepare TOTP enrollment after rechecking the password",
58673
59139
  "responses": {
58674
59140
  "200": {
58675
59141
  "description": "JSON response",
@@ -58703,7 +59169,26 @@
58703
59169
  },
58704
59170
  "data": {
58705
59171
  "anyOf": [
58706
- {},
59172
+ {
59173
+ "type": "object",
59174
+ "properties": {
59175
+ "secret": {
59176
+ "type": "string"
59177
+ },
59178
+ "otpauthUri": {
59179
+ "type": "string"
59180
+ },
59181
+ "expiresAt": {
59182
+ "type": "string"
59183
+ }
59184
+ },
59185
+ "required": [
59186
+ "secret",
59187
+ "otpauthUri",
59188
+ "expiresAt"
59189
+ ],
59190
+ "additionalProperties": false
59191
+ },
58707
59192
  {
58708
59193
  "type": "null"
58709
59194
  }
@@ -58727,30 +59212,37 @@
58727
59212
  "schema": {
58728
59213
  "type": "object",
58729
59214
  "properties": {
58730
- "refreshToken": {
59215
+ "password": {
58731
59216
  "type": "string",
58732
- "minLength": 20
59217
+ "minLength": 8,
59218
+ "maxLength": 256
58733
59219
  }
58734
59220
  },
58735
59221
  "required": [
58736
- "refreshToken"
59222
+ "password"
58737
59223
  ],
58738
59224
  "additionalProperties": false
58739
59225
  }
58740
59226
  }
58741
59227
  }
58742
- }
59228
+ },
59229
+ "security": [
59230
+ {
59231
+ "frontendBearer": []
59232
+ }
59233
+ ],
59234
+ "x-transport": "http"
58743
59235
  }
58744
59236
  },
58745
- "/auth/logout": {
59237
+ "/auth/mfa/enable": {
58746
59238
  "post": {
58747
- "operationId": "auth_logout",
59239
+ "operationId": "auth_mfa_enable",
58748
59240
  "tags": [
58749
59241
  "auth"
58750
59242
  ],
58751
- "summary": "Revoke the current refresh token",
59243
+ "summary": "Confirm TOTP enrollment and return recovery codes once",
58752
59244
  "responses": {
58753
- "204": {
59245
+ "200": {
58754
59246
  "description": "JSON response",
58755
59247
  "content": {
58756
59248
  "application/json": {
@@ -58784,7 +59276,25 @@
58784
59276
  "anyOf": [
58785
59277
  {
58786
59278
  "type": "object",
58787
- "properties": {},
59279
+ "properties": {
59280
+ "enabled": {
59281
+ "type": "boolean"
59282
+ },
59283
+ "recoveryCodes": {
59284
+ "type": "array",
59285
+ "items": {
59286
+ "type": "string"
59287
+ }
59288
+ },
59289
+ "reauthenticationRequired": {
59290
+ "type": "boolean"
59291
+ }
59292
+ },
59293
+ "required": [
59294
+ "enabled",
59295
+ "recoveryCodes",
59296
+ "reauthenticationRequired"
59297
+ ],
58788
59298
  "additionalProperties": false
58789
59299
  },
58790
59300
  {
@@ -58810,25 +59320,34 @@
58810
59320
  "schema": {
58811
59321
  "type": "object",
58812
59322
  "properties": {
58813
- "refreshToken": {
59323
+ "code": {
58814
59324
  "type": "string",
58815
- "minLength": 20
59325
+ "pattern": "^\\d{6}$"
58816
59326
  }
58817
59327
  },
59328
+ "required": [
59329
+ "code"
59330
+ ],
58818
59331
  "additionalProperties": false
58819
59332
  }
58820
59333
  }
58821
59334
  }
58822
- }
59335
+ },
59336
+ "security": [
59337
+ {
59338
+ "frontendBearer": []
59339
+ }
59340
+ ],
59341
+ "x-transport": "http"
58823
59342
  }
58824
59343
  },
58825
- "/auth/me": {
58826
- "get": {
58827
- "operationId": "auth_me",
59344
+ "/auth/mfa/disable": {
59345
+ "post": {
59346
+ "operationId": "auth_mfa_disable",
58828
59347
  "tags": [
58829
59348
  "auth"
58830
59349
  ],
58831
- "summary": "Get the current user incl. roles and isAdmin (Bearer access JWT)",
59350
+ "summary": "Disable MFA using both the password and a second factor",
58832
59351
  "responses": {
58833
59352
  "200": {
58834
59353
  "description": "JSON response",
@@ -58862,7 +59381,22 @@
58862
59381
  },
58863
59382
  "data": {
58864
59383
  "anyOf": [
58865
- {},
59384
+ {
59385
+ "type": "object",
59386
+ "properties": {
59387
+ "ok": {
59388
+ "type": "boolean"
59389
+ },
59390
+ "reauthenticationRequired": {
59391
+ "type": "boolean"
59392
+ }
59393
+ },
59394
+ "required": [
59395
+ "ok",
59396
+ "reauthenticationRequired"
59397
+ ],
59398
+ "additionalProperties": false
59399
+ },
58866
59400
  {
58867
59401
  "type": "null"
58868
59402
  }
@@ -58879,6 +59413,41 @@
58879
59413
  }
58880
59414
  }
58881
59415
  },
59416
+ "requestBody": {
59417
+ "required": true,
59418
+ "content": {
59419
+ "application/json": {
59420
+ "schema": {
59421
+ "type": "object",
59422
+ "properties": {
59423
+ "password": {
59424
+ "type": "string",
59425
+ "minLength": 8,
59426
+ "maxLength": 256
59427
+ },
59428
+ "code": {
59429
+ "type": "string",
59430
+ "minLength": 6,
59431
+ "maxLength": 64
59432
+ },
59433
+ "kind": {
59434
+ "type": "string",
59435
+ "enum": [
59436
+ "totp",
59437
+ "recovery"
59438
+ ],
59439
+ "default": "totp"
59440
+ }
59441
+ },
59442
+ "required": [
59443
+ "password",
59444
+ "code"
59445
+ ],
59446
+ "additionalProperties": false
59447
+ }
59448
+ }
59449
+ }
59450
+ },
58882
59451
  "security": [
58883
59452
  {
58884
59453
  "frontendBearer": []
@@ -58887,13 +59456,13 @@
58887
59456
  "x-transport": "http"
58888
59457
  }
58889
59458
  },
58890
- "/auth/me/profile": {
58891
- "patch": {
58892
- "operationId": "auth_me_profile_update",
59459
+ "/auth/register": {
59460
+ "post": {
59461
+ "operationId": "auth_register",
58893
59462
  "tags": [
58894
59463
  "auth"
58895
59464
  ],
58896
- "summary": "Update the current user's own profile (name, avatar)",
59465
+ "summary": "Register a new direct-auth account",
58897
59466
  "responses": {
58898
59467
  "200": {
58899
59468
  "description": "JSON response",
@@ -58951,99 +59520,92 @@
58951
59520
  "schema": {
58952
59521
  "type": "object",
58953
59522
  "properties": {
59523
+ "email": {
59524
+ "type": "string",
59525
+ "format": "email",
59526
+ "maxLength": 320
59527
+ },
59528
+ "password": {
59529
+ "type": "string",
59530
+ "minLength": 8,
59531
+ "maxLength": 256
59532
+ },
58954
59533
  "name": {
58955
59534
  "type": "string",
58956
59535
  "minLength": 1,
58957
59536
  "maxLength": 200
58958
59537
  },
58959
- "avatarStyle": {
58960
- "anyOf": [
58961
- {
58962
- "type": "object",
58963
- "properties": {
58964
- "seed": {
58965
- "type": "string",
58966
- "minLength": 1,
58967
- "maxLength": 200
58968
- },
58969
- "hue": {
58970
- "type": "integer",
58971
- "minimum": 0,
58972
- "maximum": 359
58973
- },
58974
- "shape": {
58975
- "type": "string",
58976
- "enum": [
58977
- "round",
58978
- "organic",
58979
- "boxy",
58980
- "nub",
58981
- "cloud",
58982
- "sun",
58983
- "capsule",
58984
- "triangle",
58985
- "hexagon",
58986
- "droplet"
58987
- ]
58988
- },
58989
- "expression": {
58990
- "type": "string",
58991
- "enum": [
58992
- "idle",
58993
- "happy",
58994
- "sad",
58995
- "mad",
58996
- "surprised",
58997
- "wink",
58998
- "sleepy",
58999
- "smug",
59000
- "unsure",
59001
- "scared",
59002
- "love",
59003
- "shy",
59004
- "sick",
59005
- "thinking"
59006
- ]
59007
- },
59008
- "background": {
59009
- "type": "string",
59010
- "enum": [
59011
- "none",
59012
- "squircle",
59013
- "circle"
59014
- ]
59015
- }
59016
- },
59017
- "additionalProperties": false
59538
+ "firstName": {
59539
+ "type": "string",
59540
+ "minLength": 1,
59541
+ "maxLength": 100
59542
+ },
59543
+ "lastName": {
59544
+ "type": "string",
59545
+ "minLength": 1,
59546
+ "maxLength": 100
59547
+ },
59548
+ "device": {
59549
+ "type": "object",
59550
+ "properties": {
59551
+ "deviceId": {
59552
+ "type": "string",
59553
+ "minLength": 1,
59554
+ "maxLength": 200
59018
59555
  },
59019
- {
59020
- "type": "null"
59556
+ "deviceName": {
59557
+ "type": "string",
59558
+ "minLength": 1,
59559
+ "maxLength": 200
59560
+ },
59561
+ "deviceModel": {
59562
+ "type": "string",
59563
+ "minLength": 1,
59564
+ "maxLength": 200
59565
+ },
59566
+ "deviceOs": {
59567
+ "type": "string",
59568
+ "minLength": 1,
59569
+ "maxLength": 200
59570
+ },
59571
+ "appVersion": {
59572
+ "type": "string",
59573
+ "minLength": 1,
59574
+ "maxLength": 100
59575
+ },
59576
+ "platform": {
59577
+ "type": "string",
59578
+ "enum": [
59579
+ "ios",
59580
+ "android",
59581
+ "web",
59582
+ "expo"
59583
+ ]
59021
59584
  }
59022
- ]
59585
+ },
59586
+ "additionalProperties": false
59023
59587
  }
59024
59588
  },
59589
+ "required": [
59590
+ "email",
59591
+ "password"
59592
+ ],
59025
59593
  "additionalProperties": false
59026
59594
  }
59027
59595
  }
59028
59596
  }
59029
- },
59030
- "security": [
59031
- {
59032
- "frontendBearer": []
59033
- }
59034
- ],
59035
- "x-transport": "http"
59597
+ }
59036
59598
  }
59037
59599
  },
59038
- "/auth/push-token": {
59600
+ "/auth/login": {
59039
59601
  "post": {
59040
- "operationId": "auth_push_token_upsert",
59602
+ "operationId": "auth_login",
59041
59603
  "tags": [
59042
59604
  "auth"
59043
59605
  ],
59044
- "summary": "Register a device push token for the current user",
59606
+ "summary": "Log in with email + password",
59045
59607
  "responses": {
59046
- "204": {
59608
+ "200": {
59047
59609
  "description": "JSON response",
59048
59610
  "content": {
59049
59611
  "application/json": {
@@ -59075,11 +59637,7 @@
59075
59637
  },
59076
59638
  "data": {
59077
59639
  "anyOf": [
59078
- {
59079
- "type": "object",
59080
- "properties": {},
59081
- "additionalProperties": false
59082
- },
59640
+ {},
59083
59641
  {
59084
59642
  "type": "null"
59085
59643
  }
@@ -59103,45 +59661,75 @@
59103
59661
  "schema": {
59104
59662
  "type": "object",
59105
59663
  "properties": {
59106
- "token": {
59664
+ "email": {
59107
59665
  "type": "string",
59108
- "minLength": 1,
59109
- "maxLength": 500
59666
+ "format": "email",
59667
+ "maxLength": 320
59110
59668
  },
59111
- "platform": {
59669
+ "password": {
59112
59670
  "type": "string",
59113
- "enum": [
59114
- "ios",
59115
- "android",
59116
- "web",
59117
- "expo"
59118
- ]
59671
+ "minLength": 8,
59672
+ "maxLength": 256
59673
+ },
59674
+ "device": {
59675
+ "type": "object",
59676
+ "properties": {
59677
+ "deviceId": {
59678
+ "type": "string",
59679
+ "minLength": 1,
59680
+ "maxLength": 200
59681
+ },
59682
+ "deviceName": {
59683
+ "type": "string",
59684
+ "minLength": 1,
59685
+ "maxLength": 200
59686
+ },
59687
+ "deviceModel": {
59688
+ "type": "string",
59689
+ "minLength": 1,
59690
+ "maxLength": 200
59691
+ },
59692
+ "deviceOs": {
59693
+ "type": "string",
59694
+ "minLength": 1,
59695
+ "maxLength": 200
59696
+ },
59697
+ "appVersion": {
59698
+ "type": "string",
59699
+ "minLength": 1,
59700
+ "maxLength": 100
59701
+ },
59702
+ "platform": {
59703
+ "type": "string",
59704
+ "enum": [
59705
+ "ios",
59706
+ "android",
59707
+ "web",
59708
+ "expo"
59709
+ ]
59710
+ }
59711
+ },
59712
+ "additionalProperties": false
59119
59713
  }
59120
59714
  },
59121
59715
  "required": [
59122
- "token",
59123
- "platform"
59716
+ "email",
59717
+ "password"
59124
59718
  ],
59125
59719
  "additionalProperties": false
59126
59720
  }
59127
59721
  }
59128
59722
  }
59129
- },
59130
- "security": [
59131
- {
59132
- "frontendBearer": []
59133
- }
59134
- ],
59135
- "x-transport": "http"
59723
+ }
59136
59724
  }
59137
59725
  },
59138
- "/auth/verify-email/request": {
59726
+ "/auth/refresh": {
59139
59727
  "post": {
59140
- "operationId": "auth_verify_email_request",
59728
+ "operationId": "auth_refresh",
59141
59729
  "tags": [
59142
59730
  "auth"
59143
59731
  ],
59144
- "summary": "Send a fresh email-verification link to the current user",
59732
+ "summary": "Rotate access + refresh tokens",
59145
59733
  "responses": {
59146
59734
  "200": {
59147
59735
  "description": "JSON response",
@@ -59198,29 +59786,71 @@
59198
59786
  "application/json": {
59199
59787
  "schema": {
59200
59788
  "type": "object",
59201
- "properties": {},
59789
+ "properties": {
59790
+ "refreshToken": {
59791
+ "type": "string",
59792
+ "minLength": 20
59793
+ },
59794
+ "device": {
59795
+ "type": "object",
59796
+ "properties": {
59797
+ "deviceId": {
59798
+ "type": "string",
59799
+ "minLength": 1,
59800
+ "maxLength": 200
59801
+ },
59802
+ "deviceName": {
59803
+ "type": "string",
59804
+ "minLength": 1,
59805
+ "maxLength": 200
59806
+ },
59807
+ "deviceModel": {
59808
+ "type": "string",
59809
+ "minLength": 1,
59810
+ "maxLength": 200
59811
+ },
59812
+ "deviceOs": {
59813
+ "type": "string",
59814
+ "minLength": 1,
59815
+ "maxLength": 200
59816
+ },
59817
+ "appVersion": {
59818
+ "type": "string",
59819
+ "minLength": 1,
59820
+ "maxLength": 100
59821
+ },
59822
+ "platform": {
59823
+ "type": "string",
59824
+ "enum": [
59825
+ "ios",
59826
+ "android",
59827
+ "web",
59828
+ "expo"
59829
+ ]
59830
+ }
59831
+ },
59832
+ "additionalProperties": false
59833
+ }
59834
+ },
59835
+ "required": [
59836
+ "refreshToken"
59837
+ ],
59202
59838
  "additionalProperties": false
59203
59839
  }
59204
59840
  }
59205
59841
  }
59206
- },
59207
- "security": [
59208
- {
59209
- "frontendBearer": []
59210
- }
59211
- ],
59212
- "x-transport": "http"
59842
+ }
59213
59843
  }
59214
59844
  },
59215
- "/auth/verify-email/confirm": {
59845
+ "/auth/logout": {
59216
59846
  "post": {
59217
- "operationId": "auth_verify_email_confirm",
59847
+ "operationId": "auth_logout",
59218
59848
  "tags": [
59219
59849
  "auth"
59220
59850
  ],
59221
- "summary": "Confirm an email-verification token (programmatic / deep-link flow)",
59851
+ "summary": "Revoke the current refresh token",
59222
59852
  "responses": {
59223
- "200": {
59853
+ "204": {
59224
59854
  "description": "JSON response",
59225
59855
  "content": {
59226
59856
  "application/json": {
@@ -59252,7 +59882,11 @@
59252
59882
  },
59253
59883
  "data": {
59254
59884
  "anyOf": [
59255
- {},
59885
+ {
59886
+ "type": "object",
59887
+ "properties": {},
59888
+ "additionalProperties": false
59889
+ },
59256
59890
  {
59257
59891
  "type": "null"
59258
59892
  }
@@ -59276,15 +59910,11 @@
59276
59910
  "schema": {
59277
59911
  "type": "object",
59278
59912
  "properties": {
59279
- "token": {
59913
+ "refreshToken": {
59280
59914
  "type": "string",
59281
- "minLength": 20,
59282
- "maxLength": 500
59915
+ "minLength": 20
59283
59916
  }
59284
59917
  },
59285
- "required": [
59286
- "token"
59287
- ],
59288
59918
  "additionalProperties": false
59289
59919
  }
59290
59920
  }
@@ -59292,31 +59922,924 @@
59292
59922
  }
59293
59923
  }
59294
59924
  },
59295
- "/auth/verify-email": {
59925
+ "/auth/me": {
59296
59926
  "get": {
59297
- "operationId": "auth_verify_email_landing",
59927
+ "operationId": "auth_me",
59298
59928
  "tags": [
59299
59929
  "auth"
59300
59930
  ],
59301
- "summary": "Browser landing page that consumes the verification token",
59931
+ "summary": "Get the current user incl. roles and isAdmin (Bearer access JWT)",
59302
59932
  "responses": {
59303
59933
  "200": {
59304
- "description": "Binary response",
59934
+ "description": "JSON response",
59305
59935
  "content": {
59306
- "text/html": {
59936
+ "application/json": {
59307
59937
  "schema": {
59308
- "type": "string",
59309
- "format": "binary"
59938
+ "type": "object",
59939
+ "properties": {
59940
+ "success": {
59941
+ "type": "boolean"
59942
+ },
59943
+ "message": {
59944
+ "anyOf": [
59945
+ {
59946
+ "type": "string"
59947
+ },
59948
+ {
59949
+ "type": "null"
59950
+ }
59951
+ ]
59952
+ },
59953
+ "code": {
59954
+ "anyOf": [
59955
+ {
59956
+ "type": "string"
59957
+ },
59958
+ {
59959
+ "type": "null"
59960
+ }
59961
+ ]
59962
+ },
59963
+ "data": {
59964
+ "anyOf": [
59965
+ {},
59966
+ {
59967
+ "type": "null"
59968
+ }
59969
+ ]
59970
+ }
59971
+ },
59972
+ "required": [
59973
+ "success",
59974
+ "data"
59975
+ ],
59976
+ "additionalProperties": false
59310
59977
  }
59311
59978
  }
59312
59979
  }
59313
59980
  }
59314
59981
  },
59315
- "parameters": [
59982
+ "security": [
59316
59983
  {
59317
- "name": "token",
59318
- "in": "query",
59319
- "required": false,
59984
+ "frontendBearer": []
59985
+ }
59986
+ ],
59987
+ "x-transport": "http"
59988
+ }
59989
+ },
59990
+ "/auth/me/profile": {
59991
+ "patch": {
59992
+ "operationId": "auth_me_profile_update",
59993
+ "tags": [
59994
+ "auth"
59995
+ ],
59996
+ "summary": "Update the current user's own profile (name, avatar)",
59997
+ "responses": {
59998
+ "200": {
59999
+ "description": "JSON response",
60000
+ "content": {
60001
+ "application/json": {
60002
+ "schema": {
60003
+ "type": "object",
60004
+ "properties": {
60005
+ "success": {
60006
+ "type": "boolean"
60007
+ },
60008
+ "message": {
60009
+ "anyOf": [
60010
+ {
60011
+ "type": "string"
60012
+ },
60013
+ {
60014
+ "type": "null"
60015
+ }
60016
+ ]
60017
+ },
60018
+ "code": {
60019
+ "anyOf": [
60020
+ {
60021
+ "type": "string"
60022
+ },
60023
+ {
60024
+ "type": "null"
60025
+ }
60026
+ ]
60027
+ },
60028
+ "data": {
60029
+ "anyOf": [
60030
+ {},
60031
+ {
60032
+ "type": "null"
60033
+ }
60034
+ ]
60035
+ }
60036
+ },
60037
+ "required": [
60038
+ "success",
60039
+ "data"
60040
+ ],
60041
+ "additionalProperties": false
60042
+ }
60043
+ }
60044
+ }
60045
+ }
60046
+ },
60047
+ "requestBody": {
60048
+ "required": true,
60049
+ "content": {
60050
+ "application/json": {
60051
+ "schema": {
60052
+ "type": "object",
60053
+ "properties": {
60054
+ "avatarStyle": {
60055
+ "anyOf": [
60056
+ {
60057
+ "type": "object",
60058
+ "properties": {
60059
+ "seed": {
60060
+ "type": "string",
60061
+ "minLength": 1,
60062
+ "maxLength": 200
60063
+ },
60064
+ "hue": {
60065
+ "type": "integer",
60066
+ "minimum": 0,
60067
+ "maximum": 359
60068
+ },
60069
+ "shape": {
60070
+ "type": "string",
60071
+ "enum": [
60072
+ "round",
60073
+ "organic",
60074
+ "boxy",
60075
+ "nub",
60076
+ "cloud",
60077
+ "sun",
60078
+ "capsule",
60079
+ "triangle",
60080
+ "hexagon",
60081
+ "droplet"
60082
+ ]
60083
+ },
60084
+ "expression": {
60085
+ "type": "string",
60086
+ "enum": [
60087
+ "idle",
60088
+ "happy",
60089
+ "sad",
60090
+ "mad",
60091
+ "surprised",
60092
+ "wink",
60093
+ "sleepy",
60094
+ "smug",
60095
+ "unsure",
60096
+ "scared",
60097
+ "love",
60098
+ "shy",
60099
+ "sick",
60100
+ "thinking"
60101
+ ]
60102
+ },
60103
+ "background": {
60104
+ "type": "string",
60105
+ "enum": [
60106
+ "none",
60107
+ "squircle",
60108
+ "circle"
60109
+ ]
60110
+ }
60111
+ },
60112
+ "additionalProperties": false
60113
+ },
60114
+ {
60115
+ "type": "null"
60116
+ }
60117
+ ]
60118
+ },
60119
+ "name": {
60120
+ "anyOf": [
60121
+ {
60122
+ "type": "string",
60123
+ "minLength": 1,
60124
+ "maxLength": 200
60125
+ },
60126
+ {
60127
+ "type": "null"
60128
+ }
60129
+ ]
60130
+ },
60131
+ "firstName": {
60132
+ "anyOf": [
60133
+ {
60134
+ "type": "string",
60135
+ "minLength": 1,
60136
+ "maxLength": 100
60137
+ },
60138
+ {
60139
+ "type": "null"
60140
+ }
60141
+ ]
60142
+ },
60143
+ "lastName": {
60144
+ "anyOf": [
60145
+ {
60146
+ "type": "string",
60147
+ "minLength": 1,
60148
+ "maxLength": 100
60149
+ },
60150
+ {
60151
+ "type": "null"
60152
+ }
60153
+ ]
60154
+ }
60155
+ },
60156
+ "additionalProperties": false
60157
+ }
60158
+ }
60159
+ }
60160
+ },
60161
+ "security": [
60162
+ {
60163
+ "frontendBearer": []
60164
+ }
60165
+ ],
60166
+ "x-transport": "http"
60167
+ }
60168
+ },
60169
+ "/auth/push-token": {
60170
+ "post": {
60171
+ "operationId": "auth_push_token_upsert",
60172
+ "tags": [
60173
+ "auth"
60174
+ ],
60175
+ "summary": "Register a device push token for the current user",
60176
+ "responses": {
60177
+ "204": {
60178
+ "description": "JSON response",
60179
+ "content": {
60180
+ "application/json": {
60181
+ "schema": {
60182
+ "type": "object",
60183
+ "properties": {
60184
+ "success": {
60185
+ "type": "boolean"
60186
+ },
60187
+ "message": {
60188
+ "anyOf": [
60189
+ {
60190
+ "type": "string"
60191
+ },
60192
+ {
60193
+ "type": "null"
60194
+ }
60195
+ ]
60196
+ },
60197
+ "code": {
60198
+ "anyOf": [
60199
+ {
60200
+ "type": "string"
60201
+ },
60202
+ {
60203
+ "type": "null"
60204
+ }
60205
+ ]
60206
+ },
60207
+ "data": {
60208
+ "anyOf": [
60209
+ {
60210
+ "type": "object",
60211
+ "properties": {},
60212
+ "additionalProperties": false
60213
+ },
60214
+ {
60215
+ "type": "null"
60216
+ }
60217
+ ]
60218
+ }
60219
+ },
60220
+ "required": [
60221
+ "success",
60222
+ "data"
60223
+ ],
60224
+ "additionalProperties": false
60225
+ }
60226
+ }
60227
+ }
60228
+ }
60229
+ },
60230
+ "requestBody": {
60231
+ "required": true,
60232
+ "content": {
60233
+ "application/json": {
60234
+ "schema": {
60235
+ "type": "object",
60236
+ "properties": {
60237
+ "token": {
60238
+ "type": "string",
60239
+ "minLength": 1,
60240
+ "maxLength": 500
60241
+ },
60242
+ "platform": {
60243
+ "type": "string",
60244
+ "enum": [
60245
+ "ios",
60246
+ "android",
60247
+ "web",
60248
+ "expo"
60249
+ ]
60250
+ }
60251
+ },
60252
+ "required": [
60253
+ "token",
60254
+ "platform"
60255
+ ],
60256
+ "additionalProperties": false
60257
+ }
60258
+ }
60259
+ }
60260
+ },
60261
+ "security": [
60262
+ {
60263
+ "frontendBearer": []
60264
+ }
60265
+ ],
60266
+ "x-transport": "http"
60267
+ }
60268
+ },
60269
+ "/auth/verify-email/request": {
60270
+ "post": {
60271
+ "operationId": "auth_verify_email_request",
60272
+ "tags": [
60273
+ "auth"
60274
+ ],
60275
+ "summary": "Send a fresh email-verification link to the current user",
60276
+ "responses": {
60277
+ "200": {
60278
+ "description": "JSON response",
60279
+ "content": {
60280
+ "application/json": {
60281
+ "schema": {
60282
+ "type": "object",
60283
+ "properties": {
60284
+ "success": {
60285
+ "type": "boolean"
60286
+ },
60287
+ "message": {
60288
+ "anyOf": [
60289
+ {
60290
+ "type": "string"
60291
+ },
60292
+ {
60293
+ "type": "null"
60294
+ }
60295
+ ]
60296
+ },
60297
+ "code": {
60298
+ "anyOf": [
60299
+ {
60300
+ "type": "string"
60301
+ },
60302
+ {
60303
+ "type": "null"
60304
+ }
60305
+ ]
60306
+ },
60307
+ "data": {
60308
+ "anyOf": [
60309
+ {},
60310
+ {
60311
+ "type": "null"
60312
+ }
60313
+ ]
60314
+ }
60315
+ },
60316
+ "required": [
60317
+ "success",
60318
+ "data"
60319
+ ],
60320
+ "additionalProperties": false
60321
+ }
60322
+ }
60323
+ }
60324
+ }
60325
+ },
60326
+ "requestBody": {
60327
+ "required": true,
60328
+ "content": {
60329
+ "application/json": {
60330
+ "schema": {
60331
+ "type": "object",
60332
+ "properties": {},
60333
+ "additionalProperties": false
60334
+ }
60335
+ }
60336
+ }
60337
+ },
60338
+ "security": [
60339
+ {
60340
+ "frontendBearer": []
60341
+ }
60342
+ ],
60343
+ "x-transport": "http"
60344
+ }
60345
+ },
60346
+ "/auth/verify-email/confirm": {
60347
+ "post": {
60348
+ "operationId": "auth_verify_email_confirm",
60349
+ "tags": [
60350
+ "auth"
60351
+ ],
60352
+ "summary": "Confirm an email-verification token (programmatic / deep-link flow)",
60353
+ "responses": {
60354
+ "200": {
60355
+ "description": "JSON response",
60356
+ "content": {
60357
+ "application/json": {
60358
+ "schema": {
60359
+ "type": "object",
60360
+ "properties": {
60361
+ "success": {
60362
+ "type": "boolean"
60363
+ },
60364
+ "message": {
60365
+ "anyOf": [
60366
+ {
60367
+ "type": "string"
60368
+ },
60369
+ {
60370
+ "type": "null"
60371
+ }
60372
+ ]
60373
+ },
60374
+ "code": {
60375
+ "anyOf": [
60376
+ {
60377
+ "type": "string"
60378
+ },
60379
+ {
60380
+ "type": "null"
60381
+ }
60382
+ ]
60383
+ },
60384
+ "data": {
60385
+ "anyOf": [
60386
+ {},
60387
+ {
60388
+ "type": "null"
60389
+ }
60390
+ ]
60391
+ }
60392
+ },
60393
+ "required": [
60394
+ "success",
60395
+ "data"
60396
+ ],
60397
+ "additionalProperties": false
60398
+ }
60399
+ }
60400
+ }
60401
+ }
60402
+ },
60403
+ "requestBody": {
60404
+ "required": true,
60405
+ "content": {
60406
+ "application/json": {
60407
+ "schema": {
60408
+ "type": "object",
60409
+ "properties": {
60410
+ "token": {
60411
+ "type": "string",
60412
+ "minLength": 20,
60413
+ "maxLength": 500
60414
+ }
60415
+ },
60416
+ "required": [
60417
+ "token"
60418
+ ],
60419
+ "additionalProperties": false
60420
+ }
60421
+ }
60422
+ }
60423
+ }
60424
+ }
60425
+ },
60426
+ "/auth/verify-email": {
60427
+ "get": {
60428
+ "operationId": "auth_verify_email_landing",
60429
+ "tags": [
60430
+ "auth"
60431
+ ],
60432
+ "summary": "Browser landing page that consumes the verification token",
60433
+ "responses": {
60434
+ "200": {
60435
+ "description": "Binary response",
60436
+ "content": {
60437
+ "text/html": {
60438
+ "schema": {
60439
+ "type": "string",
60440
+ "format": "binary"
60441
+ }
60442
+ }
60443
+ }
60444
+ }
60445
+ },
60446
+ "parameters": [
60447
+ {
60448
+ "name": "token",
60449
+ "in": "query",
60450
+ "required": false,
60451
+ "schema": {
60452
+ "type": "string",
60453
+ "minLength": 1,
60454
+ "maxLength": 500
60455
+ }
60456
+ }
60457
+ ]
60458
+ }
60459
+ },
60460
+ "/auth/me/email": {
60461
+ "patch": {
60462
+ "operationId": "auth_me_email_patch",
60463
+ "tags": [
60464
+ "auth"
60465
+ ],
60466
+ "summary": "Change current user's email after password confirmation",
60467
+ "responses": {
60468
+ "200": {
60469
+ "description": "JSON response",
60470
+ "content": {
60471
+ "application/json": {
60472
+ "schema": {
60473
+ "type": "object",
60474
+ "properties": {
60475
+ "success": {
60476
+ "type": "boolean"
60477
+ },
60478
+ "message": {
60479
+ "anyOf": [
60480
+ {
60481
+ "type": "string"
60482
+ },
60483
+ {
60484
+ "type": "null"
60485
+ }
60486
+ ]
60487
+ },
60488
+ "code": {
60489
+ "anyOf": [
60490
+ {
60491
+ "type": "string"
60492
+ },
60493
+ {
60494
+ "type": "null"
60495
+ }
60496
+ ]
60497
+ },
60498
+ "data": {
60499
+ "anyOf": [
60500
+ {},
60501
+ {
60502
+ "type": "null"
60503
+ }
60504
+ ]
60505
+ }
60506
+ },
60507
+ "required": [
60508
+ "success",
60509
+ "data"
60510
+ ],
60511
+ "additionalProperties": false
60512
+ }
60513
+ }
60514
+ }
60515
+ }
60516
+ },
60517
+ "requestBody": {
60518
+ "required": true,
60519
+ "content": {
60520
+ "application/json": {
60521
+ "schema": {
60522
+ "type": "object",
60523
+ "properties": {
60524
+ "email": {
60525
+ "type": "string",
60526
+ "format": "email",
60527
+ "maxLength": 320
60528
+ },
60529
+ "password": {
60530
+ "type": "string",
60531
+ "minLength": 8,
60532
+ "maxLength": 256
60533
+ }
60534
+ },
60535
+ "required": [
60536
+ "email",
60537
+ "password"
60538
+ ],
60539
+ "additionalProperties": false
60540
+ }
60541
+ }
60542
+ }
60543
+ },
60544
+ "security": [
60545
+ {
60546
+ "frontendBearer": []
60547
+ }
60548
+ ],
60549
+ "x-transport": "http"
60550
+ }
60551
+ },
60552
+ "/auth/password/change": {
60553
+ "post": {
60554
+ "operationId": "auth_password_change",
60555
+ "tags": [
60556
+ "auth"
60557
+ ],
60558
+ "summary": "Change password for the current user",
60559
+ "responses": {
60560
+ "200": {
60561
+ "description": "JSON response",
60562
+ "content": {
60563
+ "application/json": {
60564
+ "schema": {
60565
+ "type": "object",
60566
+ "properties": {
60567
+ "success": {
60568
+ "type": "boolean"
60569
+ },
60570
+ "message": {
60571
+ "anyOf": [
60572
+ {
60573
+ "type": "string"
60574
+ },
60575
+ {
60576
+ "type": "null"
60577
+ }
60578
+ ]
60579
+ },
60580
+ "code": {
60581
+ "anyOf": [
60582
+ {
60583
+ "type": "string"
60584
+ },
60585
+ {
60586
+ "type": "null"
60587
+ }
60588
+ ]
60589
+ },
60590
+ "data": {
60591
+ "anyOf": [
60592
+ {},
60593
+ {
60594
+ "type": "null"
60595
+ }
60596
+ ]
60597
+ }
60598
+ },
60599
+ "required": [
60600
+ "success",
60601
+ "data"
60602
+ ],
60603
+ "additionalProperties": false
60604
+ }
60605
+ }
60606
+ }
60607
+ }
60608
+ },
60609
+ "requestBody": {
60610
+ "required": true,
60611
+ "content": {
60612
+ "application/json": {
60613
+ "schema": {
60614
+ "type": "object",
60615
+ "properties": {
60616
+ "currentPassword": {
60617
+ "type": "string",
60618
+ "minLength": 8,
60619
+ "maxLength": 256
60620
+ },
60621
+ "newPassword": {
60622
+ "type": "string",
60623
+ "minLength": 8,
60624
+ "maxLength": 256
60625
+ },
60626
+ "revokeOtherSessions": {
60627
+ "type": "boolean",
60628
+ "default": true
60629
+ },
60630
+ "refreshToken": {
60631
+ "type": "string",
60632
+ "minLength": 20
60633
+ }
60634
+ },
60635
+ "required": [
60636
+ "currentPassword",
60637
+ "newPassword"
60638
+ ],
60639
+ "additionalProperties": false
60640
+ }
60641
+ }
60642
+ }
60643
+ },
60644
+ "security": [
60645
+ {
60646
+ "frontendBearer": []
60647
+ }
60648
+ ],
60649
+ "x-transport": "http"
60650
+ }
60651
+ },
60652
+ "/auth/password/reset/request": {
60653
+ "post": {
60654
+ "operationId": "auth_password_reset_request",
60655
+ "tags": [
60656
+ "auth"
60657
+ ],
60658
+ "summary": "Request a password reset email",
60659
+ "responses": {
60660
+ "200": {
60661
+ "description": "JSON response",
60662
+ "content": {
60663
+ "application/json": {
60664
+ "schema": {
60665
+ "type": "object",
60666
+ "properties": {
60667
+ "success": {
60668
+ "type": "boolean"
60669
+ },
60670
+ "message": {
60671
+ "anyOf": [
60672
+ {
60673
+ "type": "string"
60674
+ },
60675
+ {
60676
+ "type": "null"
60677
+ }
60678
+ ]
60679
+ },
60680
+ "code": {
60681
+ "anyOf": [
60682
+ {
60683
+ "type": "string"
60684
+ },
60685
+ {
60686
+ "type": "null"
60687
+ }
60688
+ ]
60689
+ },
60690
+ "data": {
60691
+ "anyOf": [
60692
+ {},
60693
+ {
60694
+ "type": "null"
60695
+ }
60696
+ ]
60697
+ }
60698
+ },
60699
+ "required": [
60700
+ "success",
60701
+ "data"
60702
+ ],
60703
+ "additionalProperties": false
60704
+ }
60705
+ }
60706
+ }
60707
+ }
60708
+ },
60709
+ "requestBody": {
60710
+ "required": true,
60711
+ "content": {
60712
+ "application/json": {
60713
+ "schema": {
60714
+ "type": "object",
60715
+ "properties": {
60716
+ "email": {
60717
+ "type": "string",
60718
+ "format": "email",
60719
+ "maxLength": 320
60720
+ }
60721
+ },
60722
+ "required": [
60723
+ "email"
60724
+ ],
60725
+ "additionalProperties": false
60726
+ }
60727
+ }
60728
+ }
60729
+ }
60730
+ }
60731
+ },
60732
+ "/auth/password/reset/confirm": {
60733
+ "post": {
60734
+ "operationId": "auth_password_reset_confirm",
60735
+ "tags": [
60736
+ "auth"
60737
+ ],
60738
+ "summary": "Reset password with an email token",
60739
+ "responses": {
60740
+ "200": {
60741
+ "description": "JSON response",
60742
+ "content": {
60743
+ "application/json": {
60744
+ "schema": {
60745
+ "type": "object",
60746
+ "properties": {
60747
+ "success": {
60748
+ "type": "boolean"
60749
+ },
60750
+ "message": {
60751
+ "anyOf": [
60752
+ {
60753
+ "type": "string"
60754
+ },
60755
+ {
60756
+ "type": "null"
60757
+ }
60758
+ ]
60759
+ },
60760
+ "code": {
60761
+ "anyOf": [
60762
+ {
60763
+ "type": "string"
60764
+ },
60765
+ {
60766
+ "type": "null"
60767
+ }
60768
+ ]
60769
+ },
60770
+ "data": {
60771
+ "anyOf": [
60772
+ {},
60773
+ {
60774
+ "type": "null"
60775
+ }
60776
+ ]
60777
+ }
60778
+ },
60779
+ "required": [
60780
+ "success",
60781
+ "data"
60782
+ ],
60783
+ "additionalProperties": false
60784
+ }
60785
+ }
60786
+ }
60787
+ }
60788
+ },
60789
+ "requestBody": {
60790
+ "required": true,
60791
+ "content": {
60792
+ "application/json": {
60793
+ "schema": {
60794
+ "type": "object",
60795
+ "properties": {
60796
+ "token": {
60797
+ "type": "string",
60798
+ "minLength": 20,
60799
+ "maxLength": 500
60800
+ },
60801
+ "newPassword": {
60802
+ "type": "string",
60803
+ "minLength": 8,
60804
+ "maxLength": 256
60805
+ }
60806
+ },
60807
+ "required": [
60808
+ "token",
60809
+ "newPassword"
60810
+ ],
60811
+ "additionalProperties": false
60812
+ }
60813
+ }
60814
+ }
60815
+ }
60816
+ }
60817
+ },
60818
+ "/auth/password/reset": {
60819
+ "get": {
60820
+ "operationId": "auth_password_reset_landing",
60821
+ "tags": [
60822
+ "auth"
60823
+ ],
60824
+ "summary": "Browser landing page for password reset links",
60825
+ "responses": {
60826
+ "200": {
60827
+ "description": "Binary response",
60828
+ "content": {
60829
+ "text/html": {
60830
+ "schema": {
60831
+ "type": "string",
60832
+ "format": "binary"
60833
+ }
60834
+ }
60835
+ }
60836
+ }
60837
+ },
60838
+ "parameters": [
60839
+ {
60840
+ "name": "token",
60841
+ "in": "query",
60842
+ "required": false,
59320
60843
  "schema": {
59321
60844
  "type": "string",
59322
60845
  "minLength": 1,
@@ -59326,6 +60849,232 @@
59326
60849
  ]
59327
60850
  }
59328
60851
  },
60852
+ "/auth/sessions": {
60853
+ "get": {
60854
+ "operationId": "auth_sessions_list",
60855
+ "tags": [
60856
+ "auth"
60857
+ ],
60858
+ "summary": "List active refresh-token sessions for the current user",
60859
+ "responses": {
60860
+ "200": {
60861
+ "description": "JSON response",
60862
+ "content": {
60863
+ "application/json": {
60864
+ "schema": {
60865
+ "type": "object",
60866
+ "properties": {
60867
+ "success": {
60868
+ "type": "boolean"
60869
+ },
60870
+ "message": {
60871
+ "anyOf": [
60872
+ {
60873
+ "type": "string"
60874
+ },
60875
+ {
60876
+ "type": "null"
60877
+ }
60878
+ ]
60879
+ },
60880
+ "code": {
60881
+ "anyOf": [
60882
+ {
60883
+ "type": "string"
60884
+ },
60885
+ {
60886
+ "type": "null"
60887
+ }
60888
+ ]
60889
+ },
60890
+ "data": {
60891
+ "anyOf": [
60892
+ {},
60893
+ {
60894
+ "type": "null"
60895
+ }
60896
+ ]
60897
+ }
60898
+ },
60899
+ "required": [
60900
+ "success",
60901
+ "data"
60902
+ ],
60903
+ "additionalProperties": false
60904
+ }
60905
+ }
60906
+ }
60907
+ }
60908
+ },
60909
+ "security": [
60910
+ {
60911
+ "frontendBearer": []
60912
+ }
60913
+ ],
60914
+ "x-transport": "http"
60915
+ }
60916
+ },
60917
+ "/auth/sessions/:sessionId": {
60918
+ "delete": {
60919
+ "operationId": "auth_sessions_revoke",
60920
+ "tags": [
60921
+ "auth"
60922
+ ],
60923
+ "summary": "Revoke one active session",
60924
+ "responses": {
60925
+ "200": {
60926
+ "description": "JSON response",
60927
+ "content": {
60928
+ "application/json": {
60929
+ "schema": {
60930
+ "type": "object",
60931
+ "properties": {
60932
+ "success": {
60933
+ "type": "boolean"
60934
+ },
60935
+ "message": {
60936
+ "anyOf": [
60937
+ {
60938
+ "type": "string"
60939
+ },
60940
+ {
60941
+ "type": "null"
60942
+ }
60943
+ ]
60944
+ },
60945
+ "code": {
60946
+ "anyOf": [
60947
+ {
60948
+ "type": "string"
60949
+ },
60950
+ {
60951
+ "type": "null"
60952
+ }
60953
+ ]
60954
+ },
60955
+ "data": {
60956
+ "anyOf": [
60957
+ {},
60958
+ {
60959
+ "type": "null"
60960
+ }
60961
+ ]
60962
+ }
60963
+ },
60964
+ "required": [
60965
+ "success",
60966
+ "data"
60967
+ ],
60968
+ "additionalProperties": false
60969
+ }
60970
+ }
60971
+ }
60972
+ }
60973
+ },
60974
+ "parameters": [
60975
+ {
60976
+ "name": "sessionId",
60977
+ "in": "path",
60978
+ "required": true,
60979
+ "schema": {
60980
+ "type": "integer",
60981
+ "exclusiveMinimum": 0
60982
+ }
60983
+ }
60984
+ ],
60985
+ "security": [
60986
+ {
60987
+ "frontendBearer": []
60988
+ }
60989
+ ],
60990
+ "x-transport": "http"
60991
+ }
60992
+ },
60993
+ "/auth/sessions/revoke-other": {
60994
+ "post": {
60995
+ "operationId": "auth_sessions_revoke_other",
60996
+ "tags": [
60997
+ "auth"
60998
+ ],
60999
+ "summary": "Revoke all sessions except the supplied current refresh token",
61000
+ "responses": {
61001
+ "200": {
61002
+ "description": "JSON response",
61003
+ "content": {
61004
+ "application/json": {
61005
+ "schema": {
61006
+ "type": "object",
61007
+ "properties": {
61008
+ "success": {
61009
+ "type": "boolean"
61010
+ },
61011
+ "message": {
61012
+ "anyOf": [
61013
+ {
61014
+ "type": "string"
61015
+ },
61016
+ {
61017
+ "type": "null"
61018
+ }
61019
+ ]
61020
+ },
61021
+ "code": {
61022
+ "anyOf": [
61023
+ {
61024
+ "type": "string"
61025
+ },
61026
+ {
61027
+ "type": "null"
61028
+ }
61029
+ ]
61030
+ },
61031
+ "data": {
61032
+ "anyOf": [
61033
+ {},
61034
+ {
61035
+ "type": "null"
61036
+ }
61037
+ ]
61038
+ }
61039
+ },
61040
+ "required": [
61041
+ "success",
61042
+ "data"
61043
+ ],
61044
+ "additionalProperties": false
61045
+ }
61046
+ }
61047
+ }
61048
+ }
61049
+ },
61050
+ "requestBody": {
61051
+ "required": true,
61052
+ "content": {
61053
+ "application/json": {
61054
+ "schema": {
61055
+ "type": "object",
61056
+ "properties": {
61057
+ "refreshToken": {
61058
+ "type": "string",
61059
+ "minLength": 20
61060
+ }
61061
+ },
61062
+ "required": [
61063
+ "refreshToken"
61064
+ ],
61065
+ "additionalProperties": false
61066
+ }
61067
+ }
61068
+ }
61069
+ },
61070
+ "security": [
61071
+ {
61072
+ "frontendBearer": []
61073
+ }
61074
+ ],
61075
+ "x-transport": "http"
61076
+ }
61077
+ },
59329
61078
  "/internal/users/provision": {
59330
61079
  "post": {
59331
61080
  "operationId": "internal_users_provision",