6 Commits

Author SHA1 Message Date
Julien Calixte
2b4d056ab8 feat(export): download project photos as a grouped zip
Add POST /api/export {projectIds}: one folder per project (named after it),
photos named <lastname-firstname>.<ext>, with a generated initials SVG for
Members without a Slack photo. Dedupe image fetches, bounded concurrency, fflate
zip. Factor data.ts so routes + export share one fixtures/live gating path.
Frontend: Export-photos button downloads the zip.
2026-06-26 16:29:05 +01:00
Julien Calixte
09238df7e3 style: apply oxfmt to backend + docs 2026-06-26 16:25:08 +01:00
Julien Calixte
de98bdeef7 feat(slack): cached directory matching + manual refresh
Rework cache to a slack_directory snapshot + refreshed_at (ADR-0001). Sweep the
workspace via users.list (skip deleted/bots), match Members by email in memory,
30-day TTL. Members response carries slack status (ok|degraded|unconfigured);
degrade to initials on Slack failure. Add POST /api/slack/refresh.
2026-06-26 16:20:52 +01:00
Julien Calixte
e47302218b feat(napta): resolve project Members (real+active, role, sorted)
Filter user_project by project + simulated=false, include user, drop inactive
people, dedupe per user, map user_position -> Role, sort by last name.
2026-06-26 16:20:51 +01:00
Julien Calixte
9ded10f68e feat(napta): client-credentials auth + real project listing
Napta uses Auth0 M2M, not a static token: exchange client_id/secret for a cached
JWT, then list non-archived projects via JSON:API (include client name). Falls back
to fixtures when NAPTA_CLIENT_ID/SECRET are unset. Member resolution still stubbed.
2026-06-26 16:16:06 +01:00
Julien Calixte
528251f176 chore: initial scaffold
Vite + Vue 3 + DaisyUI SPA (project picker + Slack avatar member grid) with a
TypeScript/Node (Hono) backend proxying Napta + Slack, SQLite avatar cache via
node:sqlite, and docker-compose for Coolify deploy.
2026-06-26 15:26:20 +01:00