diff --git a/stock/openapi.yaml b/stock/openapi.yaml index e50e91a..c438e2a 100644 --- a/stock/openapi.yaml +++ b/stock/openapi.yaml @@ -127,60 +127,6 @@ paths: '204': description: Producto eliminado - /stock/reservar: - post: - tags: [Stock] - summary: Reservar stock para una compra - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/ReservaInput' - responses: - '200': - description: Reserva confirmada - content: - application/json: - schema: - $ref: '#/components/schemas/ReservaOutput' - '400': - description: Stock insuficiente o datos inválidos - content: - application/json: - schema: - $ref: '#/components/schemas/ErrorResponse' - '409': - description: Conflicto de reserva (condición de carrera) - content: - application/json: - schema: - $ref: '#/components/schemas/ErrorResponse' - - /stock/liberar: - post: - tags: [Stock] - summary: Liberar stock reservado - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/LiberacionInput' - responses: - '200': - description: Stock liberado - content: - application/json: - schema: - $ref: '#/components/schemas/LiberacionOutput' - '404': - description: Reserva no encontrada - content: - application/json: - schema: - $ref: '#/components/schemas/ErrorResponse' - /reservas: get: tags: [Reservas] @@ -209,6 +155,34 @@ paths: type: array items: $ref: '#/components/schemas/ReservaCompleta' + post: + tags: [Reservas] + summary: Crear una reserva + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ReservaInput' + responses: + '201': + description: Reserva creada + content: + application/json: + schema: + $ref: '#/components/schemas/ReservaOutput' + '400': + description: Stock insuficiente o datos inválidos + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '409': + description: Conflicto de reserva (condición de carrera) + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' /reservas/{idReserva}: get: @@ -267,7 +241,31 @@ paths: application/json: schema: $ref: '#/components/schemas/ErrorResponse' - + delete: + tags: [Reservas] + summary: Cancelar una reserva + description: "Cancela una reserva y libera el stock correspondiente." + parameters: + - name: idReserva + in: path + required: true + schema: + type: integer + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CancelacionReservaInput' + responses: + '204': + description: Reserva cancelada y stock liberado. + '404': + description: Reserva no encontrada + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' /categorias: get: tags: [Categorías] @@ -409,6 +407,10 @@ components: type: number format: float minimum: 0 + dimensiones: + $ref: '#/components/schemas/Dimensiones' + ubicacion: + $ref: '#/components/schemas/UbicacionAlmacen' imagenes: type: array items: @@ -436,6 +438,10 @@ components: pesoKg: type: number format: float + dimensiones: + $ref: '#/components/schemas/Dimensiones' + ubicacion: + $ref: '#/components/schemas/UbicacionAlmacen' imagenes: type: array items: @@ -468,6 +474,10 @@ components: pesoKg: type: number format: float + dimensiones: + $ref: '#/components/schemas/Dimensiones' + ubicacion: + $ref: '#/components/schemas/UbicacionAlmacen' imagenes: type: array items: @@ -596,6 +606,16 @@ components: usuarioId: 123 estado: "cancelado" + CancelacionReservaInput: + type: object + required: [motivo] + properties: + motivo: + type: string + description: "Motivo de la cancelación de la reserva." + example: + motivo: "El cliente canceló la compra." + LiberacionInput: type: object required: [idReserva, usuarioId, motivo] @@ -627,6 +647,36 @@ components: idReserva: 550 estado: "liberado" + Dimensiones: + type: object + description: "Dimensiones del producto en centímetros." + properties: + largoCm: + type: number + format: float + minimum: 0 + anchoCm: + type: number + format: float + minimum: 0 + altoCm: + type: number + format: float + minimum: 0 + + UbicacionAlmacen: + type: object + description: "Ubicación física del producto en el almacén." + properties: + almacenId: + type: integer + pasillo: + type: string + estanteria: + type: string + nivel: + type: integer + ErrorResponse: type: object properties: @@ -702,4 +752,4 @@ components: example: id: 123 nombre: "Juan Pérez" - email: "juan.perez@example.com" + email: "juan.perez@example.com" \ No newline at end of file