Problema
Detectado en la revisión de #293 (edición de inventario, #263). PUT /resources/:id/inventory sustituye el inventario completo con el snapshot del formulario del dueño, sin ningún control de concurrencia (ni versión, ni If-Match): el repositorio hace delete+reinsert incondicional.
Los recursos son el único agregado donde conviven dos escrituras sobre las mismas filas (resource_items):
Escenario de fallo
- El dueño abre
/e/{slug}/mis-puntos/{id}/inventario (formulario sembrado con las líneas A).
- Mientras el formulario está abierto, un operador registra una entrada o el worker de donaciones fusiona la línea B.
- El dueño guarda sin tocar nada → el PUT reescribe con A y la línea B desaparece en silencio (204, sin aviso).
Estado actual
Está documentado como limitación aceptada en update-my-inventory.ts («Last-write-wins… revisit with an optimistic version/If-Match if it bites in the field»).
Propuesta
- Columna de versión (o reutilizar un
updatedAt fiable) en resources/resource_items + If-Match/expectedVersion en el PUT → 409 Conflict y recarga en el formulario web.
- Requiere migración nueva (
NNNN_…) y regenerar el cliente (pnpm gen:api).
Referencias: revisión en #293
Problema
Detectado en la revisión de #293 (edición de inventario, #263).
PUT /resources/:id/inventorysustituye el inventario completo con el snapshot del formulario del dueño, sin ningún control de concurrencia (ni versión, niIf-Match): el repositorio hace delete+reinsert incondicional.Los recursos son el único agregado donde conviven dos escrituras sobre las mismas filas (
resource_items):POST /resources/:id/inventory-entries(Registro de entradas (donaciones recibidas) en un punto #9) y el worker asíncrono de donaciones (Recepción / check-in: confirmar llegada, foto opcional y verificación de contenido #129), ambos víaResource.receiveInventory.Escenario de fallo
/e/{slug}/mis-puntos/{id}/inventario(formulario sembrado con las líneas A).Estado actual
Está documentado como limitación aceptada en
update-my-inventory.ts(«Last-write-wins… revisit with an optimistic version/If-Match if it bites in the field»).Propuesta
updatedAtfiable) enresources/resource_items+If-Match/expectedVersionen el PUT →409 Conflicty recarga en el formulario web.NNNN_…) y regenerar el cliente (pnpm gen:api).Referencias: revisión en #293