@orvello/sdk 0.2.4 → 0.4.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,385 @@
8486
8486
  ]
8487
8487
  }
8488
8488
  },
8489
+ "/invoices/external/:invoiceId/payment-evidence": {
8490
+ "get": {
8491
+ "operationId": "invoices_payment_evidence_external",
8492
+ "tags": [
8493
+ "invoices-external"
8494
+ ],
8495
+ "summary": "Read bank payment evidence for an invoice",
8496
+ "description": "Consistent read-only snapshot of imported bank payments and refunds. Separates cash from discounts, writeoffs and manual paid marks. Decimal amounts are strings. bankPaymentConfirmed requires full matching-account/currency bank coverage without unresolved issues. revision is a content digest, not an ordered event version. No bank import or payment is initiated.",
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
+ "invoiceId": {
8534
+ "type": "integer",
8535
+ "exclusiveMinimum": 0
8536
+ },
8537
+ "invoiceNumber": {
8538
+ "type": "string"
8539
+ },
8540
+ "currency": {
8541
+ "type": "string"
8542
+ },
8543
+ "invoiceStatus": {
8544
+ "type": "string"
8545
+ },
8546
+ "paidSource": {
8547
+ "anyOf": [
8548
+ {
8549
+ "type": "string"
8550
+ },
8551
+ {
8552
+ "type": "null"
8553
+ }
8554
+ ]
8555
+ },
8556
+ "receivingAccountId": {
8557
+ "anyOf": [
8558
+ {
8559
+ "type": "integer",
8560
+ "exclusiveMinimum": 0
8561
+ },
8562
+ {
8563
+ "type": "null"
8564
+ }
8565
+ ]
8566
+ },
8567
+ "invoiceAmount": {
8568
+ "type": "string"
8569
+ },
8570
+ "bankReceivedAmount": {
8571
+ "type": "string"
8572
+ },
8573
+ "bankRefundedAmount": {
8574
+ "type": "string"
8575
+ },
8576
+ "bankNetAmount": {
8577
+ "type": "string"
8578
+ },
8579
+ "nonCashSettlementAmount": {
8580
+ "type": "string"
8581
+ },
8582
+ "outstandingBankAmount": {
8583
+ "type": "string"
8584
+ },
8585
+ "overpaidBankAmount": {
8586
+ "type": "string"
8587
+ },
8588
+ "state": {
8589
+ "type": "string",
8590
+ "enum": [
8591
+ "unpaid",
8592
+ "partial",
8593
+ "covered",
8594
+ "overpaid",
8595
+ "review_required",
8596
+ "ineligible"
8597
+ ]
8598
+ },
8599
+ "bankPaymentConfirmed": {
8600
+ "type": "boolean"
8601
+ },
8602
+ "issues": {
8603
+ "type": "array",
8604
+ "items": {
8605
+ "type": "string",
8606
+ "enum": [
8607
+ "missing_receiving_account",
8608
+ "invalid_invoice_amount",
8609
+ "ineligible_invoice",
8610
+ "missing_payment",
8611
+ "wrong_account",
8612
+ "currency_mismatch",
8613
+ "invalid_amount",
8614
+ "unsupported_source",
8615
+ "invalid_direction",
8616
+ "payment_overallocated",
8617
+ "non_cash_settlement",
8618
+ "status_without_bank_evidence",
8619
+ "negative_bank_balance"
8620
+ ]
8621
+ }
8622
+ },
8623
+ "bankAllocationIds": {
8624
+ "type": "array",
8625
+ "items": {
8626
+ "type": "integer",
8627
+ "exclusiveMinimum": 0
8628
+ }
8629
+ },
8630
+ "excludedAllocationIds": {
8631
+ "type": "array",
8632
+ "items": {
8633
+ "type": "integer",
8634
+ "exclusiveMinimum": 0
8635
+ }
8636
+ },
8637
+ "reversedAllocationCount": {
8638
+ "type": "integer",
8639
+ "minimum": 0
8640
+ },
8641
+ "revision": {
8642
+ "type": "string",
8643
+ "pattern": "^[a-f0-9]{64}$"
8644
+ },
8645
+ "observedAt": {
8646
+ "type": "string",
8647
+ "format": "date-time"
8648
+ }
8649
+ },
8650
+ "required": [
8651
+ "invoiceId",
8652
+ "invoiceNumber",
8653
+ "currency",
8654
+ "invoiceStatus",
8655
+ "paidSource",
8656
+ "receivingAccountId",
8657
+ "invoiceAmount",
8658
+ "bankReceivedAmount",
8659
+ "bankRefundedAmount",
8660
+ "bankNetAmount",
8661
+ "nonCashSettlementAmount",
8662
+ "outstandingBankAmount",
8663
+ "overpaidBankAmount",
8664
+ "state",
8665
+ "bankPaymentConfirmed",
8666
+ "issues",
8667
+ "bankAllocationIds",
8668
+ "excludedAllocationIds",
8669
+ "reversedAllocationCount",
8670
+ "revision",
8671
+ "observedAt"
8672
+ ],
8673
+ "additionalProperties": false
8674
+ },
8675
+ {
8676
+ "type": "null"
8677
+ }
8678
+ ]
8679
+ }
8680
+ },
8681
+ "required": [
8682
+ "success",
8683
+ "data"
8684
+ ],
8685
+ "additionalProperties": false
8686
+ }
8687
+ }
8688
+ }
8689
+ }
8690
+ },
8691
+ "parameters": [
8692
+ {
8693
+ "name": "invoiceId",
8694
+ "in": "path",
8695
+ "required": true,
8696
+ "schema": {
8697
+ "type": "integer",
8698
+ "exclusiveMinimum": 0
8699
+ }
8700
+ }
8701
+ ],
8702
+ "security": [
8703
+ {
8704
+ "oauth2Bearer": []
8705
+ },
8706
+ {
8707
+ "companyApiKeyBearer": []
8708
+ }
8709
+ ],
8710
+ "x-auth": {
8711
+ "allowOAuth2": true,
8712
+ "allowApiKey": true,
8713
+ "allowUserSession": false,
8714
+ "requireRole": "viewer"
8715
+ },
8716
+ "x-scopes": [
8717
+ "invoices:read"
8718
+ ]
8719
+ }
8720
+ },
8721
+ "/invoices/external/:invoiceId/payment-instructions": {
8722
+ "get": {
8723
+ "operationId": "invoices_payment_instructions_external",
8724
+ "tags": [
8725
+ "invoices-external"
8726
+ ],
8727
+ "summary": "Read immutable bank payment instructions",
8728
+ "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.",
8729
+ "responses": {
8730
+ "200": {
8731
+ "description": "JSON response",
8732
+ "content": {
8733
+ "application/json": {
8734
+ "schema": {
8735
+ "type": "object",
8736
+ "properties": {
8737
+ "success": {
8738
+ "type": "boolean"
8739
+ },
8740
+ "message": {
8741
+ "anyOf": [
8742
+ {
8743
+ "type": "string"
8744
+ },
8745
+ {
8746
+ "type": "null"
8747
+ }
8748
+ ]
8749
+ },
8750
+ "code": {
8751
+ "anyOf": [
8752
+ {
8753
+ "type": "string"
8754
+ },
8755
+ {
8756
+ "type": "null"
8757
+ }
8758
+ ]
8759
+ },
8760
+ "data": {
8761
+ "anyOf": [
8762
+ {
8763
+ "type": "object",
8764
+ "properties": {
8765
+ "invoiceId": {
8766
+ "type": "integer",
8767
+ "exclusiveMinimum": 0
8768
+ },
8769
+ "reference": {
8770
+ "type": "string"
8771
+ },
8772
+ "accountOwner": {
8773
+ "type": "string"
8774
+ },
8775
+ "iban": {
8776
+ "type": "string"
8777
+ },
8778
+ "bic": {
8779
+ "anyOf": [
8780
+ {
8781
+ "type": "string"
8782
+ },
8783
+ {
8784
+ "type": "null"
8785
+ }
8786
+ ]
8787
+ },
8788
+ "bankName": {
8789
+ "anyOf": [
8790
+ {
8791
+ "type": "string"
8792
+ },
8793
+ {
8794
+ "type": "null"
8795
+ }
8796
+ ]
8797
+ },
8798
+ "currency": {
8799
+ "type": "string"
8800
+ },
8801
+ "invoiceAmount": {
8802
+ "type": "string"
8803
+ },
8804
+ "createdAt": {
8805
+ "type": "string",
8806
+ "format": "date-time"
8807
+ }
8808
+ },
8809
+ "required": [
8810
+ "invoiceId",
8811
+ "reference",
8812
+ "accountOwner",
8813
+ "iban",
8814
+ "bic",
8815
+ "bankName",
8816
+ "currency",
8817
+ "invoiceAmount",
8818
+ "createdAt"
8819
+ ],
8820
+ "additionalProperties": false
8821
+ },
8822
+ {
8823
+ "type": "null"
8824
+ }
8825
+ ]
8826
+ }
8827
+ },
8828
+ "required": [
8829
+ "success",
8830
+ "data"
8831
+ ],
8832
+ "additionalProperties": false
8833
+ }
8834
+ }
8835
+ }
8836
+ }
8837
+ },
8838
+ "parameters": [
8839
+ {
8840
+ "name": "invoiceId",
8841
+ "in": "path",
8842
+ "required": true,
8843
+ "schema": {
8844
+ "type": "integer",
8845
+ "exclusiveMinimum": 0
8846
+ }
8847
+ }
8848
+ ],
8849
+ "security": [
8850
+ {
8851
+ "oauth2Bearer": []
8852
+ },
8853
+ {
8854
+ "companyApiKeyBearer": []
8855
+ }
8856
+ ],
8857
+ "x-auth": {
8858
+ "allowOAuth2": true,
8859
+ "allowApiKey": true,
8860
+ "allowUserSession": false,
8861
+ "requireRole": "viewer"
8862
+ },
8863
+ "x-scopes": [
8864
+ "invoices:read"
8865
+ ]
8866
+ }
8867
+ },
8489
8868
  "/invoices/external": {
8490
8869
  "get": {
8491
8870
  "operationId": "invoices_search_external",
@@ -58254,13 +58633,13 @@
58254
58633
  }
58255
58634
  }
58256
58635
  },
58257
- "/auth/register": {
58636
+ "/auth/mfa/complete": {
58258
58637
  "post": {
58259
- "operationId": "auth_register",
58638
+ "operationId": "auth_mfa_complete",
58260
58639
  "tags": [
58261
58640
  "auth"
58262
58641
  ],
58263
- "summary": "Register a new direct-auth account",
58642
+ "summary": "Complete a first-factor login with TOTP or a recovery code",
58264
58643
  "responses": {
58265
58644
  "200": {
58266
58645
  "description": "JSON response",
@@ -58318,25 +58697,28 @@
58318
58697
  "schema": {
58319
58698
  "type": "object",
58320
58699
  "properties": {
58321
- "email": {
58700
+ "challengeToken": {
58322
58701
  "type": "string",
58323
- "format": "email",
58324
- "maxLength": 320
58702
+ "minLength": 32,
58703
+ "maxLength": 128
58325
58704
  },
58326
- "password": {
58705
+ "code": {
58327
58706
  "type": "string",
58328
- "minLength": 8,
58329
- "maxLength": 256
58707
+ "minLength": 6,
58708
+ "maxLength": 64
58330
58709
  },
58331
- "name": {
58710
+ "kind": {
58332
58711
  "type": "string",
58333
- "minLength": 1,
58334
- "maxLength": 200
58712
+ "enum": [
58713
+ "totp",
58714
+ "recovery"
58715
+ ],
58716
+ "default": "totp"
58335
58717
  }
58336
58718
  },
58337
58719
  "required": [
58338
- "email",
58339
- "password"
58720
+ "challengeToken",
58721
+ "code"
58340
58722
  ],
58341
58723
  "additionalProperties": false
58342
58724
  }
@@ -58345,13 +58727,13 @@
58345
58727
  }
58346
58728
  }
58347
58729
  },
58348
- "/auth/login": {
58349
- "post": {
58350
- "operationId": "auth_login",
58730
+ "/auth/mfa": {
58731
+ "get": {
58732
+ "operationId": "auth_mfa_status",
58351
58733
  "tags": [
58352
58734
  "auth"
58353
58735
  ],
58354
- "summary": "Log in with email + password",
58736
+ "summary": "Read the current product account's MFA status",
58355
58737
  "responses": {
58356
58738
  "200": {
58357
58739
  "description": "JSON response",
@@ -58385,7 +58767,29 @@
58385
58767
  },
58386
58768
  "data": {
58387
58769
  "anyOf": [
58388
- {},
58770
+ {
58771
+ "type": "object",
58772
+ "properties": {
58773
+ "enabled": {
58774
+ "type": "boolean"
58775
+ },
58776
+ "methods": {
58777
+ "type": "array",
58778
+ "items": {
58779
+ "type": "string"
58780
+ }
58781
+ },
58782
+ "recoveryCodesRemaining": {
58783
+ "type": "number"
58784
+ }
58785
+ },
58786
+ "required": [
58787
+ "enabled",
58788
+ "methods",
58789
+ "recoveryCodesRemaining"
58790
+ ],
58791
+ "additionalProperties": false
58792
+ },
58389
58793
  {
58390
58794
  "type": "null"
58391
58795
  }
@@ -58402,42 +58806,21 @@
58402
58806
  }
58403
58807
  }
58404
58808
  },
58405
- "requestBody": {
58406
- "required": true,
58407
- "content": {
58408
- "application/json": {
58409
- "schema": {
58410
- "type": "object",
58411
- "properties": {
58412
- "email": {
58413
- "type": "string",
58414
- "format": "email",
58415
- "maxLength": 320
58416
- },
58417
- "password": {
58418
- "type": "string",
58419
- "minLength": 8,
58420
- "maxLength": 256
58421
- }
58422
- },
58423
- "required": [
58424
- "email",
58425
- "password"
58426
- ],
58427
- "additionalProperties": false
58428
- }
58429
- }
58809
+ "security": [
58810
+ {
58811
+ "frontendBearer": []
58430
58812
  }
58431
- }
58813
+ ],
58814
+ "x-transport": "http"
58432
58815
  }
58433
58816
  },
58434
- "/auth/refresh": {
58817
+ "/auth/mfa/setup": {
58435
58818
  "post": {
58436
- "operationId": "auth_refresh",
58819
+ "operationId": "auth_mfa_setup",
58437
58820
  "tags": [
58438
58821
  "auth"
58439
58822
  ],
58440
- "summary": "Rotate access + refresh tokens",
58823
+ "summary": "Prepare TOTP enrollment after rechecking the password",
58441
58824
  "responses": {
58442
58825
  "200": {
58443
58826
  "description": "JSON response",
@@ -58471,7 +58854,26 @@
58471
58854
  },
58472
58855
  "data": {
58473
58856
  "anyOf": [
58474
- {},
58857
+ {
58858
+ "type": "object",
58859
+ "properties": {
58860
+ "secret": {
58861
+ "type": "string"
58862
+ },
58863
+ "otpauthUri": {
58864
+ "type": "string"
58865
+ },
58866
+ "expiresAt": {
58867
+ "type": "string"
58868
+ }
58869
+ },
58870
+ "required": [
58871
+ "secret",
58872
+ "otpauthUri",
58873
+ "expiresAt"
58874
+ ],
58875
+ "additionalProperties": false
58876
+ },
58475
58877
  {
58476
58878
  "type": "null"
58477
58879
  }
@@ -58495,30 +58897,37 @@
58495
58897
  "schema": {
58496
58898
  "type": "object",
58497
58899
  "properties": {
58498
- "refreshToken": {
58900
+ "password": {
58499
58901
  "type": "string",
58500
- "minLength": 20
58902
+ "minLength": 8,
58903
+ "maxLength": 256
58501
58904
  }
58502
58905
  },
58503
58906
  "required": [
58504
- "refreshToken"
58907
+ "password"
58505
58908
  ],
58506
58909
  "additionalProperties": false
58507
58910
  }
58508
58911
  }
58509
58912
  }
58510
- }
58913
+ },
58914
+ "security": [
58915
+ {
58916
+ "frontendBearer": []
58917
+ }
58918
+ ],
58919
+ "x-transport": "http"
58511
58920
  }
58512
58921
  },
58513
- "/auth/logout": {
58922
+ "/auth/mfa/enable": {
58514
58923
  "post": {
58515
- "operationId": "auth_logout",
58924
+ "operationId": "auth_mfa_enable",
58516
58925
  "tags": [
58517
58926
  "auth"
58518
58927
  ],
58519
- "summary": "Revoke the current refresh token",
58928
+ "summary": "Confirm TOTP enrollment and return recovery codes once",
58520
58929
  "responses": {
58521
- "204": {
58930
+ "200": {
58522
58931
  "description": "JSON response",
58523
58932
  "content": {
58524
58933
  "application/json": {
@@ -58552,7 +58961,25 @@
58552
58961
  "anyOf": [
58553
58962
  {
58554
58963
  "type": "object",
58555
- "properties": {},
58964
+ "properties": {
58965
+ "enabled": {
58966
+ "type": "boolean"
58967
+ },
58968
+ "recoveryCodes": {
58969
+ "type": "array",
58970
+ "items": {
58971
+ "type": "string"
58972
+ }
58973
+ },
58974
+ "reauthenticationRequired": {
58975
+ "type": "boolean"
58976
+ }
58977
+ },
58978
+ "required": [
58979
+ "enabled",
58980
+ "recoveryCodes",
58981
+ "reauthenticationRequired"
58982
+ ],
58556
58983
  "additionalProperties": false
58557
58984
  },
58558
58985
  {
@@ -58578,25 +59005,34 @@
58578
59005
  "schema": {
58579
59006
  "type": "object",
58580
59007
  "properties": {
58581
- "refreshToken": {
59008
+ "code": {
58582
59009
  "type": "string",
58583
- "minLength": 20
59010
+ "pattern": "^\\d{6}$"
58584
59011
  }
58585
59012
  },
59013
+ "required": [
59014
+ "code"
59015
+ ],
58586
59016
  "additionalProperties": false
58587
59017
  }
58588
59018
  }
58589
59019
  }
58590
- }
59020
+ },
59021
+ "security": [
59022
+ {
59023
+ "frontendBearer": []
59024
+ }
59025
+ ],
59026
+ "x-transport": "http"
58591
59027
  }
58592
59028
  },
58593
- "/auth/me": {
58594
- "get": {
58595
- "operationId": "auth_me",
59029
+ "/auth/mfa/disable": {
59030
+ "post": {
59031
+ "operationId": "auth_mfa_disable",
58596
59032
  "tags": [
58597
59033
  "auth"
58598
59034
  ],
58599
- "summary": "Get the current user incl. roles and isAdmin (Bearer access JWT)",
59035
+ "summary": "Disable MFA using both the password and a second factor",
58600
59036
  "responses": {
58601
59037
  "200": {
58602
59038
  "description": "JSON response",
@@ -58630,7 +59066,22 @@
58630
59066
  },
58631
59067
  "data": {
58632
59068
  "anyOf": [
58633
- {},
59069
+ {
59070
+ "type": "object",
59071
+ "properties": {
59072
+ "ok": {
59073
+ "type": "boolean"
59074
+ },
59075
+ "reauthenticationRequired": {
59076
+ "type": "boolean"
59077
+ }
59078
+ },
59079
+ "required": [
59080
+ "ok",
59081
+ "reauthenticationRequired"
59082
+ ],
59083
+ "additionalProperties": false
59084
+ },
58634
59085
  {
58635
59086
  "type": "null"
58636
59087
  }
@@ -58647,6 +59098,41 @@
58647
59098
  }
58648
59099
  }
58649
59100
  },
59101
+ "requestBody": {
59102
+ "required": true,
59103
+ "content": {
59104
+ "application/json": {
59105
+ "schema": {
59106
+ "type": "object",
59107
+ "properties": {
59108
+ "password": {
59109
+ "type": "string",
59110
+ "minLength": 8,
59111
+ "maxLength": 256
59112
+ },
59113
+ "code": {
59114
+ "type": "string",
59115
+ "minLength": 6,
59116
+ "maxLength": 64
59117
+ },
59118
+ "kind": {
59119
+ "type": "string",
59120
+ "enum": [
59121
+ "totp",
59122
+ "recovery"
59123
+ ],
59124
+ "default": "totp"
59125
+ }
59126
+ },
59127
+ "required": [
59128
+ "password",
59129
+ "code"
59130
+ ],
59131
+ "additionalProperties": false
59132
+ }
59133
+ }
59134
+ }
59135
+ },
58650
59136
  "security": [
58651
59137
  {
58652
59138
  "frontendBearer": []
@@ -58655,13 +59141,13 @@
58655
59141
  "x-transport": "http"
58656
59142
  }
58657
59143
  },
58658
- "/auth/me/profile": {
58659
- "patch": {
58660
- "operationId": "auth_me_profile_update",
59144
+ "/auth/register": {
59145
+ "post": {
59146
+ "operationId": "auth_register",
58661
59147
  "tags": [
58662
59148
  "auth"
58663
59149
  ],
58664
- "summary": "Update the current user's own profile (name, avatar)",
59150
+ "summary": "Register a new direct-auth account",
58665
59151
  "responses": {
58666
59152
  "200": {
58667
59153
  "description": "JSON response",
@@ -58719,99 +59205,92 @@
58719
59205
  "schema": {
58720
59206
  "type": "object",
58721
59207
  "properties": {
59208
+ "email": {
59209
+ "type": "string",
59210
+ "format": "email",
59211
+ "maxLength": 320
59212
+ },
59213
+ "password": {
59214
+ "type": "string",
59215
+ "minLength": 8,
59216
+ "maxLength": 256
59217
+ },
58722
59218
  "name": {
58723
59219
  "type": "string",
58724
59220
  "minLength": 1,
58725
59221
  "maxLength": 200
58726
59222
  },
58727
- "avatarStyle": {
58728
- "anyOf": [
58729
- {
58730
- "type": "object",
58731
- "properties": {
58732
- "seed": {
58733
- "type": "string",
58734
- "minLength": 1,
58735
- "maxLength": 200
58736
- },
58737
- "hue": {
58738
- "type": "integer",
58739
- "minimum": 0,
58740
- "maximum": 359
58741
- },
58742
- "shape": {
58743
- "type": "string",
58744
- "enum": [
58745
- "round",
58746
- "organic",
58747
- "boxy",
58748
- "nub",
58749
- "cloud",
58750
- "sun",
58751
- "capsule",
58752
- "triangle",
58753
- "hexagon",
58754
- "droplet"
58755
- ]
58756
- },
58757
- "expression": {
58758
- "type": "string",
58759
- "enum": [
58760
- "idle",
58761
- "happy",
58762
- "sad",
58763
- "mad",
58764
- "surprised",
58765
- "wink",
58766
- "sleepy",
58767
- "smug",
58768
- "unsure",
58769
- "scared",
58770
- "love",
58771
- "shy",
58772
- "sick",
58773
- "thinking"
58774
- ]
58775
- },
58776
- "background": {
58777
- "type": "string",
58778
- "enum": [
58779
- "none",
58780
- "squircle",
58781
- "circle"
58782
- ]
58783
- }
58784
- },
58785
- "additionalProperties": false
59223
+ "firstName": {
59224
+ "type": "string",
59225
+ "minLength": 1,
59226
+ "maxLength": 100
59227
+ },
59228
+ "lastName": {
59229
+ "type": "string",
59230
+ "minLength": 1,
59231
+ "maxLength": 100
59232
+ },
59233
+ "device": {
59234
+ "type": "object",
59235
+ "properties": {
59236
+ "deviceId": {
59237
+ "type": "string",
59238
+ "minLength": 1,
59239
+ "maxLength": 200
58786
59240
  },
58787
- {
58788
- "type": "null"
59241
+ "deviceName": {
59242
+ "type": "string",
59243
+ "minLength": 1,
59244
+ "maxLength": 200
59245
+ },
59246
+ "deviceModel": {
59247
+ "type": "string",
59248
+ "minLength": 1,
59249
+ "maxLength": 200
59250
+ },
59251
+ "deviceOs": {
59252
+ "type": "string",
59253
+ "minLength": 1,
59254
+ "maxLength": 200
59255
+ },
59256
+ "appVersion": {
59257
+ "type": "string",
59258
+ "minLength": 1,
59259
+ "maxLength": 100
59260
+ },
59261
+ "platform": {
59262
+ "type": "string",
59263
+ "enum": [
59264
+ "ios",
59265
+ "android",
59266
+ "web",
59267
+ "expo"
59268
+ ]
58789
59269
  }
58790
- ]
59270
+ },
59271
+ "additionalProperties": false
58791
59272
  }
58792
59273
  },
59274
+ "required": [
59275
+ "email",
59276
+ "password"
59277
+ ],
58793
59278
  "additionalProperties": false
58794
59279
  }
58795
59280
  }
58796
59281
  }
58797
- },
58798
- "security": [
58799
- {
58800
- "frontendBearer": []
58801
- }
58802
- ],
58803
- "x-transport": "http"
59282
+ }
58804
59283
  }
58805
59284
  },
58806
- "/auth/push-token": {
59285
+ "/auth/login": {
58807
59286
  "post": {
58808
- "operationId": "auth_push_token_upsert",
59287
+ "operationId": "auth_login",
58809
59288
  "tags": [
58810
59289
  "auth"
58811
59290
  ],
58812
- "summary": "Register a device push token for the current user",
59291
+ "summary": "Log in with email + password",
58813
59292
  "responses": {
58814
- "204": {
59293
+ "200": {
58815
59294
  "description": "JSON response",
58816
59295
  "content": {
58817
59296
  "application/json": {
@@ -58843,11 +59322,7 @@
58843
59322
  },
58844
59323
  "data": {
58845
59324
  "anyOf": [
58846
- {
58847
- "type": "object",
58848
- "properties": {},
58849
- "additionalProperties": false
58850
- },
59325
+ {},
58851
59326
  {
58852
59327
  "type": "null"
58853
59328
  }
@@ -58871,45 +59346,75 @@
58871
59346
  "schema": {
58872
59347
  "type": "object",
58873
59348
  "properties": {
58874
- "token": {
59349
+ "email": {
58875
59350
  "type": "string",
58876
- "minLength": 1,
58877
- "maxLength": 500
59351
+ "format": "email",
59352
+ "maxLength": 320
58878
59353
  },
58879
- "platform": {
59354
+ "password": {
58880
59355
  "type": "string",
58881
- "enum": [
58882
- "ios",
58883
- "android",
58884
- "web",
58885
- "expo"
58886
- ]
59356
+ "minLength": 8,
59357
+ "maxLength": 256
59358
+ },
59359
+ "device": {
59360
+ "type": "object",
59361
+ "properties": {
59362
+ "deviceId": {
59363
+ "type": "string",
59364
+ "minLength": 1,
59365
+ "maxLength": 200
59366
+ },
59367
+ "deviceName": {
59368
+ "type": "string",
59369
+ "minLength": 1,
59370
+ "maxLength": 200
59371
+ },
59372
+ "deviceModel": {
59373
+ "type": "string",
59374
+ "minLength": 1,
59375
+ "maxLength": 200
59376
+ },
59377
+ "deviceOs": {
59378
+ "type": "string",
59379
+ "minLength": 1,
59380
+ "maxLength": 200
59381
+ },
59382
+ "appVersion": {
59383
+ "type": "string",
59384
+ "minLength": 1,
59385
+ "maxLength": 100
59386
+ },
59387
+ "platform": {
59388
+ "type": "string",
59389
+ "enum": [
59390
+ "ios",
59391
+ "android",
59392
+ "web",
59393
+ "expo"
59394
+ ]
59395
+ }
59396
+ },
59397
+ "additionalProperties": false
58887
59398
  }
58888
59399
  },
58889
59400
  "required": [
58890
- "token",
58891
- "platform"
59401
+ "email",
59402
+ "password"
58892
59403
  ],
58893
59404
  "additionalProperties": false
58894
59405
  }
58895
59406
  }
58896
59407
  }
58897
- },
58898
- "security": [
58899
- {
58900
- "frontendBearer": []
58901
- }
58902
- ],
58903
- "x-transport": "http"
59408
+ }
58904
59409
  }
58905
59410
  },
58906
- "/auth/verify-email/request": {
59411
+ "/auth/refresh": {
58907
59412
  "post": {
58908
- "operationId": "auth_verify_email_request",
59413
+ "operationId": "auth_refresh",
58909
59414
  "tags": [
58910
59415
  "auth"
58911
59416
  ],
58912
- "summary": "Send a fresh email-verification link to the current user",
59417
+ "summary": "Rotate access + refresh tokens",
58913
59418
  "responses": {
58914
59419
  "200": {
58915
59420
  "description": "JSON response",
@@ -58966,29 +59471,71 @@
58966
59471
  "application/json": {
58967
59472
  "schema": {
58968
59473
  "type": "object",
58969
- "properties": {},
59474
+ "properties": {
59475
+ "refreshToken": {
59476
+ "type": "string",
59477
+ "minLength": 20
59478
+ },
59479
+ "device": {
59480
+ "type": "object",
59481
+ "properties": {
59482
+ "deviceId": {
59483
+ "type": "string",
59484
+ "minLength": 1,
59485
+ "maxLength": 200
59486
+ },
59487
+ "deviceName": {
59488
+ "type": "string",
59489
+ "minLength": 1,
59490
+ "maxLength": 200
59491
+ },
59492
+ "deviceModel": {
59493
+ "type": "string",
59494
+ "minLength": 1,
59495
+ "maxLength": 200
59496
+ },
59497
+ "deviceOs": {
59498
+ "type": "string",
59499
+ "minLength": 1,
59500
+ "maxLength": 200
59501
+ },
59502
+ "appVersion": {
59503
+ "type": "string",
59504
+ "minLength": 1,
59505
+ "maxLength": 100
59506
+ },
59507
+ "platform": {
59508
+ "type": "string",
59509
+ "enum": [
59510
+ "ios",
59511
+ "android",
59512
+ "web",
59513
+ "expo"
59514
+ ]
59515
+ }
59516
+ },
59517
+ "additionalProperties": false
59518
+ }
59519
+ },
59520
+ "required": [
59521
+ "refreshToken"
59522
+ ],
58970
59523
  "additionalProperties": false
58971
59524
  }
58972
59525
  }
58973
59526
  }
58974
- },
58975
- "security": [
58976
- {
58977
- "frontendBearer": []
58978
- }
58979
- ],
58980
- "x-transport": "http"
59527
+ }
58981
59528
  }
58982
59529
  },
58983
- "/auth/verify-email/confirm": {
59530
+ "/auth/logout": {
58984
59531
  "post": {
58985
- "operationId": "auth_verify_email_confirm",
59532
+ "operationId": "auth_logout",
58986
59533
  "tags": [
58987
59534
  "auth"
58988
59535
  ],
58989
- "summary": "Confirm an email-verification token (programmatic / deep-link flow)",
59536
+ "summary": "Revoke the current refresh token",
58990
59537
  "responses": {
58991
- "200": {
59538
+ "204": {
58992
59539
  "description": "JSON response",
58993
59540
  "content": {
58994
59541
  "application/json": {
@@ -59020,7 +59567,11 @@
59020
59567
  },
59021
59568
  "data": {
59022
59569
  "anyOf": [
59023
- {},
59570
+ {
59571
+ "type": "object",
59572
+ "properties": {},
59573
+ "additionalProperties": false
59574
+ },
59024
59575
  {
59025
59576
  "type": "null"
59026
59577
  }
@@ -59044,15 +59595,11 @@
59044
59595
  "schema": {
59045
59596
  "type": "object",
59046
59597
  "properties": {
59047
- "token": {
59598
+ "refreshToken": {
59048
59599
  "type": "string",
59049
- "minLength": 20,
59050
- "maxLength": 500
59600
+ "minLength": 20
59051
59601
  }
59052
59602
  },
59053
- "required": [
59054
- "token"
59055
- ],
59056
59603
  "additionalProperties": false
59057
59604
  }
59058
59605
  }
@@ -59060,31 +59607,924 @@
59060
59607
  }
59061
59608
  }
59062
59609
  },
59063
- "/auth/verify-email": {
59610
+ "/auth/me": {
59064
59611
  "get": {
59065
- "operationId": "auth_verify_email_landing",
59612
+ "operationId": "auth_me",
59066
59613
  "tags": [
59067
59614
  "auth"
59068
59615
  ],
59069
- "summary": "Browser landing page that consumes the verification token",
59616
+ "summary": "Get the current user incl. roles and isAdmin (Bearer access JWT)",
59070
59617
  "responses": {
59071
59618
  "200": {
59072
- "description": "Binary response",
59619
+ "description": "JSON response",
59073
59620
  "content": {
59074
- "text/html": {
59621
+ "application/json": {
59075
59622
  "schema": {
59076
- "type": "string",
59077
- "format": "binary"
59623
+ "type": "object",
59624
+ "properties": {
59625
+ "success": {
59626
+ "type": "boolean"
59627
+ },
59628
+ "message": {
59629
+ "anyOf": [
59630
+ {
59631
+ "type": "string"
59632
+ },
59633
+ {
59634
+ "type": "null"
59635
+ }
59636
+ ]
59637
+ },
59638
+ "code": {
59639
+ "anyOf": [
59640
+ {
59641
+ "type": "string"
59642
+ },
59643
+ {
59644
+ "type": "null"
59645
+ }
59646
+ ]
59647
+ },
59648
+ "data": {
59649
+ "anyOf": [
59650
+ {},
59651
+ {
59652
+ "type": "null"
59653
+ }
59654
+ ]
59655
+ }
59656
+ },
59657
+ "required": [
59658
+ "success",
59659
+ "data"
59660
+ ],
59661
+ "additionalProperties": false
59078
59662
  }
59079
59663
  }
59080
59664
  }
59081
59665
  }
59082
59666
  },
59083
- "parameters": [
59667
+ "security": [
59084
59668
  {
59085
- "name": "token",
59086
- "in": "query",
59087
- "required": false,
59669
+ "frontendBearer": []
59670
+ }
59671
+ ],
59672
+ "x-transport": "http"
59673
+ }
59674
+ },
59675
+ "/auth/me/profile": {
59676
+ "patch": {
59677
+ "operationId": "auth_me_profile_update",
59678
+ "tags": [
59679
+ "auth"
59680
+ ],
59681
+ "summary": "Update the current user's own profile (name, avatar)",
59682
+ "responses": {
59683
+ "200": {
59684
+ "description": "JSON response",
59685
+ "content": {
59686
+ "application/json": {
59687
+ "schema": {
59688
+ "type": "object",
59689
+ "properties": {
59690
+ "success": {
59691
+ "type": "boolean"
59692
+ },
59693
+ "message": {
59694
+ "anyOf": [
59695
+ {
59696
+ "type": "string"
59697
+ },
59698
+ {
59699
+ "type": "null"
59700
+ }
59701
+ ]
59702
+ },
59703
+ "code": {
59704
+ "anyOf": [
59705
+ {
59706
+ "type": "string"
59707
+ },
59708
+ {
59709
+ "type": "null"
59710
+ }
59711
+ ]
59712
+ },
59713
+ "data": {
59714
+ "anyOf": [
59715
+ {},
59716
+ {
59717
+ "type": "null"
59718
+ }
59719
+ ]
59720
+ }
59721
+ },
59722
+ "required": [
59723
+ "success",
59724
+ "data"
59725
+ ],
59726
+ "additionalProperties": false
59727
+ }
59728
+ }
59729
+ }
59730
+ }
59731
+ },
59732
+ "requestBody": {
59733
+ "required": true,
59734
+ "content": {
59735
+ "application/json": {
59736
+ "schema": {
59737
+ "type": "object",
59738
+ "properties": {
59739
+ "avatarStyle": {
59740
+ "anyOf": [
59741
+ {
59742
+ "type": "object",
59743
+ "properties": {
59744
+ "seed": {
59745
+ "type": "string",
59746
+ "minLength": 1,
59747
+ "maxLength": 200
59748
+ },
59749
+ "hue": {
59750
+ "type": "integer",
59751
+ "minimum": 0,
59752
+ "maximum": 359
59753
+ },
59754
+ "shape": {
59755
+ "type": "string",
59756
+ "enum": [
59757
+ "round",
59758
+ "organic",
59759
+ "boxy",
59760
+ "nub",
59761
+ "cloud",
59762
+ "sun",
59763
+ "capsule",
59764
+ "triangle",
59765
+ "hexagon",
59766
+ "droplet"
59767
+ ]
59768
+ },
59769
+ "expression": {
59770
+ "type": "string",
59771
+ "enum": [
59772
+ "idle",
59773
+ "happy",
59774
+ "sad",
59775
+ "mad",
59776
+ "surprised",
59777
+ "wink",
59778
+ "sleepy",
59779
+ "smug",
59780
+ "unsure",
59781
+ "scared",
59782
+ "love",
59783
+ "shy",
59784
+ "sick",
59785
+ "thinking"
59786
+ ]
59787
+ },
59788
+ "background": {
59789
+ "type": "string",
59790
+ "enum": [
59791
+ "none",
59792
+ "squircle",
59793
+ "circle"
59794
+ ]
59795
+ }
59796
+ },
59797
+ "additionalProperties": false
59798
+ },
59799
+ {
59800
+ "type": "null"
59801
+ }
59802
+ ]
59803
+ },
59804
+ "name": {
59805
+ "anyOf": [
59806
+ {
59807
+ "type": "string",
59808
+ "minLength": 1,
59809
+ "maxLength": 200
59810
+ },
59811
+ {
59812
+ "type": "null"
59813
+ }
59814
+ ]
59815
+ },
59816
+ "firstName": {
59817
+ "anyOf": [
59818
+ {
59819
+ "type": "string",
59820
+ "minLength": 1,
59821
+ "maxLength": 100
59822
+ },
59823
+ {
59824
+ "type": "null"
59825
+ }
59826
+ ]
59827
+ },
59828
+ "lastName": {
59829
+ "anyOf": [
59830
+ {
59831
+ "type": "string",
59832
+ "minLength": 1,
59833
+ "maxLength": 100
59834
+ },
59835
+ {
59836
+ "type": "null"
59837
+ }
59838
+ ]
59839
+ }
59840
+ },
59841
+ "additionalProperties": false
59842
+ }
59843
+ }
59844
+ }
59845
+ },
59846
+ "security": [
59847
+ {
59848
+ "frontendBearer": []
59849
+ }
59850
+ ],
59851
+ "x-transport": "http"
59852
+ }
59853
+ },
59854
+ "/auth/push-token": {
59855
+ "post": {
59856
+ "operationId": "auth_push_token_upsert",
59857
+ "tags": [
59858
+ "auth"
59859
+ ],
59860
+ "summary": "Register a device push token for the current user",
59861
+ "responses": {
59862
+ "204": {
59863
+ "description": "JSON response",
59864
+ "content": {
59865
+ "application/json": {
59866
+ "schema": {
59867
+ "type": "object",
59868
+ "properties": {
59869
+ "success": {
59870
+ "type": "boolean"
59871
+ },
59872
+ "message": {
59873
+ "anyOf": [
59874
+ {
59875
+ "type": "string"
59876
+ },
59877
+ {
59878
+ "type": "null"
59879
+ }
59880
+ ]
59881
+ },
59882
+ "code": {
59883
+ "anyOf": [
59884
+ {
59885
+ "type": "string"
59886
+ },
59887
+ {
59888
+ "type": "null"
59889
+ }
59890
+ ]
59891
+ },
59892
+ "data": {
59893
+ "anyOf": [
59894
+ {
59895
+ "type": "object",
59896
+ "properties": {},
59897
+ "additionalProperties": false
59898
+ },
59899
+ {
59900
+ "type": "null"
59901
+ }
59902
+ ]
59903
+ }
59904
+ },
59905
+ "required": [
59906
+ "success",
59907
+ "data"
59908
+ ],
59909
+ "additionalProperties": false
59910
+ }
59911
+ }
59912
+ }
59913
+ }
59914
+ },
59915
+ "requestBody": {
59916
+ "required": true,
59917
+ "content": {
59918
+ "application/json": {
59919
+ "schema": {
59920
+ "type": "object",
59921
+ "properties": {
59922
+ "token": {
59923
+ "type": "string",
59924
+ "minLength": 1,
59925
+ "maxLength": 500
59926
+ },
59927
+ "platform": {
59928
+ "type": "string",
59929
+ "enum": [
59930
+ "ios",
59931
+ "android",
59932
+ "web",
59933
+ "expo"
59934
+ ]
59935
+ }
59936
+ },
59937
+ "required": [
59938
+ "token",
59939
+ "platform"
59940
+ ],
59941
+ "additionalProperties": false
59942
+ }
59943
+ }
59944
+ }
59945
+ },
59946
+ "security": [
59947
+ {
59948
+ "frontendBearer": []
59949
+ }
59950
+ ],
59951
+ "x-transport": "http"
59952
+ }
59953
+ },
59954
+ "/auth/verify-email/request": {
59955
+ "post": {
59956
+ "operationId": "auth_verify_email_request",
59957
+ "tags": [
59958
+ "auth"
59959
+ ],
59960
+ "summary": "Send a fresh email-verification link to the current user",
59961
+ "responses": {
59962
+ "200": {
59963
+ "description": "JSON response",
59964
+ "content": {
59965
+ "application/json": {
59966
+ "schema": {
59967
+ "type": "object",
59968
+ "properties": {
59969
+ "success": {
59970
+ "type": "boolean"
59971
+ },
59972
+ "message": {
59973
+ "anyOf": [
59974
+ {
59975
+ "type": "string"
59976
+ },
59977
+ {
59978
+ "type": "null"
59979
+ }
59980
+ ]
59981
+ },
59982
+ "code": {
59983
+ "anyOf": [
59984
+ {
59985
+ "type": "string"
59986
+ },
59987
+ {
59988
+ "type": "null"
59989
+ }
59990
+ ]
59991
+ },
59992
+ "data": {
59993
+ "anyOf": [
59994
+ {},
59995
+ {
59996
+ "type": "null"
59997
+ }
59998
+ ]
59999
+ }
60000
+ },
60001
+ "required": [
60002
+ "success",
60003
+ "data"
60004
+ ],
60005
+ "additionalProperties": false
60006
+ }
60007
+ }
60008
+ }
60009
+ }
60010
+ },
60011
+ "requestBody": {
60012
+ "required": true,
60013
+ "content": {
60014
+ "application/json": {
60015
+ "schema": {
60016
+ "type": "object",
60017
+ "properties": {},
60018
+ "additionalProperties": false
60019
+ }
60020
+ }
60021
+ }
60022
+ },
60023
+ "security": [
60024
+ {
60025
+ "frontendBearer": []
60026
+ }
60027
+ ],
60028
+ "x-transport": "http"
60029
+ }
60030
+ },
60031
+ "/auth/verify-email/confirm": {
60032
+ "post": {
60033
+ "operationId": "auth_verify_email_confirm",
60034
+ "tags": [
60035
+ "auth"
60036
+ ],
60037
+ "summary": "Confirm an email-verification token (programmatic / deep-link flow)",
60038
+ "responses": {
60039
+ "200": {
60040
+ "description": "JSON response",
60041
+ "content": {
60042
+ "application/json": {
60043
+ "schema": {
60044
+ "type": "object",
60045
+ "properties": {
60046
+ "success": {
60047
+ "type": "boolean"
60048
+ },
60049
+ "message": {
60050
+ "anyOf": [
60051
+ {
60052
+ "type": "string"
60053
+ },
60054
+ {
60055
+ "type": "null"
60056
+ }
60057
+ ]
60058
+ },
60059
+ "code": {
60060
+ "anyOf": [
60061
+ {
60062
+ "type": "string"
60063
+ },
60064
+ {
60065
+ "type": "null"
60066
+ }
60067
+ ]
60068
+ },
60069
+ "data": {
60070
+ "anyOf": [
60071
+ {},
60072
+ {
60073
+ "type": "null"
60074
+ }
60075
+ ]
60076
+ }
60077
+ },
60078
+ "required": [
60079
+ "success",
60080
+ "data"
60081
+ ],
60082
+ "additionalProperties": false
60083
+ }
60084
+ }
60085
+ }
60086
+ }
60087
+ },
60088
+ "requestBody": {
60089
+ "required": true,
60090
+ "content": {
60091
+ "application/json": {
60092
+ "schema": {
60093
+ "type": "object",
60094
+ "properties": {
60095
+ "token": {
60096
+ "type": "string",
60097
+ "minLength": 20,
60098
+ "maxLength": 500
60099
+ }
60100
+ },
60101
+ "required": [
60102
+ "token"
60103
+ ],
60104
+ "additionalProperties": false
60105
+ }
60106
+ }
60107
+ }
60108
+ }
60109
+ }
60110
+ },
60111
+ "/auth/verify-email": {
60112
+ "get": {
60113
+ "operationId": "auth_verify_email_landing",
60114
+ "tags": [
60115
+ "auth"
60116
+ ],
60117
+ "summary": "Browser landing page that consumes the verification token",
60118
+ "responses": {
60119
+ "200": {
60120
+ "description": "Binary response",
60121
+ "content": {
60122
+ "text/html": {
60123
+ "schema": {
60124
+ "type": "string",
60125
+ "format": "binary"
60126
+ }
60127
+ }
60128
+ }
60129
+ }
60130
+ },
60131
+ "parameters": [
60132
+ {
60133
+ "name": "token",
60134
+ "in": "query",
60135
+ "required": false,
60136
+ "schema": {
60137
+ "type": "string",
60138
+ "minLength": 1,
60139
+ "maxLength": 500
60140
+ }
60141
+ }
60142
+ ]
60143
+ }
60144
+ },
60145
+ "/auth/me/email": {
60146
+ "patch": {
60147
+ "operationId": "auth_me_email_patch",
60148
+ "tags": [
60149
+ "auth"
60150
+ ],
60151
+ "summary": "Change current user's email after password confirmation",
60152
+ "responses": {
60153
+ "200": {
60154
+ "description": "JSON response",
60155
+ "content": {
60156
+ "application/json": {
60157
+ "schema": {
60158
+ "type": "object",
60159
+ "properties": {
60160
+ "success": {
60161
+ "type": "boolean"
60162
+ },
60163
+ "message": {
60164
+ "anyOf": [
60165
+ {
60166
+ "type": "string"
60167
+ },
60168
+ {
60169
+ "type": "null"
60170
+ }
60171
+ ]
60172
+ },
60173
+ "code": {
60174
+ "anyOf": [
60175
+ {
60176
+ "type": "string"
60177
+ },
60178
+ {
60179
+ "type": "null"
60180
+ }
60181
+ ]
60182
+ },
60183
+ "data": {
60184
+ "anyOf": [
60185
+ {},
60186
+ {
60187
+ "type": "null"
60188
+ }
60189
+ ]
60190
+ }
60191
+ },
60192
+ "required": [
60193
+ "success",
60194
+ "data"
60195
+ ],
60196
+ "additionalProperties": false
60197
+ }
60198
+ }
60199
+ }
60200
+ }
60201
+ },
60202
+ "requestBody": {
60203
+ "required": true,
60204
+ "content": {
60205
+ "application/json": {
60206
+ "schema": {
60207
+ "type": "object",
60208
+ "properties": {
60209
+ "email": {
60210
+ "type": "string",
60211
+ "format": "email",
60212
+ "maxLength": 320
60213
+ },
60214
+ "password": {
60215
+ "type": "string",
60216
+ "minLength": 8,
60217
+ "maxLength": 256
60218
+ }
60219
+ },
60220
+ "required": [
60221
+ "email",
60222
+ "password"
60223
+ ],
60224
+ "additionalProperties": false
60225
+ }
60226
+ }
60227
+ }
60228
+ },
60229
+ "security": [
60230
+ {
60231
+ "frontendBearer": []
60232
+ }
60233
+ ],
60234
+ "x-transport": "http"
60235
+ }
60236
+ },
60237
+ "/auth/password/change": {
60238
+ "post": {
60239
+ "operationId": "auth_password_change",
60240
+ "tags": [
60241
+ "auth"
60242
+ ],
60243
+ "summary": "Change password for the current user",
60244
+ "responses": {
60245
+ "200": {
60246
+ "description": "JSON response",
60247
+ "content": {
60248
+ "application/json": {
60249
+ "schema": {
60250
+ "type": "object",
60251
+ "properties": {
60252
+ "success": {
60253
+ "type": "boolean"
60254
+ },
60255
+ "message": {
60256
+ "anyOf": [
60257
+ {
60258
+ "type": "string"
60259
+ },
60260
+ {
60261
+ "type": "null"
60262
+ }
60263
+ ]
60264
+ },
60265
+ "code": {
60266
+ "anyOf": [
60267
+ {
60268
+ "type": "string"
60269
+ },
60270
+ {
60271
+ "type": "null"
60272
+ }
60273
+ ]
60274
+ },
60275
+ "data": {
60276
+ "anyOf": [
60277
+ {},
60278
+ {
60279
+ "type": "null"
60280
+ }
60281
+ ]
60282
+ }
60283
+ },
60284
+ "required": [
60285
+ "success",
60286
+ "data"
60287
+ ],
60288
+ "additionalProperties": false
60289
+ }
60290
+ }
60291
+ }
60292
+ }
60293
+ },
60294
+ "requestBody": {
60295
+ "required": true,
60296
+ "content": {
60297
+ "application/json": {
60298
+ "schema": {
60299
+ "type": "object",
60300
+ "properties": {
60301
+ "currentPassword": {
60302
+ "type": "string",
60303
+ "minLength": 8,
60304
+ "maxLength": 256
60305
+ },
60306
+ "newPassword": {
60307
+ "type": "string",
60308
+ "minLength": 8,
60309
+ "maxLength": 256
60310
+ },
60311
+ "revokeOtherSessions": {
60312
+ "type": "boolean",
60313
+ "default": true
60314
+ },
60315
+ "refreshToken": {
60316
+ "type": "string",
60317
+ "minLength": 20
60318
+ }
60319
+ },
60320
+ "required": [
60321
+ "currentPassword",
60322
+ "newPassword"
60323
+ ],
60324
+ "additionalProperties": false
60325
+ }
60326
+ }
60327
+ }
60328
+ },
60329
+ "security": [
60330
+ {
60331
+ "frontendBearer": []
60332
+ }
60333
+ ],
60334
+ "x-transport": "http"
60335
+ }
60336
+ },
60337
+ "/auth/password/reset/request": {
60338
+ "post": {
60339
+ "operationId": "auth_password_reset_request",
60340
+ "tags": [
60341
+ "auth"
60342
+ ],
60343
+ "summary": "Request a password reset email",
60344
+ "responses": {
60345
+ "200": {
60346
+ "description": "JSON response",
60347
+ "content": {
60348
+ "application/json": {
60349
+ "schema": {
60350
+ "type": "object",
60351
+ "properties": {
60352
+ "success": {
60353
+ "type": "boolean"
60354
+ },
60355
+ "message": {
60356
+ "anyOf": [
60357
+ {
60358
+ "type": "string"
60359
+ },
60360
+ {
60361
+ "type": "null"
60362
+ }
60363
+ ]
60364
+ },
60365
+ "code": {
60366
+ "anyOf": [
60367
+ {
60368
+ "type": "string"
60369
+ },
60370
+ {
60371
+ "type": "null"
60372
+ }
60373
+ ]
60374
+ },
60375
+ "data": {
60376
+ "anyOf": [
60377
+ {},
60378
+ {
60379
+ "type": "null"
60380
+ }
60381
+ ]
60382
+ }
60383
+ },
60384
+ "required": [
60385
+ "success",
60386
+ "data"
60387
+ ],
60388
+ "additionalProperties": false
60389
+ }
60390
+ }
60391
+ }
60392
+ }
60393
+ },
60394
+ "requestBody": {
60395
+ "required": true,
60396
+ "content": {
60397
+ "application/json": {
60398
+ "schema": {
60399
+ "type": "object",
60400
+ "properties": {
60401
+ "email": {
60402
+ "type": "string",
60403
+ "format": "email",
60404
+ "maxLength": 320
60405
+ }
60406
+ },
60407
+ "required": [
60408
+ "email"
60409
+ ],
60410
+ "additionalProperties": false
60411
+ }
60412
+ }
60413
+ }
60414
+ }
60415
+ }
60416
+ },
60417
+ "/auth/password/reset/confirm": {
60418
+ "post": {
60419
+ "operationId": "auth_password_reset_confirm",
60420
+ "tags": [
60421
+ "auth"
60422
+ ],
60423
+ "summary": "Reset password with an email token",
60424
+ "responses": {
60425
+ "200": {
60426
+ "description": "JSON response",
60427
+ "content": {
60428
+ "application/json": {
60429
+ "schema": {
60430
+ "type": "object",
60431
+ "properties": {
60432
+ "success": {
60433
+ "type": "boolean"
60434
+ },
60435
+ "message": {
60436
+ "anyOf": [
60437
+ {
60438
+ "type": "string"
60439
+ },
60440
+ {
60441
+ "type": "null"
60442
+ }
60443
+ ]
60444
+ },
60445
+ "code": {
60446
+ "anyOf": [
60447
+ {
60448
+ "type": "string"
60449
+ },
60450
+ {
60451
+ "type": "null"
60452
+ }
60453
+ ]
60454
+ },
60455
+ "data": {
60456
+ "anyOf": [
60457
+ {},
60458
+ {
60459
+ "type": "null"
60460
+ }
60461
+ ]
60462
+ }
60463
+ },
60464
+ "required": [
60465
+ "success",
60466
+ "data"
60467
+ ],
60468
+ "additionalProperties": false
60469
+ }
60470
+ }
60471
+ }
60472
+ }
60473
+ },
60474
+ "requestBody": {
60475
+ "required": true,
60476
+ "content": {
60477
+ "application/json": {
60478
+ "schema": {
60479
+ "type": "object",
60480
+ "properties": {
60481
+ "token": {
60482
+ "type": "string",
60483
+ "minLength": 20,
60484
+ "maxLength": 500
60485
+ },
60486
+ "newPassword": {
60487
+ "type": "string",
60488
+ "minLength": 8,
60489
+ "maxLength": 256
60490
+ }
60491
+ },
60492
+ "required": [
60493
+ "token",
60494
+ "newPassword"
60495
+ ],
60496
+ "additionalProperties": false
60497
+ }
60498
+ }
60499
+ }
60500
+ }
60501
+ }
60502
+ },
60503
+ "/auth/password/reset": {
60504
+ "get": {
60505
+ "operationId": "auth_password_reset_landing",
60506
+ "tags": [
60507
+ "auth"
60508
+ ],
60509
+ "summary": "Browser landing page for password reset links",
60510
+ "responses": {
60511
+ "200": {
60512
+ "description": "Binary response",
60513
+ "content": {
60514
+ "text/html": {
60515
+ "schema": {
60516
+ "type": "string",
60517
+ "format": "binary"
60518
+ }
60519
+ }
60520
+ }
60521
+ }
60522
+ },
60523
+ "parameters": [
60524
+ {
60525
+ "name": "token",
60526
+ "in": "query",
60527
+ "required": false,
59088
60528
  "schema": {
59089
60529
  "type": "string",
59090
60530
  "minLength": 1,
@@ -59094,6 +60534,232 @@
59094
60534
  ]
59095
60535
  }
59096
60536
  },
60537
+ "/auth/sessions": {
60538
+ "get": {
60539
+ "operationId": "auth_sessions_list",
60540
+ "tags": [
60541
+ "auth"
60542
+ ],
60543
+ "summary": "List active refresh-token sessions for the current user",
60544
+ "responses": {
60545
+ "200": {
60546
+ "description": "JSON response",
60547
+ "content": {
60548
+ "application/json": {
60549
+ "schema": {
60550
+ "type": "object",
60551
+ "properties": {
60552
+ "success": {
60553
+ "type": "boolean"
60554
+ },
60555
+ "message": {
60556
+ "anyOf": [
60557
+ {
60558
+ "type": "string"
60559
+ },
60560
+ {
60561
+ "type": "null"
60562
+ }
60563
+ ]
60564
+ },
60565
+ "code": {
60566
+ "anyOf": [
60567
+ {
60568
+ "type": "string"
60569
+ },
60570
+ {
60571
+ "type": "null"
60572
+ }
60573
+ ]
60574
+ },
60575
+ "data": {
60576
+ "anyOf": [
60577
+ {},
60578
+ {
60579
+ "type": "null"
60580
+ }
60581
+ ]
60582
+ }
60583
+ },
60584
+ "required": [
60585
+ "success",
60586
+ "data"
60587
+ ],
60588
+ "additionalProperties": false
60589
+ }
60590
+ }
60591
+ }
60592
+ }
60593
+ },
60594
+ "security": [
60595
+ {
60596
+ "frontendBearer": []
60597
+ }
60598
+ ],
60599
+ "x-transport": "http"
60600
+ }
60601
+ },
60602
+ "/auth/sessions/:sessionId": {
60603
+ "delete": {
60604
+ "operationId": "auth_sessions_revoke",
60605
+ "tags": [
60606
+ "auth"
60607
+ ],
60608
+ "summary": "Revoke one active session",
60609
+ "responses": {
60610
+ "200": {
60611
+ "description": "JSON response",
60612
+ "content": {
60613
+ "application/json": {
60614
+ "schema": {
60615
+ "type": "object",
60616
+ "properties": {
60617
+ "success": {
60618
+ "type": "boolean"
60619
+ },
60620
+ "message": {
60621
+ "anyOf": [
60622
+ {
60623
+ "type": "string"
60624
+ },
60625
+ {
60626
+ "type": "null"
60627
+ }
60628
+ ]
60629
+ },
60630
+ "code": {
60631
+ "anyOf": [
60632
+ {
60633
+ "type": "string"
60634
+ },
60635
+ {
60636
+ "type": "null"
60637
+ }
60638
+ ]
60639
+ },
60640
+ "data": {
60641
+ "anyOf": [
60642
+ {},
60643
+ {
60644
+ "type": "null"
60645
+ }
60646
+ ]
60647
+ }
60648
+ },
60649
+ "required": [
60650
+ "success",
60651
+ "data"
60652
+ ],
60653
+ "additionalProperties": false
60654
+ }
60655
+ }
60656
+ }
60657
+ }
60658
+ },
60659
+ "parameters": [
60660
+ {
60661
+ "name": "sessionId",
60662
+ "in": "path",
60663
+ "required": true,
60664
+ "schema": {
60665
+ "type": "integer",
60666
+ "exclusiveMinimum": 0
60667
+ }
60668
+ }
60669
+ ],
60670
+ "security": [
60671
+ {
60672
+ "frontendBearer": []
60673
+ }
60674
+ ],
60675
+ "x-transport": "http"
60676
+ }
60677
+ },
60678
+ "/auth/sessions/revoke-other": {
60679
+ "post": {
60680
+ "operationId": "auth_sessions_revoke_other",
60681
+ "tags": [
60682
+ "auth"
60683
+ ],
60684
+ "summary": "Revoke all sessions except the supplied current refresh token",
60685
+ "responses": {
60686
+ "200": {
60687
+ "description": "JSON response",
60688
+ "content": {
60689
+ "application/json": {
60690
+ "schema": {
60691
+ "type": "object",
60692
+ "properties": {
60693
+ "success": {
60694
+ "type": "boolean"
60695
+ },
60696
+ "message": {
60697
+ "anyOf": [
60698
+ {
60699
+ "type": "string"
60700
+ },
60701
+ {
60702
+ "type": "null"
60703
+ }
60704
+ ]
60705
+ },
60706
+ "code": {
60707
+ "anyOf": [
60708
+ {
60709
+ "type": "string"
60710
+ },
60711
+ {
60712
+ "type": "null"
60713
+ }
60714
+ ]
60715
+ },
60716
+ "data": {
60717
+ "anyOf": [
60718
+ {},
60719
+ {
60720
+ "type": "null"
60721
+ }
60722
+ ]
60723
+ }
60724
+ },
60725
+ "required": [
60726
+ "success",
60727
+ "data"
60728
+ ],
60729
+ "additionalProperties": false
60730
+ }
60731
+ }
60732
+ }
60733
+ }
60734
+ },
60735
+ "requestBody": {
60736
+ "required": true,
60737
+ "content": {
60738
+ "application/json": {
60739
+ "schema": {
60740
+ "type": "object",
60741
+ "properties": {
60742
+ "refreshToken": {
60743
+ "type": "string",
60744
+ "minLength": 20
60745
+ }
60746
+ },
60747
+ "required": [
60748
+ "refreshToken"
60749
+ ],
60750
+ "additionalProperties": false
60751
+ }
60752
+ }
60753
+ }
60754
+ },
60755
+ "security": [
60756
+ {
60757
+ "frontendBearer": []
60758
+ }
60759
+ ],
60760
+ "x-transport": "http"
60761
+ }
60762
+ },
59097
60763
  "/internal/users/provision": {
59098
60764
  "post": {
59099
60765
  "operationId": "internal_users_provision",