{"openapi":"3.0.0","paths":{"/":{"get":{"operationId":"AppController_getHello","parameters":[],"responses":{"200":{"description":""}},"summary":"Service landing page","tags":["Service"]}},"/payment-intents":{"post":{"operationId":"PaymentIntentController_create","parameters":[{"name":"x-internal-api-key","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePaymentIntentDto"}}}},"responses":{"201":{"description":"PaymentIntent created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentIntentResponseDto"}}}},"400":{"description":"Invalid input data"}},"summary":"Create a new paymentIntent","tags":["PaymentIntents"]},"get":{"operationId":"PaymentIntentController_findAll","parameters":[{"name":"page","required":false,"in":"query","description":"Page number","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Items per page","schema":{"minimum":1,"maximum":100,"default":10,"type":"number"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"default":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"DESC","type":"string","enum":["ASC","DESC"]}},{"name":"x-internal-api-key","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"List of paymentIntents","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponseDto"}}}}},"summary":"Get all paymentIntents with pagination","tags":["PaymentIntents"]}},"/payment-intents/{id}":{"get":{"operationId":"PaymentIntentController_findOne","parameters":[{"name":"id","required":true,"in":"path","description":"PaymentIntent ID","schema":{"format":"uuid","type":"string"}},{"name":"x-internal-api-key","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"PaymentIntent found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentIntentResponseDto"}}}},"404":{"description":"PaymentIntent not found"}},"summary":"Get paymentIntent by ID","tags":["PaymentIntents"]},"put":{"operationId":"PaymentIntentController_update","parameters":[{"name":"id","required":true,"in":"path","description":"PaymentIntent ID","schema":{"format":"uuid","type":"string"}},{"name":"x-internal-api-key","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePaymentIntentDto"}}}},"responses":{"200":{"description":"PaymentIntent updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentIntentResponseDto"}}}},"404":{"description":"PaymentIntent not found"}},"summary":"Update paymentIntent","tags":["PaymentIntents"]}},"/webhook-inboxes":{"post":{"operationId":"WebhookInboxController_create","parameters":[{"name":"x-joonapay-signature","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookInboxDto"}}}},"responses":{"201":{"description":"WebhookInbox created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookInboxResponseDto"}}}},"400":{"description":"Invalid input data"}},"summary":"Create a new webhookInbox","tags":["WebhookInboxes"]},"get":{"operationId":"WebhookInboxController_findAll","parameters":[{"name":"page","required":false,"in":"query","description":"Page number","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Items per page","schema":{"minimum":1,"maximum":100,"default":10,"type":"number"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"default":"createdAt","type":"string"}},{"name":"sortOrder","required":false,"in":"query","description":"Sort order","schema":{"default":"DESC","type":"string","enum":["ASC","DESC"]}},{"name":"x-internal-api-key","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"List of webhookInboxes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponseDto"}}}}},"summary":"Get all webhookInboxes with pagination","tags":["WebhookInboxes"]}},"/webhook-inboxes/{id}":{"get":{"operationId":"WebhookInboxController_findOne","parameters":[{"name":"id","required":true,"in":"path","description":"WebhookInbox ID","schema":{"format":"uuid","type":"string"}},{"name":"x-internal-api-key","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"WebhookInbox found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookInboxResponseDto"}}}},"404":{"description":"WebhookInbox not found"}},"summary":"Get webhookInbox by ID","tags":["WebhookInboxes"]},"put":{"operationId":"WebhookInboxController_update","parameters":[{"name":"id","required":true,"in":"path","description":"WebhookInbox ID","schema":{"format":"uuid","type":"string"}},{"name":"x-internal-api-key","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWebhookInboxDto"}}}},"responses":{"200":{"description":"WebhookInbox updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookInboxResponseDto"}}}},"404":{"description":"WebhookInbox not found"}},"summary":"Update webhookInbox","tags":["WebhookInboxes"]}},"/health":{"get":{"operationId":"HealthController_check","parameters":[],"responses":{"200":{"description":"The Health Check is successful","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"ok"},"info":{"type":"object","example":{"database":{"status":"up"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"error":{"type":"object","example":{},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"details":{"type":"object","example":{"database":{"status":"up"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true}}}}}}},"503":{"description":"The Health Check is not successful","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"error"},"info":{"type":"object","example":{"database":{"status":"up"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"error":{"type":"object","example":{"redis":{"status":"down","message":"Could not connect"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"details":{"type":"object","example":{"database":{"status":"up"},"redis":{"status":"down","message":"Could not connect"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true}}}}}}}},"summary":"Basic health check","tags":["Health"]}},"/health/ready":{"get":{"operationId":"HealthController_readiness","parameters":[],"responses":{"200":{"description":"The Health Check is successful","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"ok"},"info":{"type":"object","example":{"database":{"status":"up"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"error":{"type":"object","example":{},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"details":{"type":"object","example":{"database":{"status":"up"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true}}}}}}},"503":{"description":"The Health Check is not successful","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"error"},"info":{"type":"object","example":{"database":{"status":"up"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"error":{"type":"object","example":{"redis":{"status":"down","message":"Could not connect"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"details":{"type":"object","example":{"database":{"status":"up"},"redis":{"status":"down","message":"Could not connect"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true}}}}}}}},"summary":"Readiness check - is the service ready to receive traffic?","tags":["Health"]}},"/health/live":{"get":{"operationId":"HealthController_liveness","parameters":[],"responses":{"200":{"description":"The Health Check is successful","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"ok"},"info":{"type":"object","example":{"database":{"status":"up"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"error":{"type":"object","example":{},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"details":{"type":"object","example":{"database":{"status":"up"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true}}}}}}},"503":{"description":"The Health Check is not successful","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"error"},"info":{"type":"object","example":{"database":{"status":"up"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"error":{"type":"object","example":{"redis":{"status":"down","message":"Could not connect"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"details":{"type":"object","example":{"database":{"status":"up"},"redis":{"status":"down","message":"Could not connect"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true}}}}}}}},"summary":"Liveness check - is the service alive?","tags":["Health"]}}},"info":{"title":"Finance API","description":"Payment intents and signed webhook inbox. Settlement stays fail-closed without JoonaPay. Owns: PaymentIntents, WebhookInboxes.","version":"1.0","contact":{}},"tags":[],"servers":[{"url":"https://finance.stormbyva.com"}],"components":{"securitySchemes":{"x-internal-api-key":{"type":"apiKey","in":"header","name":"x-internal-api-key","description":"Service-to-service key"}},"schemas":{"CreatePaymentIntentDto":{"type":"object","properties":{"appointmentId":{"type":"string","description":"The appointment id of the entity","example":"550e8400-e29b-41d4-a716-446655440000"},"amountMinor":{"type":"number","description":"The amount minor of the entity","example":"99.99"},"currency":{"type":"string","description":"The currency of the entity","example":"Sample text"},"state":{"type":"string","description":"The state of the entity"}},"required":["appointmentId","amountMinor","currency","state"]},"PaymentIntentResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier","format":"uuid"},"appointmentId":{"type":"string","description":"The appointment id of the entity","example":"550e8400-e29b-41d4-a716-446655440000"},"amountMinor":{"type":"number","description":"The amount minor of the entity","example":"99.99"},"currency":{"type":"string","description":"The currency of the entity","example":"Sample text"},"state":{"type":"string","description":"The state of the entity"},"isActive":{"type":"boolean","description":"Whether the record is active"},"createdAt":{"format":"date-time","type":"string","description":"Creation timestamp"},"updatedAt":{"format":"date-time","type":"string","description":"Last update timestamp"}},"required":["id","appointmentId","amountMinor","currency","state","isActive","createdAt","updatedAt"]},"PaginationMeta":{"type":"object","properties":{"total":{"type":"number","description":"Total number of items"},"page":{"type":"number","description":"Current page number"},"limit":{"type":"number","description":"Number of items per page"},"totalPages":{"type":"number","description":"Total number of pages"},"hasNextPage":{"type":"boolean","description":"Whether there is a next page"},"hasPreviousPage":{"type":"boolean","description":"Whether there is a previous page"}},"required":["total","page","limit","totalPages","hasNextPage","hasPreviousPage"]},"PaginatedResponseDto":{"type":"object","properties":{"items":{"description":"Array of items","type":"array","items":{"type":"array"}},"meta":{"description":"Pagination metadata","allOf":[{"$ref":"#/components/schemas/PaginationMeta"}]}},"required":["items","meta"]},"UpdatePaymentIntentDto":{"type":"object","properties":{"appointmentId":{"type":"string","description":"The appointment id of the entity","example":"550e8400-e29b-41d4-a716-446655440000"},"amountMinor":{"type":"number","description":"The amount minor of the entity","example":"99.99"},"currency":{"type":"string","description":"The currency of the entity","example":"Sample text"},"state":{"type":"string","description":"The state of the entity"},"isActive":{"type":"boolean","description":"Whether the record is active"}}},"CreateWebhookInboxDto":{"type":"object","properties":{"provider":{"type":"string","description":"The provider of the entity","example":"Sample text"},"providerEventId":{"type":"string","description":"The provider event id of the entity","example":"Sample text"},"paymentIntentId":{"type":"string","description":"The payment intent id of the entity","example":"550e8400-e29b-41d4-a716-446655440000"},"payload":{"type":"object","description":"The payload of the entity"},"status":{"type":"string","description":"The status of the entity"}},"required":["provider","providerEventId","paymentIntentId","payload","status"]},"WebhookInboxResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier","format":"uuid"},"provider":{"type":"string","description":"The provider of the entity","example":"Sample text"},"providerEventId":{"type":"string","description":"The provider event id of the entity","example":"Sample text"},"paymentIntentId":{"type":"string","description":"The payment intent id of the entity","example":"550e8400-e29b-41d4-a716-446655440000"},"payload":{"type":"object","description":"The payload of the entity"},"status":{"type":"string","description":"The status of the entity"},"isActive":{"type":"boolean","description":"Whether the record is active"},"createdAt":{"format":"date-time","type":"string","description":"Creation timestamp"},"updatedAt":{"format":"date-time","type":"string","description":"Last update timestamp"}},"required":["id","provider","providerEventId","paymentIntentId","payload","status","isActive","createdAt","updatedAt"]},"UpdateWebhookInboxDto":{"type":"object","properties":{"provider":{"type":"string","description":"The provider of the entity","example":"Sample text"},"providerEventId":{"type":"string","description":"The provider event id of the entity","example":"Sample text"},"paymentIntentId":{"type":"string","description":"The payment intent id of the entity","example":"550e8400-e29b-41d4-a716-446655440000"},"payload":{"type":"object","description":"The payload of the entity"},"status":{"type":"string","description":"The status of the entity"},"isActive":{"type":"boolean","description":"Whether the record is active"}}}}}}