Skip to content

Feature-222: admin supplies CRUD#251

Merged
vgpastor merged 17 commits into
GlobalEmergency:mainfrom
jesusareyesv:feature/222-admin-supplies-crud
Jun 30, 2026
Merged

Feature-222: admin supplies CRUD#251
vgpastor merged 17 commits into
GlobalEmergency:mainfrom
jesusareyesv:feature/222-admin-supplies-crud

Conversation

@jesusareyesv

@jesusareyesv jesusareyesv commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

Resumen

Añade la API de gestión (admins-only) del catálogo maestro de insumos (#222), completando la cara de escritura que faltaba: hasta ahora el catálogo era de solo lectura (SupplyRepository.save() lanzaba "not implemented") y no había forma de administrarlo.

Se introduce, sobre el contexto supplies (DDD/hexagonal):

  • Permiso catalogue:manage (scope plataforma) en el catálogo de identity; platform_admin lo obtiene vía ALL_PERMISSIONS. Cierra el catálogo a admins (también habilita [FEATURE] Admin CRUD de categorias y subcategorias (jerarquia, orden, i18n, slugs nucleo protegidos) #221).
  • Dominio: mutadores inmutables en Supply (rename/recategorize/archive/restore/setVariantOf…) que re-aplican las invariantes, helper formatSupplyCode y errores de dominio del catálogo. id y code no son editables.
  • Códigos INS-NNNN: migración 0040 con una SEQUENCE sembrada por encima del máximo actual (INS-0211) para asignar el siguiente código libre.
  • Persistencia: SupplyRepository gana save (upsert), allocateCode, list con filtros, CRUD de alias y un merge transaccional (mueve alias de A→B, repunta variantes hijas y archiva A, sin borrarlo —preserva referencias legadas para [FEATURE] Enlace SupplyLine.supplyId (soft link) en needs, offers, inventario y containers #223/[FEATURE] Backfill/matching de lineas legacy -> supplyId + informe de no-casados #226).
  • Casos de uso: alta (con código auto-asignado y validación de variante), edición, archivado/restauración, alta/baja de alias, fusión y listado/detalle de gestión.
  • HTTP: SuppliesAdminController en /admin/supplies (catalogue:manage), DTOs con class-validator/Swagger, y mapeo de errores en el filtro de excepciones (400/404/409). Invalida la caché del catálogo público tras cada escritura para consistencia inmediata.

Alcance acotado a catálogo (per Alcance mínimo de la issue): el re-enlace masivo de líneas legadas queda en #226 y la UI en #225.

Validación

  • Pasé el gate que toca para esta zona del repo
    • pnpm --filter api build, ESLint ({src,test}, --max-warnings=0), Prettier --check
    • ✅ Tests unitarios (dominio/aplicación/controlador): 86 verdes
    • Pendiente con infra: pnpm dev:infra + pnpm --filter api test (incluye el drizzle-supply.repository.int-spec que requiere Postgres :5433)
  • Verifiqué el comportamiento manualmente si aplica
    • ⏳ Smoke pendiente con la API levantada (alta → INS-NNNN; variante con padre inexistente → 4xx; alias add/remove; merge A→B → A archivado y sus alias resuelven a B; GET /supplies ya no lista archivados)
  • Actualicé docs, migraciones o cliente API si correspondía
    • ✅ Migración 0040_supply_code_seq.sql
    • pnpm gen:api pendiente (arranca el AppModule y necesita Postgres/Redis): falta regenerar y commitear packages/api-client/src/schema.ts con las rutas /admin/supplies*

Cierre

Catálogo maestro de insumos cerrado (admins-only). Añade el permiso
catalogue:manage al catálogo de permisos; platform_admin lo obtiene vía
ALL_PERMISSIONS. Base de GlobalEmergency#222 (y GlobalEmergency#221).
SupplyNotFound, SupplyCodeConflict, VariantTargetNotFound, MergeIntoSelf y
AliasConflict para la gestión admin del catálogo (GlobalEmergency#222).
El agregado Supply gana mutadores inmutables (rename/recategorize/archive/
restore/setVariantOf...) que re-aplican las invariantes, y formatSupplyCode
para el código canónico INS-NNNN. id y code no son editables (GlobalEmergency#222).
SEQUENCE supply_code_seq sembrada por encima del máximo actual para asignar
el siguiente código libre a los insumos creados por el admin (GlobalEmergency#222).
Extiende SupplyRepository con save (upsert), allocateCode (nextval), list
con filtros, CRUD de alias y un merge transaccional (mueve alias, repunta
variantes hijas y archiva el origen). Implementación Drizzle + int-spec (GlobalEmergency#222).
CachingSupplyCatalogReadModel gana invalidate() para que las escrituras de
gestión refresquen la cara pública de inmediato en vez de esperar al TTL (GlobalEmergency#222).
AdminSupplyView expone el agregado completo (status, registrationNotes) más
sus alias, para la API de gestión (distinta de la cara pública) (GlobalEmergency#222).
CreateSupply asigna el siguiente código INS-NNNN y exige que el padre exista
al crear una variante (GlobalEmergency#222).
EditSupply aplica sólo los campos provistos vía los mutadores del agregado;
code no es editable (GlobalEmergency#222).
MergeSupplies valida origen/destino y rechaza fusionar un insumo consigo
mismo; delega el movimiento de alias y el archivado en el repositorio (GlobalEmergency#222).
ArchiveSupply/RestoreSupply, AddSupplyAlias/RemoveSupplyAlias y
ListSuppliesAdmin/GetSupplyAdmin (incluye archivados y campos internos) (GlobalEmergency#222).
El filtro de excepciones de supplies mapea los errores admin: validación/
merge-into-self → 400, not-found → 404, code/alias conflict → 409 (GlobalEmergency#222).
DTOs de petición (create/edit/alias/merge/listado) y respuesta (AdminSupply,
CreateSupplyResponse) con class-validator y Swagger. code es server-allocated (GlobalEmergency#222).
SuppliesAdminController expone alta/edición/archivado/restauración, gestión
de alias y fusión bajo catalogue:manage (scope plataforma). Invalida la caché
del catálogo tras cada escritura (GlobalEmergency#222).
Cablea los casos de uso admin, comparte la instancia cacheada del read-model
(useExisting) y registra SuppliesAdminController (GlobalEmergency#222).
@jesusareyesv jesusareyesv requested a review from vgpastor as a code owner June 30, 2026 02:27
@vercel

vercel Bot commented Jun 30, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
response-grid Ready Ready Preview, Comment Jun 30, 2026 10:43am

Request Review

@jesusareyesv jesusareyesv changed the title Feature/222 admin supplies crud Feature-222: admin supplies CRUD Jun 30, 2026
…go en el caso de uso

Mueve el prefijo del codigo del insumo a la base de datos (tabla categories), permitiendo que sea dinamico por categoria raiz en ingles. Refactoriza la generacion del codigo para que ocurra en el caso de uso (CreateSupply) usando nextSequenceValue del repositorio y formatSupplyCode del dominio. Actualiza dinamicamente el prefijo de los codigos durante la edicion en EditSupply. (GlobalEmergency#222)
@vgpastor vgpastor force-pushed the feature/222-admin-supplies-crud branch from 7bfad91 to 7590e85 Compare June 30, 2026 08:58
@vercel

vercel Bot commented Jun 30, 2026

Copy link
Copy Markdown

@vgpastor is attempting to deploy a commit to the GlobalEmergency Team on Vercel.

A member of the Team first needs to authorize it.

# Conflicts:
#	apps/api/src/contexts/supplies/application/list-categories.spec.ts
#	apps/api/src/contexts/supplies/domain/category-definition.ts
#	apps/api/src/contexts/supplies/domain/supply.ts
#	apps/api/src/contexts/supplies/infrastructure/drizzle/drizzle-category.repository.ts
#	apps/api/src/contexts/supplies/infrastructure/drizzle/schema.ts
#	apps/api/src/contexts/supplies/infrastructure/http/supplies-domain-exception.filter.ts
#	apps/api/src/contexts/supplies/supplies.module.ts
@vgpastor vgpastor force-pushed the feature/222-admin-supplies-crud branch from 29570d4 to d909982 Compare June 30, 2026 10:41
@vgpastor vgpastor merged commit 4b7f5dd into GlobalEmergency:main Jun 30, 2026
4 of 5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEATURE] Admin CRUD de insumos, variantes y alias (incluye merge / des-duplicacion)

2 participants