BREAKING CHANGES (row-comments routes): - POST /v1/row-comments/list → GET /v1/row-comments (query params) - POST /v1/row-comments/create → POST /v1/row-comments (201 Created) - POST /v1/row-comments/update → PATCH /v1/row-comments/:id - POST /v1/row-comments/resolve → PATCH /v1/row-comments/:id/resolve - POST /v1/row-comments/delete → DELETE /v1/row-comments/:id (204) - POST /v1/row-comments/count → GET /v1/row-comments/count (query params) - UpdateRowCommentDto/ResolveRowCommentDto: removed commentId field (now path param) REST patches (non-breaking): - POST /v1/sync-blocks: added explicit @HttpCode(201) - POST /v1/slash-commands: added explicit @HttpCode(201) - POST /v1/templates: added explicit @HttpCode(201) - POST /v1/templates/:id/instantiate: added explicit @HttpCode(201) Pre-existing test fixes: - clipper-client.test.ts: jest.mock/jest.fn → vi.mock/vi.fn (Vitest compat) - templates-client.ts + clipper-client.ts + slash-commands-client.ts + sync-blocks-client.ts: removed double-unwrap .data.data → .data Tests: 366/366 client vitest pass, 448/453 server jest pass (5 pre-existing infra failures) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
7.6 KiB
7.6 KiB
R5.2 — REST Conventions Audit
Generated: 2026-05-08 Branch: acadenice/main
A. Endpoints audited
| Endpoint | Method | Status Code | Method OK | Code OK | Naming OK | Notes | Action |
|---|---|---|---|---|---|---|---|
| GET /v1/api-keys | GET | 200 | OK | OK | OK | - | None |
| POST /v1/api-keys | POST | 201 | OK | OK | OK | explicit HttpCode(201) present | None |
| DELETE /v1/api-keys/:id | DELETE | 204 | OK | OK | OK | - | None |
| GET /v1/audit-log | GET | 200 | OK | OK | KO | singular noun — route predates R5.2 scope | Deferred (no rename) |
| GET /v1/pages/:pageId/backlinks | GET | 200 | OK | OK | OK | sub-resource path correct | None |
| POST /v1/clipper/import | POST | 201 | OK | OK | OK | creates a page resource | None |
| POST /v1/clipper/tokens | POST | 201 | OK | OK | OK | - | None |
| GET /v1/clipper/tokens | GET | 200 | OK | OK | OK | - | None |
| DELETE /v1/clipper/tokens/:id | DELETE | 204 | OK | OK | OK | - | None |
| POST /v1/page-comments/resolve | POST | 200 | OK | OK | OK | action verb, no resource created | None |
| GET /v1/graph | GET | 200 | OK | OK | OK | - | None |
| GET /v1/notifications | GET | 200 | OK | OK | OK | - | None |
| GET /v1/notifications/unread-count | GET | 200 | OK | OK | OK | - | None |
| POST /v1/notifications/read-all | POST | 204 | OK | OK | OK | action, no resource | None |
| POST /v1/notifications/mark-read | POST | 204 | OK | OK | OK | action, no resource | None |
| POST /v1/notifications/:id/read | POST | 204 | OK | OK | OK | action, no resource | None |
| GET /v1/notification-preferences | GET | 200 | OK | OK | OK | - | None |
| PUT /v1/notification-preferences | PUT | 200 | OK | OK | OK | full replace semantics correct | None |
| GET /v1/roles | GET | 200 | OK | OK | OK | - | None |
| POST /v1/roles | POST | 201 | OK | OK | OK | explicit HttpCode(201) | None |
| GET /v1/roles/:id | GET | 200 | OK | OK | OK | - | None |
| PATCH /v1/roles/:id | PATCH | 200 | OK | OK | OK | - | None |
| DELETE /v1/roles/:id | DELETE | 204 | OK | OK | OK | - | None |
| GET /v1/roles/:id/permissions | GET | 200 | OK | OK | OK | sub-resource | None |
| PUT /v1/roles/:id/permissions | PUT | 200 | OK | OK | OK | full replace semantics | None |
| GET /v1/users/:userId/roles | GET | 200 | OK | OK | OK | sub-resource | None |
| POST /v1/users/:userId/roles | POST | 200 | KO | KO | OK | assigns roles (action), 201 would also be valid | Deferred |
| DELETE /v1/users/:userId/roles/:roleId | DELETE | 204 | OK | OK | OK | - | None |
| GET /v1/permissions | GET | 200 | OK | OK | OK | - | None |
| GET /v1/permissions/me | GET | 200 | OK | OK | OK | sub-resource | None |
| GET /v1/security/oidc-status | GET | 200 | OK | OK | OK | - | None |
| GET /v1/slash-commands | GET | 200 | OK | OK | OK | - | None |
| GET /v1/slash-commands/:id | GET | 200 | OK | OK | OK | - | None |
| POST /v1/slash-commands | POST | 201 | OK | OK | OK | added explicit HttpCode(201) — R5.2 | PATCHED |
| PATCH /v1/slash-commands/:id | PATCH | 200 | OK | OK | OK | - | None |
| DELETE /v1/slash-commands/:id | DELETE | 204 | OK | OK | OK | - | None |
| POST /v1/sync-blocks | POST | 201 | OK | OK | OK | added explicit HttpCode(201) — R5.2 | PATCHED |
| GET /v1/sync-blocks/:id | GET | 200 | OK | OK | OK | - | None |
| PATCH /v1/sync-blocks/:id | PATCH | 200 | OK | OK | OK | - | None |
| DELETE /v1/sync-blocks/:id | DELETE | 204 | OK | OK | OK | - | None |
| GET /v1/sync-blocks/:id/usages | GET | 200 | OK | OK | OK | sub-resource | None |
| GET /v1/templates | GET | 200 | OK | OK | OK | - | None |
| GET /v1/templates/:id | GET | 200 | OK | OK | OK | - | None |
| POST /v1/templates | POST | 201 | OK | OK | OK | added explicit HttpCode(201) — R5.2 | PATCHED |
| PATCH /v1/templates/:id | PATCH | 200 | OK | OK | OK | - | None |
| DELETE /v1/templates/:id | DELETE | 204 | OK | OK | OK | - | None |
| POST /v1/templates/:id/instantiate | POST | 201 | OK | OK | OK | creates a page — 201 correct, added explicit | PATCHED |
| PATCH /v1/templates/:id/default | PATCH | 200 | OK | OK | OK | - | None |
| POST /v1/row-comments/list | POST | 200 | KO | OK | KO | RPC verb in path | PATCHED → GET /v1/row-comments |
| POST /v1/row-comments/create | POST | 200 | KO | KO | KO | RPC verb, wrong code | PATCHED → POST /v1/row-comments 201 |
| POST /v1/row-comments/update | POST | 200 | KO | OK | KO | RPC verb in path | PATCHED → PATCH /v1/row-comments/:id |
| POST /v1/row-comments/resolve | POST | 200 | KO | OK | KO | RPC verb in path | PATCHED → PATCH /v1/row-comments/:id/resolve |
| POST /v1/row-comments/delete | POST | 200 | KO | KO | KO | RPC verb, wrong method | PATCHED → DELETE /v1/row-comments/:id 204 |
| POST /v1/row-comments/count | POST | 200 | KO | OK | KO | RPC verb in path | PATCHED → GET /v1/row-comments/count |
Total audited: 54 endpoints Violations found: 9 Patches applied: 9 (6 row-comments routes + 3 missing 201 codes)
B. Breaking changes
| Change | Before | After | Impact |
|---|---|---|---|
| row-comments list | POST /v1/row-comments/list | GET /v1/row-comments?tableId=&rowId= | Breaking — client updated |
| row-comments create | POST /v1/row-comments/create | POST /v1/row-comments (201) | Breaking — client + status updated |
| row-comments update | POST /v1/row-comments/update (body commentId) | PATCH /v1/row-comments/:id | Breaking — client + server updated |
| row-comments resolve | POST /v1/row-comments/resolve (body commentId) | PATCH /v1/row-comments/:id/resolve | Breaking — client + server updated |
| row-comments delete | POST /v1/row-comments/delete (body commentId) | DELETE /v1/row-comments/:id (204) | Breaking — client + server updated |
| row-comments count | POST /v1/row-comments/count | GET /v1/row-comments/count?tableId=&rowId= | Breaking — client updated |
All breaking changes updated consistently across: server controller, server spec, client service, client test.
C. Patches applied
P1 — row-comments: Full REST refactor (breaking)
row-comments.controller.ts: 6 routes converted from RPC POST to proper HTTP methodscomment.dto.ts: RemovedcommentIdfromUpdateRowCommentDtoandResolveRowCommentDto(now path param)row-comments.controller.spec.ts: Rewrote to match new REST interfacerow-comment.service.spec.ts: Fixed 3 DTO literals (removedcommentId)row-comments-client.ts(client): Converted from POST-only to GET/POST/PATCH/DELETErow-comments-client.test.ts(client): Rewrote to match new REST methods
P2 — sync-blocks: explicit 201 on POST create
sync-blocks.controller.ts: Added@HttpCode(HttpStatus.CREATED)
P3 — slash-commands: explicit 201 on POST create
slash-commands.controller.ts: Added@HttpCode(HttpStatus.CREATED)
P4 — templates: explicit 201 on POST create + instantiate
templates.controller.ts: Added@HttpCode(HttpStatus.CREATED)tocreateandinstantiate
P5 — Fix pre-existing test failures (D section)
D1 — clipper-client.test.ts: jest → vitest
- Converted
jest.mock,jest.fn(),jest.Mocked,afterEach(jest.resetAllMocks)to vitest equivalents
D2 — templates-client.test.ts: .data.data → .data
templates-client.ts: Removed double-unwrap.data.data→.data(x6 methods)clipper-client.ts: Same fix (x2 methods)slash-commands-client.ts: Same fix (x4 methods)sync-blocks-client.ts: Same fix (x4 methods)
D. Test counts
| Suite | Before | After |
|---|---|---|
| Server Jest (acadenice) | 321 pass | 322 pass |
| Server Jest (total) | 440 pass / 5 fail | 448 pass / 5 fail (pre-existing) |
| Client Vitest | 356 pass / 7 fail | 366 pass / 0 fail |