Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
162 changes: 106 additions & 56 deletions stock/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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]
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -436,6 +438,10 @@ components:
pesoKg:
type: number
format: float
dimensiones:
$ref: '#/components/schemas/Dimensiones'
ubicacion:
$ref: '#/components/schemas/UbicacionAlmacen'
imagenes:
type: array
items:
Expand Down Expand Up @@ -468,6 +474,10 @@ components:
pesoKg:
type: number
format: float
dimensiones:
$ref: '#/components/schemas/Dimensiones'
ubicacion:
$ref: '#/components/schemas/UbicacionAlmacen'
imagenes:
type: array
items:
Expand Down Expand Up @@ -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]
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -702,4 +752,4 @@ components:
example:
id: 123
nombre: "Juan Pérez"
email: "[email protected]"
email: "[email protected]"