# api-tracker-application Casos de uso del tracker (CQRS). - **Import**: `@task-stream/api/tracker/application` - **Capa**: `application` · **Tags**: `scope:api-tracker`, `type:application` ## Contenido - Services: `ProjectsService`, `IssuesService`, `CommentsService`, `ReleasesService`, `ChangesService` (subscriptions), `WorkflowsService` (workflow de cada proyecto para presentar tickets, con una caché de 2 s). - `commands/`: un fichero por command y otro por handler; cargan con `WriteAccess` (rehydrator) y guardan con `commitAndWait()`. - `queries/`: un fichero por query y otro por handler; leen de los puertos `Find*Repository` y comprueban el acceso (`ReadAccess`: miembros, o cualquiera si el proyecto es público; `viewerId` null = anónimo); `SearchMyIssuesQuery` y `GetUpcomingReleasesQuery` cruzan todos los proyectos del usuario («Mi trabajo»). - `event-handlers/`: proyecciones (`@EventsHandler`) hacia el read model (incluida la línea temporal de cada ticket), notificaciones en tiempo real y feed de actividad. - `sagas/`: `ProjectDeletionSaga` (cascada al borrar un proyecto y sus tickets), `ReleaseArchivedSaga` (los tickets sin terminar salen de una release archivada) y `UserDeactivatedSaga` (desasigna los tickets abiertos de un usuario que Pireon desactiva). Las ejecuta el `EventsBridge`; sus comandos son internos e idempotentes. Tests en `sagas.spec.ts`. - `analytics/`: estadísticas y burnup calculados con funciones puras sobre la línea temporal (con tests). - `ports/`: lookups de escritura, `Find*`, `UpsertMaterialized*`, `ReleaseIssuesRepository`, `ChangeFeed`, `UserDirectory`. - `TrackerApplicationModule.withInfrastructure(...)`. Cómo añadir un caso de uso: [Desarrollo](../../../../docs/06-desarrollo.md#64-cómo-añadir-una-funcionalidad). ## Comandos ```sh npx nx lint api-tracker-application npx nx test api-tracker-application # Jest ``` Reglas de dependencia entre capas: [Arquitectura](../../../../docs/02-arquitectura.md#21-capas-hexagonales).