docs/specs/20260617-121208-agent-feature.mdadded
---
spec: agent-feature
status: in-progress
owner: feature-pipeline-agent
related-routes:
files:
  - src/api/v2/projects/files/files.routes.ts
  - src/api/v2/projects/files/files.controller.ts
  - src/services/files.service.ts
---

# agent-feature

## Goal

Add a read-only API2 endpoint GET /api/v2/projects/{projectId}/files/biggest that returns
the full file metadata for the largest non-soft-deleted file (by FileSizeBytes) in a project,
returning 200 with null body when none exist and 404 when the project does not exist. Backed
by a new fn_GetBiggestFile function; no schema changes.


## Behavior changes

- GET /api/v2/projects/{projectId}/files/biggest

## Acceptance criteria

- [ ] The behavior described above is implemented on the listed files.
- [ ] Existing behavior is unchanged when the new feature is not exercised.
- [ ] Unit and (where observable) e2e tests cover the new behavior.

## Out of scope

- Returning a ranked/sorted list of files by size (only the single biggest is returned).
- Filtering biggest-file selection by file type, extension, or other attributes.
- Any changes to API1 services (hc-project, hc-iam, hc-bpm, hc-notification).
- Including BatchFile or UserFile rows; only xyz.FileReference is considered.

## Notes / open questions

- Generated by the feature pipeline from the approved architect plan. If any
  acceptance criterion is ambiguous, ask the human before implementing.

## Decisions

- The spec's `files:` frontmatter names `src/api/v2/projects/files/{files.routes,files.controller}.ts`
  and `src/services/files.service.ts`, but those paths do not exist. The established resource in this
  repo is `projectfiles` (`src/api/v2/projects/projectfiles/*` mounted at `/:projectId/files`,
  `src/services/projectfiles.service.ts`). Implemented the endpoint there to follow the actual
  convention rather than create a parallel `files/` tree.
- Route registered as `GET /biggest` **before** `GET /:fileReferenceId` so the literal path is not
  captured as a `fileReferenceId` UUID param.
- Response shape mirrors the list endpoint's per-item metadata (no `downloadUrl`/`CloudStoragePath`),
  matching "full file metadata" for a read-only endpoint.
- 200-with-null vs 404 distinction: service returns `null` when `fn_GetBiggestFile` yields 0 rows
  (project exists, no files) → controller responds `200 null`; a DB error containing
  "No project found for ProjectId" maps to `NotFoundError` → `404`, mirroring `createProjectFile`.
- `fn_GetBiggestFile` is a new DB function. DB function definitions are NOT housed in this repo
  (the e2e dump only seeds data), so creating the function is a separate DB-migration change. The
  e2e happy-path/empty/404 cases depend on that function existing in the seeded test DB.
- Could not run `tsc`/unit/e2e locally: `node_modules` is not installed and per task constraints no
  toolchain was installed. The CI pipeline runs the suite.