feat(admin): consultation des messages de contact (#80) #124

Merged
kyuno merged 1 commit from feat/admin-contact-messages into main 2026-09-08 09:51:46 +02:00
Owner

PR 2/2 de l'issue #80 — la vue admin en lecture seule des messages de contact.

Stackée sur #123 (feat/contact-message-model-and-form) — base à retargetter sur main une fois #123 mergée. Le diff propre à cette PR : le contrat list*/types/contact.ts, le module API admin-contact, la page /admin/messages, les tests.

Contenu

Contrat partagé

  • listContactMessagesQuerySchema (filtre type optionnel).
  • types/contact.ts : ContactMessageAdminView — author: { id, firstName, lastName, email } | null (null = compte supprimé depuis l'envoi).

API — admin-contact.{routes,service}.ts

  • GET /admin/api/contact?type= (requireAdmin), tri createdAt desc, plafond CONTACT_MESSAGES_PAGE_SIZE = 200 (même esprit que CORRECTIONS_PAGE_SIZE — vue de triage, pas export).
  • Branché dans admin.routes.ts (adminRouter.use("/contact", adminContactRouter)). Aucune route d'écriture — pas de workflow de traitement dans cette première version.

Front — page /admin/messages

  • MessagesPage (+ .scss) : tableau lecture seule — date, expéditeur (nom + email, ou « Compte supprimé »), badge de type, message, page (font-mono), user-agent tronqué (valeur complète au survol). Un <select> filtre par type.
  • Entrée de nav « Messages » (icône Inbox) dans AdminLayout ; adminApiClient.getContactMessages({ type }) ; i18n admin.nav.messages + bloc admin.messages.*.

Tests

  • apps/api/test/admin-contact.test.ts (Mocha) : 401 sans session admin ; tri récent d'abord + author résolu ; filtre type ; type inconnu → 400 ; plafond 200 ; author: null après suppression du compte.
  • apps/web/cypress/e2e/admin-messages.cy.ts : rendu lecture seule (expéditeur / « Compte supprimé » / badge, aucun bouton d'action), filtre par type via le query param.

Docs : backend-architecture.md (section admin : ForgejoService non, mais la route GET /admin/api/contact + l'event contact.submitted dans la liste).

Vérifié localement

pnpm lint ✅ · pnpm build ✅ · Cypress admin-messages.cy.ts + admin-corrections.cy.ts + admin-layout.cy.ts : 9/9 ✅. Mocha → CI.

Closes #80.

🤖 Generated with Claude Code

PR 2/2 de l'issue #80 — la vue admin en lecture seule des messages de contact. **Stackée sur #123** (`feat/contact-message-model-and-form`) — base à retargetter sur `main` une fois #123 mergée. Le diff propre à cette PR : le contrat `list*`/`types/contact.ts`, le module API `admin-contact`, la page `/admin/messages`, les tests. ## Contenu **Contrat partagé** - `listContactMessagesQuerySchema` (filtre `type` optionnel). - `types/contact.ts` : `ContactMessageAdminView` — `author: { id, firstName, lastName, email } | null` (`null` = compte supprimé depuis l'envoi). **API — `admin-contact.{routes,service}.ts`** - `GET /admin/api/contact?type=` (`requireAdmin`), tri `createdAt desc`, plafond `CONTACT_MESSAGES_PAGE_SIZE = 200` (même esprit que `CORRECTIONS_PAGE_SIZE` — vue de triage, pas export). - Branché dans `admin.routes.ts` (`adminRouter.use("/contact", adminContactRouter)`). **Aucune route d'écriture** — pas de workflow de traitement dans cette première version. **Front — page `/admin/messages`** - `MessagesPage` (+ `.scss`) : tableau lecture seule — date, expéditeur (nom + email, ou « Compte supprimé »), badge de type, message, page (`font-mono`), user-agent tronqué (valeur complète au survol). Un `<select>` filtre par type. - Entrée de nav « Messages » (icône `Inbox`) dans `AdminLayout` ; `adminApiClient.getContactMessages({ type })` ; i18n `admin.nav.messages` + bloc `admin.messages.*`. **Tests** - `apps/api/test/admin-contact.test.ts` (Mocha) : 401 sans session admin ; tri récent d'abord + `author` résolu ; filtre `type` ; `type` inconnu → 400 ; plafond 200 ; `author: null` après suppression du compte. - `apps/web/cypress/e2e/admin-messages.cy.ts` : rendu lecture seule (expéditeur / « Compte supprimé » / badge, aucun bouton d'action), filtre par type via le query param. **Docs** : `backend-architecture.md` (section `admin` : `ForgejoService` non, mais la route `GET /admin/api/contact` + l'event `contact.submitted` dans la liste). ## Vérifié localement `pnpm lint` ✅ · `pnpm build` ✅ · Cypress `admin-messages.cy.ts` + `admin-corrections.cy.ts` + `admin-layout.cy.ts` : 9/9 ✅. Mocha → CI. Closes #80. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
kyuno added 1 commit 2026-09-08 08:36:03 +02:00
feat(admin): consultation des messages de contact (#80)
All checks were successful
CI / lint (push) Successful in 3m52s
CI / build (push) Successful in 4m5s
CI / intent-service-test (push) Successful in 5m11s
CI / e2e (push) Successful in 8m11s
CI / test (push) Successful in 21m19s
CI / build-android (push) Has been skipped
712772dc02
PR 2/2 de l'issue #80 — la vue admin en lecture seule des messages
remontés via le formulaire de contact (PR 1 = #123).

- Contrat partagé : `listContactMessagesQuerySchema` (filtre `type`
  optionnel) + `types/contact.ts` `ContactMessageAdminView` (`author` =
  `{ id, firstName, lastName, email } | null`, `null` = compte supprimé).
- API : `admin-contact.{routes,service}.ts` — `GET /admin/api/contact?type=`
  (`requireAdmin`), tri `createdAt desc`, plafond `CONTACT_MESSAGES_PAGE_SIZE
  = 200` (même esprit que `CORRECTIONS_PAGE_SIZE`). Branché dans
  `admin.routes.ts` (`adminRouter.use(/contact, …)`). Aucune route
  d'écriture.
- Front : page `/admin/messages` (`MessagesPage` + `.scss`) — tableau
  lecture seule (date, expéditeur ou « Compte supprimé », badge de type,
  message, page, user-agent tronqué + titre au survol), un filtre par type.
  Entrée de nav « Messages » (icône `Inbox`) dans `AdminLayout` +
  `adminApiClient.getContactMessages` + i18n `admin.nav.messages` /
  `admin.messages.*`.
- Tests : `apps/api/test/admin-contact.test.ts` (Mocha — 401 sans session
  admin, tri récent d'abord + `author` résolu, filtre `type`, type inconnu →
  400, plafond 200, `author: null` après suppression du compte),
  `apps/web/cypress/e2e/admin-messages.cy.ts` (rendu lecture seule, filtre
  par type via le query param).
- Docs : `backend-architecture.md` (section `admin` + event
  `contact.submitted` dans la liste).

Closes #80.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
kyuno referenced this pull request from a commit 2026-09-08 08:57:50 +02:00
kyuno changed target branch from feat/contact-message-model-and-form to main 2026-09-08 09:17:59 +02:00
kyuno force-pushed feat/admin-contact-messages from 712772dc02 to 0c8cda7f3e 2026-09-08 09:18:13 +02:00 Compare
kyuno merged commit 71758e6d25 into main 2026-09-08 09:51:46 +02:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: kyuno/batchCooking#124
No description provided.