{"openapi":"3.1.0","paths":{"/auth/login":{"post":{"operationId":"AuthController_login","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginDto"}}}},"responses":{"201":{"description":""}},"tags":["Auth"]}},"/auth/google":{"get":{"operationId":"AuthController_googleAuth","parameters":[],"responses":{"200":{"description":""}},"tags":["Auth"]}},"/auth/google/callback":{"get":{"operationId":"AuthController_googleCallback","parameters":[],"responses":{"200":{"description":""}},"tags":["Auth"]}},"/health":{"get":{"operationId":"HealthController_check","parameters":[],"responses":{"200":{"description":"Service is healthy"}},"summary":"Health check endpoint","tags":["health"]}},"/health/ready":{"get":{"operationId":"HealthController_ready","parameters":[],"responses":{"200":{"description":"Service is ready"}},"summary":"Readiness check endpoint","tags":["health"]}},"/flows":{"post":{"operationId":"FlowsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFlowDto"}}}},"responses":{"201":{"description":"Flow created"}},"security":[{"api-key":[]}],"summary":"Create a new flow","tags":["flows"]},"get":{"operationId":"FlowsController_findAll","parameters":[],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"List all flows","tags":["flows"]}},"/flows/presence":{"get":{"operationId":"FlowsController_getPresence","parameters":[],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"List users currently editing each flow","tags":["flows"]},"post":{"operationId":"FlowsController_heartbeat","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PresenceHeartbeatDto"}}}},"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Heartbeat: this user is editing a flow","tags":["flows"]}},"/flows/{id}":{"get":{"operationId":"FlowsController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Get a flow by ID","tags":["flows"]},"put":{"operationId":"FlowsController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Update flow metadata","tags":["flows"]},"delete":{"operationId":"FlowsController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"api-key":[]}],"summary":"Delete a flow","tags":["flows"]}},"/flows/{id}/graph":{"put":{"operationId":"FlowsController_updateGraph","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateFlowGraphDto"}}}},"responses":{"200":{"description":"Graph updated"},"409":{"description":"Conflict — the flow was modified by another user since it was loaded"}},"security":[{"api-key":[]}],"summary":"Update flow graph (nodes and edges)","tags":["flows"]}},"/flows/{id}/publish":{"post":{"operationId":"FlowsController_publish","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":"Version published"},"400":{"description":"The graph does not pass validation"},"409":{"description":"The graph has not changed since the last published version"}},"security":[{"api-key":[]}],"summary":"Freeze the current graph as an immutable published version (does not deploy)","tags":["flows"]}},"/flows/{id}/versions":{"get":{"operationId":"FlowsController_getVersions","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"List published versions of a flow, newest first (graph omitted)","tags":["flows"]}},"/flows/{id}/versions/{version}":{"get":{"operationId":"FlowsController_getVersion","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"version","required":true,"in":"path","schema":{"type":"integer"}}],"responses":{"404":{"description":"No such published version for this flow"}},"security":[{"api-key":[]}],"summary":"Get one published version of a flow, graph included","tags":["flows"]}},"/flows/{id}/preview":{"get":{"operationId":"FlowsController_preview","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Preview GCP resources that would be provisioned for this flow","tags":["flows"]}},"/flows/{id}/validate":{"get":{"operationId":"FlowsController_validate","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Validation result"}},"security":[{"api-key":[]}],"summary":"Validate flow graph before deploying","tags":["flows"]}},"/collaboration/presence":{"get":{"operationId":"CollaborationController_getPresence","parameters":[],"responses":{"200":{"description":"Active collaboration presence by flow"}},"security":[{"api-key":[]}],"summary":"List users currently editing each flow","tags":["collaboration"]},"post":{"operationId":"CollaborationController_heartbeat","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PresenceHeartbeatDto"}}}},"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Heartbeat: this user is editing a flow","tags":["collaboration"]}},"/secrets":{"get":{"operationId":"SecretsController_findAll","parameters":[],"responses":{"200":{"description":"List of secret references"}},"security":[{"api-key":[]}],"summary":"List registered secret references","tags":["secrets"]},"post":{"operationId":"SecretsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSecretDto"}}}},"responses":{"201":{"description":"Secret reference created"},"400":{"description":"GCP secret does not exist"},"409":{"description":"Name already exists"}},"security":[{"api-key":[]}],"summary":"Register a reference to an existing GCP Secret Manager secret","tags":["secrets"]}},"/secrets/value":{"post":{"operationId":"SecretsController_createValue","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSecretValueDto"}}}},"responses":{"201":{"description":"Secret created"},"409":{"description":"Name already exists"}},"security":[{"api-key":[]}],"summary":"Create a brand-new secret in GCP Secret Manager and register it","tags":["secrets"]}},"/secrets/{id}/rotate":{"post":{"operationId":"SecretsController_rotate","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Secret rotated"},"404":{"description":"Not found"}},"security":[{"api-key":[]}],"summary":"Rotate a secret — generates and stores a new version in GCP Secret Manager","tags":["secrets"]}},"/secrets/{id}":{"delete":{"operationId":"SecretsController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":"Deleted"}},"security":[{"api-key":[]}],"summary":"Remove a secret reference (does not delete the underlying GCP secret)","tags":["secrets"]}},"/topics":{"post":{"operationId":"TopicsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTopicDto"}}}},"responses":{"201":{"description":"Topic defined"}},"security":[{"api-key":[]}],"summary":"Define a new Pub/Sub topic","tags":["topics"]},"get":{"operationId":"TopicsController_findAll","parameters":[],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"List all topic definitions","tags":["topics"]}},"/topics/{id}":{"get":{"operationId":"TopicsController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Get a topic definition","tags":["topics"]},"put":{"operationId":"TopicsController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTopicDto"}}}},"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Update a topic definition","tags":["topics"]},"delete":{"operationId":"TopicsController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"api-key":[]}],"summary":"Delete a topic definition","tags":["topics"]}},"/adapters":{"post":{"operationId":"AdaptersController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAdapterDto"}}}},"responses":{"201":{"description":"Adapter registered"}},"security":[{"api-key":[]}],"summary":"Register a new adapter","tags":["adapters"]},"get":{"operationId":"AdaptersController_findAll","parameters":[],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"List all adapters","tags":["adapters"]}},"/adapters/{id}":{"get":{"operationId":"AdaptersController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Get adapter by ID","tags":["adapters"]},"put":{"operationId":"AdaptersController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Update adapter configuration","tags":["adapters"]},"delete":{"operationId":"AdaptersController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"api-key":[]}],"summary":"Delete an adapter","tags":["adapters"]}},"/adapters/{id}/probe":{"post":{"operationId":"AdaptersController_probe","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProbeResultDto"}}}}},"security":[{"api-key":[]}],"summary":"Probe adapter health endpoint","tags":["adapters"]}},"/connectors":{"post":{"operationId":"ConnectorsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateConnectorDto"}}}},"responses":{"201":{"description":"Connector created"}},"security":[{"api-key":[]}],"summary":"Create a new connector","tags":["connectors"]},"get":{"operationId":"ConnectorsController_findAll","parameters":[],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"List all connectors","tags":["connectors"]}},"/connectors/{id}":{"get":{"operationId":"ConnectorsController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"404":{"description":"Not found"}},"security":[{"api-key":[]}],"summary":"Get a connector by ID","tags":["connectors"]},"put":{"operationId":"ConnectorsController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateConnectorDto"}}}},"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Update a connector","tags":["connectors"]},"delete":{"operationId":"ConnectorsController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"api-key":[]}],"summary":"Delete a connector","tags":["connectors"]}},"/api-registry":{"post":{"operationId":"ApiRegistryController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiDefinitionDto"}}}},"responses":{"201":{"description":"API definition created"},"409":{"description":"Name already exists"}},"security":[{"api-key":[]}],"summary":"Register a new external API definition","tags":["api-registry"]},"get":{"operationId":"ApiRegistryController_findAll","parameters":[{"name":"organization","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"List of API definitions"}},"security":[{"api-key":[]}],"summary":"List all API definitions","tags":["api-registry"]}},"/api-registry/test-connection":{"post":{"description":"Useful while creating or editing an API before save. Credentials in the body are used only for this call.","operationId":"ApiRegistryController_testConnectionDraft","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestConnectionDraftDto"}}}},"responses":{"200":{"description":"Result of the call (status/ok/data/error/latencyMs)"}},"security":[{"api-key":[]}],"summary":"Test a connection with unsaved form values (does not persist)","tags":["api-registry"]}},"/api-registry/{id}":{"get":{"operationId":"ApiRegistryController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"API definition found"},"404":{"description":"Not found"}},"security":[{"api-key":[]}],"summary":"Get a single API definition","tags":["api-registry"]},"put":{"operationId":"ApiRegistryController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateApiDefinitionDto"}}}},"responses":{"200":{"description":"API definition updated"}},"security":[{"api-key":[]}],"summary":"Update an API definition","tags":["api-registry"]},"delete":{"operationId":"ApiRegistryController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":"Deleted"},"409":{"description":"La API está referenciada por uno o más connectors (se listan en `connectors`)"}},"security":[{"api-key":[]}],"summary":"Delete an API definition","tags":["api-registry"]}},"/api-registry/{id}/test-connection":{"post":{"operationId":"ApiRegistryController_testConnection","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestConnectionDto"}}}},"responses":{"200":{"description":"Result of the call (status/ok/data/error) — check `ok`, the HTTP status alone does not indicate whether the underlying call succeeded"},"404":{"description":"Not found"}},"security":[{"api-key":[]}],"summary":"Perform a real call against this API using its stored credential","tags":["api-registry"]}},"/http-executor/execute-with-cert":{"post":{"operationId":"HttpExecutorController_executeWithCert","parameters":[],"responses":{"200":{"description":"Cloud-Workflows-shaped response: { code, body, headers }"},"502":{"description":"The target could not be reached (network/TLS failure)"}},"security":[{"oidc":[]}],"summary":"mTLS client-cert HTTP call, resolving all header/cert secrets server-side","tags":["http-executor"]}},"/api-definitions/{apiDefinitionId}/bindings":{"get":{"operationId":"EnvironmentBindingsController_findByApiDefinition","parameters":[{"name":"apiDefinitionId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"List of bindings by environment"}},"security":[{"api-key":[]}],"summary":"List environment bindings for an API definition","tags":["environment-bindings"]}},"/api-definitions/{apiDefinitionId}/bindings/{env}":{"put":{"operationId":"EnvironmentBindingsController_upsert","parameters":[{"name":"apiDefinitionId","required":true,"in":"path","schema":{"type":"string"}},{"name":"env","required":true,"in":"path","schema":{"enum":["dev","qa","prod"],"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertBindingDto"}}}},"responses":{"200":{"description":"Binding upserted"},"404":{"description":"API definition not found"}},"security":[{"api-key":[]}],"summary":"Create or update an environment binding for an API definition","tags":["environment-bindings"]}},"/api-definitions/{apiDefinitionId}/bindings/{env}/rotate":{"post":{"operationId":"EnvironmentBindingsController_rotate","parameters":[{"name":"apiDefinitionId","required":true,"in":"path","schema":{"type":"string"}},{"name":"env","required":true,"in":"path","schema":{"enum":["dev","qa","prod"],"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RotateBindingSecretDto"}}}},"responses":{"200":{"description":"Secret rotated"},"404":{"description":"API definition not found"}},"security":[{"api-key":[]}],"summary":"Rotate the secret value for this binding (writes to Secret Manager)","tags":["environment-bindings"]}},"/flows/{flowId}/bindings-status":{"get":{"operationId":"EnvironmentBindingsController_getFlowBindingsStatus","parameters":[{"name":"flowId","required":true,"in":"path","schema":{"type":"string"}},{"name":"env","required":false,"in":"query","description":"Target environment (defaults to CSB_ENV)","schema":{"type":"string"}}],"responses":{"200":{"description":"Binding status per logicalKey"},"404":{"description":"Flow not found"}},"security":[{"api-key":[]}],"summary":"Check binding status for all credentials used in a flow","tags":["environment-bindings"]}},"/schemas":{"post":{"operationId":"SchemasController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSchemaDto"}}}},"responses":{"201":{"description":"Schema version created"}},"security":[{"api-key":[]}],"summary":"Register a new schema version","tags":["schemas"]},"get":{"operationId":"SchemasController_findByTopic","parameters":[{"name":"topicId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"List schemas for a topic","tags":["schemas"]}},"/schemas/{id}":{"get":{"operationId":"SchemasController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Get schema version by ID","tags":["schemas"]},"delete":{"operationId":"SchemasController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"api-key":[]}],"summary":"Delete a schema version","tags":["schemas"]}},"/schemas/{id}/activate":{"put":{"operationId":"SchemasController_setActive","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Activate a schema version (deactivates others)","tags":["schemas"]}},"/monitoring/pubsub":{"get":{"operationId":"MonitoringController_getPubSubMetrics","parameters":[{"name":"topicName","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Pub/Sub metrics"}},"security":[{"api-key":[]}],"summary":"Get Pub/Sub metrics (topics and subscriptions)","tags":["monitoring"]}},"/monitoring/tasks":{"get":{"operationId":"MonitoringController_getTasksMetrics","parameters":[{"name":"queueName","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Cloud Tasks metrics"}},"security":[{"api-key":[]}],"summary":"Get Cloud Tasks queue metrics","tags":["monitoring"]}},"/monitoring/dlq":{"get":{"operationId":"MonitoringController_getLatestDlqMessages","parameters":[{"name":"limit","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Peek the latest DLQ messages across all DLQ-enabled topics","tags":["monitoring"]}},"/monitoring/dlq/{topicName}":{"get":{"operationId":"MonitoringController_getDlqMessages","parameters":[{"name":"topicName","required":true,"in":"path","schema":{"type":"string"}},{"name":"maxMessages","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"DLQ messages"}},"security":[{"api-key":[]}],"summary":"Peek DLQ messages without acknowledging","tags":["monitoring"]}},"/monitoring/dlq/replay":{"post":{"operationId":"MonitoringController_replayDlqMessage","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplayMessageDto"}}}},"responses":{"200":{"description":"Message replayed"}},"security":[{"api-key":[]}],"summary":"Replay a DLQ message back to original topic","tags":["monitoring"]}},"/monitoring/workflows/executions":{"get":{"operationId":"MonitoringController_getWorkflowExecutions","parameters":[{"name":"workflowName","required":false,"in":"query","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Get workflow execution history","tags":["monitoring"]}},"/monitoring/workflows/{name}/sync":{"post":{"operationId":"MonitoringController_syncExecutions","parameters":[{"name":"name","required":true,"in":"path","description":"GCP Workflow name","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"Sync workflow executions from GCP to DB","tags":["monitoring"]}},"/monitoring/flows/{id}/live":{"get":{"operationId":"MonitoringController_getFlowLiveMetrics","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Combined live metrics for the flow"}},"security":[{"api-key":[]}],"summary":"Get live metrics for a specific flow","tags":["monitoring"]}},"/monitoring/flow-memory":{"get":{"operationId":"MonitoringController_getFlowMemoryStats","parameters":[],"responses":{"200":{"description":"{ totalRows, liveRows, expiredRows, distinctFlows, distinctExecutions }"}},"security":[{"api-key":[]}],"summary":"Estado actual de la memoria compartida entre pasos (memorize/recall/forget)","tags":["monitoring"]}},"/dashboard":{"get":{"operationId":"DashboardController_getDashboard","parameters":[],"responses":{"200":{"description":"Dashboard stats"}},"security":[{"api-key":[]}],"summary":"Get aggregated dashboard stats","tags":["dashboard"]}},"/provisioning/flows/{id}/deploy":{"post":{"operationId":"ProvisioningController_deploy","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Deployment result with list of created resources"},"404":{"description":"Flow not found"}},"security":[{"api-key":[]}],"summary":"Deploy all GCP resources for a flow","tags":["provisioning"]}},"/provisioning/flows/{id}/execute":{"post":{"operationId":"ProvisioningController_execute","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecuteFlowDto"}}}},"responses":{"200":{"description":"Execution started"},"400":{"description":"Flow not active or has no workflow to execute"},"404":{"description":"Flow not found"},"409":{"description":"Flow already has a non-terminal execution in progress"}},"security":[{"api-key":[]}],"summary":"Manually trigger the deployed Cloud Workflow for a flow","tags":["provisioning"]}},"/provisioning/flows/{id}/execution-lock":{"get":{"operationId":"ProvisioningController_getExecutionLock","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Lock status: { active, executionName?, triggeredBy?, since? }"}},"security":[{"api-key":[]}],"summary":"Current non-terminal execution for the flow, if any — backs the UI's 'Ejecutar' disabled state","tags":["provisioning"]}},"/provisioning/flows/{id}/preview":{"get":{"operationId":"ProvisioningController_preview","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"List of resources that would be provisioned"}},"security":[{"api-key":[]}],"summary":"Preview GCP resources that would be created (dry-run)","tags":["provisioning"]}},"/provisioning/flows/{id}/redeploy/{deploymentId}":{"post":{"operationId":"ProvisioningController_redeploy","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"deploymentId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Deployment result for the restored version"},"400":{"description":"That deployment record has no graph snapshot to redeploy"},"404":{"description":"Flow or deployment record not found"}},"security":[{"api-key":[]}],"summary":"Redeploy a flow using a previous version's graph snapshot (AE-149)","tags":["provisioning"]}},"/provisioning/flows/{id}/history":{"get":{"operationId":"ProvisioningController_history","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"List of deployment records"}},"security":[{"api-key":[]}],"summary":"Get deployment history for a flow","tags":["provisioning"]}},"/internal/flow-memory/sweep":{"post":{"operationId":"FlowMemoryController_sweep","parameters":[],"responses":{"201":{"description":"{ removed }"}},"security":[{"oidc":[]}],"summary":"Elimina filas expiradas — pensado para un Cloud Scheduler periodico","tags":["flow-memory"]}},"/internal/flow-memory/{key}":{"put":{"operationId":"FlowMemoryController_remember","parameters":[{"name":"key","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RememberDto"}}}},"responses":{"200":{"description":"Valor guardado (upsert por correlationId+flowId+key)"}},"security":[{"oidc":[]}],"summary":"Memorizar un valor dentro del scope de una ejecucion de flujo","tags":["flow-memory"]},"get":{"operationId":"FlowMemoryController_recall","parameters":[{"name":"key","required":true,"in":"path","schema":{"type":"string"}},{"name":"correlationId","required":true,"in":"query","description":"metadata.correlationId del envelope","schema":{"type":"string"}},{"name":"flowId","required":true,"in":"query","description":"Flujo dueño de la memoria","schema":{"type":"string"}}],"responses":{"200":{"description":"{ key, value }"},"404":{"description":"La clave no existe en este scope o ya expiro"}},"security":[{"oidc":[]}],"summary":"Recordar un valor previamente memorizado en esta ejecucion","tags":["flow-memory"]},"delete":{"operationId":"FlowMemoryController_forget","parameters":[{"name":"key","required":true,"in":"path","schema":{"type":"string"}},{"name":"correlationId","required":true,"in":"query","description":"metadata.correlationId del envelope","schema":{"type":"string"}},{"name":"flowId","required":true,"in":"query","description":"Flujo dueño de la memoria","schema":{"type":"string"}}],"responses":{"204":{"description":"Clave eliminada (o no existia)"}},"security":[{"oidc":[]}],"summary":"Olvidar una clave — idempotente","tags":["flow-memory"]}},"/flows/{id}/webhook":{"post":{"operationId":"WebhooksController_trigger","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"202":{"description":"Accepted: { accepted, executionId, executionName, state, message }"},"400":{"description":"Flow not active, has no workflow to execute, or payload does not match the inputTemplate"},"401":{"description":"Missing or invalid X-CSB-Signature"},"404":{"description":"Flow not found"},"409":{"description":"Same concurrency key (or the whole flow, if none is declared) already has a non-terminal execution in progress — safe to retry once it finishes"}},"summary":"Trigger the deployed Cloud Workflow for a flow from an external system (WebHook trigger node) — responds with an acknowledgement, not the business outcome","tags":["webhooks"]}},"/import":{"post":{"operationId":"ImportController_importBundle","parameters":[{"name":"dryRun","required":false,"in":"query","description":"Si true, valida y calcula el resultado sin persistir nada","schema":{"type":"boolean"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file"],"properties":{"file":{"type":"string","format":"binary","description":"Archivo .yaml, .yml o .json con el Resource Bundle"}}}}}},"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"Importar recursos masivamente desde un archivo YAML o JSON (bundle)","tags":["import"]}},"/export":{"get":{"operationId":"ExportController_exportBundle","parameters":[{"name":"format","required":false,"in":"query","schema":{"enum":["yaml","json"],"type":"string"}},{"name":"organization","required":false,"in":"query","schema":{"type":"string"}},{"name":"flowId","required":false,"in":"query","description":"Scopes the Flow kind to a single flow by id","schema":{"type":"string"}},{"name":"kinds","required":false,"in":"query","schema":{"type":"array","items":{"type":"string","enum":["ApiDefinition","TopicDefinition","SchemaVersion","Connector","Adapter","WorkflowTemplate","Flow","FlowVersion"]}}}],"responses":{"200":{"description":""}},"summary":"Descargar recursos como bundle YAML o JSON","tags":["export"]}},"/transfer/staged":{"post":{"operationId":"TransferController_uploadStaged","parameters":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file"],"properties":{"file":{"type":"string","format":"binary","description":"Archivo .yaml, .yml o .json con el Resource Bundle"}}}}}},"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"Subir un bundle a staging (no se aplica hasta promover)","tags":["transfer"]},"get":{"operationId":"TransferController_list","parameters":[{"name":"status","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Listar staged imports","tags":["transfer"]}},"/transfer/staged/{id}":{"get":{"operationId":"TransferController_getOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Detalle de un staged import (recursos + huecos)","tags":["transfer"]}},"/transfer/staged/{id}/reconcile":{"post":{"operationId":"TransferController_reconcile","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"Recalcular mapeo Crear/Mapear y huecos (idempotente)","tags":["transfer"]}},"/transfer/staged/{id}/resources/{rid}":{"patch":{"operationId":"TransferController_patchResource","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"rid","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchResourceMappingDto"}}}},"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Fijar mappingAction/targetId/updateOnPromote de un recurso","tags":["transfer"]}},"/transfer/staged/{id}/gaps/{gid}":{"patch":{"operationId":"TransferController_patchGap","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"gid","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchGapDto"}}}},"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Resolver o waivear un hueco de configuración","tags":["transfer"]}},"/transfer/staged/{id}/promote":{"post":{"operationId":"TransferController_promote","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"dryRun","required":false,"in":"query","schema":{"type":"boolean"}}],"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"Promover (dry-run + transacción). Solo ADMIN.","tags":["transfer"]}},"/transfer/staged/{id}/reject":{"post":{"operationId":"TransferController_reject","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"Rechazar y cerrar sin aplicar","tags":["transfer"]}},"/store/inventory":{"post":{"operationId":"StoreController_updateInventory","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InventoryUpdateDto"}}}},"responses":{"200":{"description":"Workflow de inventario ejecutado"},"404":{"description":"Flow inventory-to-sap-saga no encontrado"},"409":{"description":"Ya hay una ejecucion activa para este flow"}},"security":[{"api-key":[]}],"summary":"Notificar actualizacion de inventario — dispara sync a SAP","tags":["store"]}},"/store/orders":{"post":{"operationId":"StoreController_placeOrder","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderPlaceDto"}}}},"responses":{"200":{"description":"Workflow de orden ejecutado"},"404":{"description":"Flow order-to-hubspot-saga no encontrado"},"409":{"description":"Ya hay una ejecucion activa para este flow"}},"security":[{"api-key":[]}],"summary":"Registrar nueva orden — dispara sync a HubSpot","tags":["store"]}},"/store/orders/cancel":{"post":{"operationId":"StoreController_cancelOrder","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderCancelDto"}}}},"responses":{"200":{"description":"Workflow de cancelacion ejecutado"},"404":{"description":"Flow order-cancellation-notify no encontrado"},"409":{"description":"Ya hay una ejecucion activa para este flow"}},"security":[{"api-key":[]}],"summary":"Cancelar orden — notifica a HubSpot y cierra deal","tags":["store"]}},"/store/orders/fulfillment":{"post":{"operationId":"StoreController_fulfillOrder","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderFulfillmentDto"}}}},"responses":{"200":{"description":"Workflow de fulfillment ejecutado"},"404":{"description":"Flow order-fulfillment-demo no encontrado"},"409":{"description":"Ya hay una ejecucion activa para este flow"}},"security":[{"api-key":[]}],"summary":"Solicitar fulfillment completo — reserva SAP + deal HubSpot","tags":["store"]}},"/v1/inventory/centers-availability":{"post":{"description":"Consulta el inventario del SKU en cada centro del Core Data Mesh y devuelve una fila por centro con las unidades disponibles y, cuando no hay stock, la fecha estimada de reabasto.","operationId":"InventoryController_centersAvailability","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CentersAvailabilityDto"}}}},"responses":{"200":{"description":"Disponibilidad por centro"},"400":{"description":"Payload inválido, o el Core Data Mesh rechazó la consulta"},"404":{"description":"Flow consultar-inventario-centros no encontrado"},"409":{"description":"Ese mismo requestId ya tiene una consulta en curso"},"502":{"description":"El Core Data Mesh no respondió tras los reintentos"}},"security":[{"api-key":[]}],"summary":"Disponibilidad de un SKU en los centros indicados","tags":["inventory"]}},"/internal/customer-signups/{customerKey}":{"get":{"operationId":"CustomerSignupsController_lookup","parameters":[{"name":"customerKey","required":true,"in":"path","description":"customer.key de CommerceTools con el que la tienda identifica al cliente","schema":{"type":"string"}}],"responses":{"200":{"description":"{ found, customerKey, customerSap, outcome, requestId, attempts, updatedAt } — nunca 404: un cliente nuevo responde found=false y customerSap=\"\""}},"security":[{"oidc":[]}],"summary":"Candado de idempotencia del alta: qué sabe el CSB de este cliente en SAP","tags":["customer-signups"]},"put":{"operationId":"CustomerSignupsController_record","parameters":[{"name":"customerKey","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordCustomerSignupDto"}}}},"responses":{"200":{"description":"Fila registrada"}},"security":[{"oidc":[]}],"summary":"Registra el desenlace del alta en SAP (upsert; customerSap se escribe una sola vez)","tags":["customer-signups"]}}},"info":{"title":"RTP CSB — Control Plane API","description":"API de control plane del Cloud Service Bus (CSB) de Rotoplas: gestion de flows, topics, adapters, connectors, schemas, provisioning y secretos.","version":"1.0.0","contact":{}},"tags":[{"name":"auth","description":""},{"name":"health","description":""},{"name":"flows","description":""},{"name":"topics","description":""},{"name":"adapters","description":""},{"name":"connectors","description":""},{"name":"api-registry","description":""},{"name":"schemas","description":""},{"name":"secrets","description":""},{"name":"monitoring","description":""},{"name":"dashboard","description":""},{"name":"provisioning","description":""}],"servers":[],"components":{"securitySchemes":{"api-key":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"LoginDto":{"type":"object","properties":{}},"CreateFlowDto":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"type":{"type":"string","enum":["EVENT_DRIVEN","REQUEST_REPLY","BATCH","SAGA"],"default":"EVENT_DRIVEN"},"triggerTopicId":{"type":"string"},"workflowTemplateId":{"type":"string"},"adapterId":{"type":"string"}},"required":["name"]},"PresenceHeartbeatDto":{"type":"object","properties":{"flowId":{"type":"string"}},"required":["flowId"]},"FlowNodeDto":{"type":"object","properties":{"id":{"type":"string"},"type":{"type":"object"},"position":{"type":"object"},"data":{"type":"object"},"width":{"type":"number"},"height":{"type":"number"}},"required":["id","type","position","data"]},"FlowEdgeDto":{"type":"object","properties":{"id":{"type":"string"},"source":{"type":"string"},"target":{"type":"string"},"sourceHandle":{"type":"string"},"targetHandle":{"type":"string"},"type":{"type":"string"},"label":{"type":"string"},"animated":{"type":"boolean"},"data":{"type":"object"}},"required":["id","source","target"]},"UpdateFlowGraphDto":{"type":"object","properties":{"nodes":{"type":"array","items":{"$ref":"#/components/schemas/FlowNodeDto"}},"edges":{"type":"array","items":{"$ref":"#/components/schemas/FlowEdgeDto"}},"revision":{"type":"number","description":"Revision del flujo al momento de cargar — habilita chequeo de concurrencia optimista"},"force":{"type":"boolean","description":"Forzar sobreescritura aunque la revision no coincida"}},"required":["nodes","edges"]},"CreateSecretDto":{"type":"object","properties":{"name":{"type":"string","description":"Internal reference name","example":"shopify-api-key"},"gcpSecretId":{"type":"string","description":"Full Secret Manager resource name of the existing secret","example":"projects/rotoplas-prod/secrets/shopify-api-key"},"description":{"type":"string"}},"required":["name","gcpSecretId"]},"CreateSecretValueDto":{"type":"object","properties":{"name":{"type":"string","description":"Internal reference name — also used to derive the GCP Secret Manager name (csb-<env>-<slug>)","example":"sw-api-key"},"value":{"type":"string","description":"Secret value to store in GCP Secret Manager"},"description":{"type":"string"}},"required":["name","value"]},"CreateTopicDto":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"gcpTopicId":{"type":"string","description":"Frontend alias for gcpTopicName"},"dlqTopicId":{"type":"string","description":"Frontend alias for dlqTopicName; also sets dlqEnabled=true"},"retentionDays":{"type":"number","default":7},"dlqEnabled":{"type":"boolean","default":false},"dlqTopicName":{"type":"string"},"labels":{"type":"object"},"schemaFormat":{"type":"string","enum":["AVRO","JSON_SCHEMA","NONE"],"default":"JSON_SCHEMA"},"messageOrdering":{"type":"boolean","default":false},"orderingKey":{"type":"string"},"messageSchema":{"type":"array","items":{"type":"object"}}},"required":["name"]},"UpdateTopicDto":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"gcpTopicId":{"type":"string","description":"Frontend alias for gcpTopicName"},"gcpTopicName":{"type":"string"},"dlqTopicId":{"type":"string","description":"Frontend alias for dlqTopicName; also sets dlqEnabled=true"},"dlqTopicName":{"type":"string"},"dlqEnabled":{"type":"boolean"},"retentionDays":{"type":"number","default":7},"labels":{"type":"object"},"schemaFormat":{"type":"string","enum":["AVRO","JSON_SCHEMA","NONE"]},"messageOrdering":{"type":"boolean"},"orderingKey":{"type":"string"},"messageSchema":{"type":"array","items":{"type":"object"}}}},"CreateAdapterDto":{"type":"object","properties":{"name":{"type":"string","example":"csb-sap-adapter"},"connectorId":{"type":"string","description":"Optional connector config reference"},"cloudRunUrl":{"type":"string","description":"Cloud Run service URL"},"cloudRunServiceName":{"type":"string"},"dockerImage":{"type":"string"},"probeEndpoint":{"type":"string","default":"/health"},"probeMethod":{"type":"string","enum":["GET","HEAD"],"default":"GET"},"probeExpectedStatus":{"type":"number","default":200},"deploymentConfig":{"type":"object"}},"required":["name"]},"ProbeResultDto":{"type":"object","properties":{"healthy":{"type":"boolean"},"statusCode":{"type":"number"},"latencyMs":{"type":"number"},"probeUrl":{"type":"string"},"error":{"type":"string"}},"required":["healthy"]},"CreateConnectorDto":{"type":"object","properties":{"name":{"type":"string"},"system":{"type":"string","description":"Target system: SAP, HubSpot, CommerceTools, etc."},"type":{"type":"string","description":"Protocol type alias (REST, GRPC, etc.) — mapped to system if system not provided"},"description":{"type":"string"},"apiDefinitionId":{"type":"string"},"transformConfig":{"type":"object"},"throttleConfig":{"type":"object"}},"required":["name"]},"UpdateConnectorDto":{"type":"object","properties":{"name":{"type":"string"},"system":{"type":"string","description":"Target system: SAP, HubSpot, CommerceTools, etc."},"type":{"type":"string","description":"Frontend alias for system field"},"description":{"type":"string"},"apiDefinitionId":{"type":"string"},"transformConfig":{"type":"object"},"throttleConfig":{"type":"object"}}},"ApiQueryParamDto":{"type":"object","properties":{}},"ApiPathParamDto":{"type":"object","properties":{}},"ApiEndpointDto":{"type":"object","properties":{"method":{"type":"string","enum":["GET","POST","PUT","PATCH","DELETE"]},"path":{"type":"string"},"description":{"type":"string"},"queryParams":{"type":"array","items":{"$ref":"#/components/schemas/ApiQueryParamDto"}},"pathParams":{"type":"array","items":{"$ref":"#/components/schemas/ApiPathParamDto"}},"requestSchema":{"type":"object"},"responseSchema":{"type":"object"}},"required":["method","path","description"]},"CreateApiDefinitionDto":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"baseUrl":{"type":"string"},"authType":{"type":"string","enum":["NONE","API_KEY","BEARER","OAUTH2","BASIC"]},"endpoints":{"type":"array","items":{"$ref":"#/components/schemas/ApiEndpointDto"}},"rateLimitConfig":{"type":"object"},"authConfig":{"type":"object"},"secretRef":{"type":"string"},"useKmsEnvelope":{"type":"boolean","description":"If true, the sensitive authConfig value is envelope-encrypted with Cloud KMS and stored in credentialEnvelope instead of Secret Manager."},"organization":{"type":"string"}},"required":["name","baseUrl","authType"]},"TestConnectionDraftDto":{"type":"object","properties":{"baseUrl":{"type":"string","example":"https://api.open-meteo.com/v1"},"authType":{"type":"string","enum":["NONE","API_KEY","BEARER","OAUTH2","BASIC"]},"authConfig":{"type":"object","description":"Auth metadata + plaintext credential for this one-shot call"},"path":{"type":"string","description":"Endpoint path relative to baseUrl","example":"/forecast"},"method":{"type":"string","enum":["GET","POST","PUT","PATCH","DELETE"]},"query":{"type":"object"},"body":{"type":"object"}},"required":["baseUrl","authType","path","method"]},"UpdateApiDefinitionDto":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"baseUrl":{"type":"string"},"authType":{"type":"string","enum":["NONE","API_KEY","BEARER","OAUTH2","BASIC"]},"endpoints":{"type":"array","items":{"$ref":"#/components/schemas/ApiEndpointDto"}},"rateLimitConfig":{"type":"object"},"authConfig":{"type":"object"},"secretRef":{"type":"string"},"useKmsEnvelope":{"type":"boolean","description":"If true, the sensitive authConfig value is envelope-encrypted with Cloud KMS and stored in credentialEnvelope instead of Secret Manager."},"organization":{"type":"string"},"status":{"type":"string","enum":["ACTIVE","INACTIVE","DEPRECATED"]}}},"TestConnectionDto":{"type":"object","properties":{"path":{"type":"string","description":"Endpoint path to call, relative to the API definition baseUrl","example":"/orders"},"method":{"type":"string","enum":["GET","POST","PUT","PATCH","DELETE"]},"query":{"type":"object"},"body":{"type":"object"}},"required":["path","method"]},"UpsertBindingDto":{"type":"object","properties":{"secretRef":{"type":"string","description":"Bare Secret Manager secret id for this env, e.g. csb-qa-sap-api-credential"},"baseUrlOverride":{"type":"string","description":"Base URL override for this env"}}},"RotateBindingSecretDto":{"type":"object","properties":{"value":{"type":"string","description":"New secret value to store in Secret Manager (never persisted to Postgres)"}},"required":["value"]},"CreateSchemaDto":{"type":"object","properties":{"topicId":{"type":"string"},"version":{"type":"number"},"format":{"type":"string","enum":["JSON_SCHEMA","AVRO","PROTO"],"default":"JSON_SCHEMA"},"definition":{"type":"string","description":"Schema definition (JSON string, AVRO IDL, or proto file content)"},"description":{"type":"string"},"isActive":{"type":"boolean","default":false}},"required":["topicId","version","format","definition"]},"ReplayMessageDto":{"type":"object","properties":{"messageId":{"type":"string"},"dlqTopicName":{"type":"string"}},"required":["messageId","dlqTopicName"]},"ExecuteFlowDto":{"type":"object","properties":{"input":{"type":"object","description":"Argument passed to the Cloud Workflow execution"}}},"RememberDto":{"type":"object","properties":{"correlationId":{"type":"string","example":"a1b2c3d4-...","description":"metadata.correlationId del envelope — scope de ejecucion"},"flowId":{"type":"string","example":"3fa1e2...","description":"Flujo dueño de la memoria (aislamiento entre flujos)"},"value":{"type":"object","description":"Valor a memorizar — cualquier JSON","example":{"id":"ORD-1"}},"ttlSeconds":{"type":"number","example":86400,"description":"TTL en segundos; default 24h, tope 30d"}},"required":["correlationId","flowId","value"]},"PatchResourceMappingDto":{"type":"object","properties":{"mappingAction":{"type":"string","enum":["create","map"]},"targetId":{"type":"string"},"updateOnPromote":{"type":"boolean"}}},"PatchGapDto":{"type":"object","properties":{"action":{"type":"string","enum":["resolve","waive"]},"secretRef":{"type":"string","description":"Requerido cuando action=resolve"},"baseUrlOverride":{"type":"string"}},"required":["action"]},"InventoryUpdateDto":{"type":"object","properties":{"sku_code":{"type":"string","example":"SKU-12345","description":"Codigo del producto"},"warehouse_id":{"type":"string","example":"WH-01","description":"ID del almacen"},"quantity_after":{"type":"number","example":480,"description":"Cantidad disponible despues de la actualizacion"},"quantity_before":{"type":"number","example":500,"description":"Cantidad antes de la actualizacion"}},"required":["sku_code","warehouse_id","quantity_after"]},"OrderItemDto":{"type":"object","properties":{"sku_code":{"type":"string","example":"SKU-12345"},"quantity":{"type":"number","example":2},"unit_price":{"type":"number","example":1500}},"required":["sku_code","quantity"]},"OrderPlaceDto":{"type":"object","properties":{"order_id":{"type":"string","example":"ORD-2026-0001","description":"ID de la orden en la tienda"},"customer_id":{"type":"string","example":"CUST-001","description":"ID del cliente"},"customer_email":{"type":"string","example":"cliente@example.com"},"items":{"description":"Items de la orden","type":"array","items":{"$ref":"#/components/schemas/OrderItemDto"}}},"required":["order_id","customer_id","items"]},"OrderCancelDto":{"type":"object","properties":{"order_id":{"type":"string","example":"ORD-2026-0001","description":"ID de la orden a cancelar"},"customer_id":{"type":"string","example":"CUST-001","description":"ID del cliente"},"reason":{"type":"string","example":"Cliente solicito cancelacion","description":"Razon de la cancelacion"}},"required":["order_id","customer_id"]},"OrderFulfillmentDto":{"type":"object","properties":{"order_id":{"type":"string","example":"ORD-2026-0001","description":"ID de la orden"},"customer_id":{"type":"string","example":"CUST-001","description":"ID del cliente"},"sku_code":{"type":"string","example":"SKU-12345","description":"Codigo del producto a reservar"},"quantity":{"type":"number","example":2,"description":"Cantidad a reservar en SAP"}},"required":["order_id","customer_id","sku_code","quantity"]},"CentersAvailabilityDto":{"type":"object","properties":{"requestId":{"type":"string","example":"REQ-INV-CENTROS-0001","description":"Id de esta consulta, generado por quien llama. Es la clave de traza y del candado de concurrencia: dos consultas distintas corren en paralelo y sólo el reenvío de la misma recibe 409"},"sku":{"type":"string","example":"300455","description":"Producto a consultar, en el catálogo de EDM"},"centers":{"example":["CZCTZC09","CZNTZN54","CZSRZS02"],"description":"Centros a consultar, por su locationRef de Fluent (8 caracteres, nivel de bodega). De 1 a N, sin tope","type":"array","items":{"type":"string"}}},"required":["requestId","sku","centers"]},"RecordCustomerSignupDto":{"type":"object","properties":{"requestId":{"type":"string","description":"requestId de la petición de alta que produjo este desenlace","example":"REQ-ALTA-0001"},"outcome":{"type":"string","enum":["CREATED","ALREADY_EXISTS","SAP_ERROR"],"example":"CREATED"},"customerSap":{"type":"string","description":"Número de cliente devuelto por SAP; vacío si SAP rechazó el alta","example":"0004602356"},"storeId":{"type":"string","example":"bebbia-web"},"sapStatus":{"type":"string","description":"cabecera.status de SAP","example":"200"},"errorMessage":{"type":"string"},"correlationId":{"type":"string","description":"metadata.correlationId de la ejecución"}},"required":["requestId","outcome"]}}}}