veza/veza-backend-api/internal
senke 41f4a50618 feat(auth): RGPD/COPPA age gate at registration (16+ minimum)
v1.0.10 légal item 2. The signup endpoint /api/v1/auth/register and
its frontend form now require a date of birth and refuse registrations
where the registrant would be < 16 years old at registration time.

Threshold rationale :
  COPPA (US, < 13 forbidden) + RGPD strict (< 16 needs parental
  consent in every EU member state at the highest interpretation).
  16 is the conservative single cutoff that satisfies both regimes
  without per-jurisdiction branching. If a future market needs a
  different threshold, change MinRegistrationAgeYears in
  internal/core/auth/service.go ; the frontend reads the same
  constant so they stay aligned.

Backend changes
  * dto.RegisterRequest gets a `Birthdate string` field, validated
    `required,datetime=2006-01-02` so swaggo / orval emit the right
    OpenAPI schema and the validator catches malformed values
    before the handler even runs.
  * AuthService.Register signature is now
    (ctx, email, username, password, birthdate *time.Time). The
    pointer lets internal seed paths / tests pass nil while the
    public handler always supplies a parsed value.
  * Age check uses a yearsBetween helper that handles the "anniversary
    hasn't passed yet this year" case correctly (someone born
    2008-05-01 is 16 on 2008+16-05-01, not on 2008+16-01-01).
  * New sentinel auth.ErrUnderage ; handler maps it to 400 with a
    friendly message ("You must be at least 16 years old to register")
    so the SPA can render the right copy without parsing the message.
  * 11 test call sites updated : test-only paths pass nil ; the
    public-handler test (TestRegister_Success) and the in-package
    handler test pass a fixture Birthdate "2000-01-15".

Frontend changes
  * RegisterFormData type + zod schema in RegisterForm.tsx + initial
    form state get a `birthdate` field.
  * RegisterPageForm.tsx renders an `<AuthInput type="date">` with a
    `max=` attr 16 years ago today (UX guard ; legal floor stays in
    the API).
  * useRegisterPage's validate() computes age client-side with the
    same algorithm as backend ; emits localised errors
    `birthdateRequired` / `birthdateInvalid` / `birthdateUnderage`
    so the user gets immediate feedback.
  * services/api/auth.ts RegisterRequest interface + register()
    body include the new field.

Tests : `go test ./internal/core/auth ./internal/handlers -short`
passes ; `tsc --noEmit` clean ; `eslint src` 754 (baseline unchanged).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 18:05:47 +02:00
..
api feat(search): faceted filters (genre/key/BPM/year) + FacetSidebar UI (W4 Day 18) 2026-04-29 10:33:35 +02:00
common v0.9.2 2026-03-05 19:27:34 +01:00
config feat(stream): HLS default on + marketplace 30s pre-listen + FLAC tier checkbox (W4 Day 17) 2026-04-29 09:56:02 +02:00
core feat(auth): RGPD/COPPA age gate at registration (16+ minimum) 2026-05-01 18:05:47 +02:00
database v0.9.4 2026-03-05 23:03:43 +01:00
dto feat(auth): RGPD/COPPA age gate at registration (16+ minimum) 2026-05-01 18:05:47 +02:00
elasticsearch fix(backend): unblock handlers + elasticsearch test packages 2026-04-30 14:48:23 +02:00
email refactor(backend,infra): unify SMTP env schema on canonical SMTP_* names 2026-04-16 20:44:09 +02:00
errors v0.9.8 2026-03-06 19:13:16 +01:00
eventbus fix(eventbus): log RabbitMQ publish failures instead of silent drop 2026-04-16 20:50:51 +02:00
features adding initial backend API (Go) 2025-12-03 20:29:37 +01:00
handlers feat(auth): RGPD/COPPA age gate at registration (16+ minimum) 2026-05-01 18:05:47 +02:00
infrastructure v0.9.4 2026-03-05 23:03:43 +01:00
integration style(backend): gofmt -w on 85 files (whitespace only) 2026-04-14 12:22:14 +02:00
interfaces adding initial backend API (Go) 2025-12-03 20:29:37 +01:00
jobs feat(webhooks): persist raw hyperswitch payloads to audit log — v1.0.7 item E 2026-04-18 02:44:58 +02:00
logging style(backend): gofmt -w on 85 files (whitespace only) 2026-04-14 12:22:14 +02:00
metrics feat(cdn): Bunny.net signed URLs + HLS cache headers + metric collision fix (W3 Day 13) 2026-04-28 14:07:20 +02:00
middleware feat(redis): Sentinel HA + cache hit rate metrics (W3 Day 11) 2026-04-28 13:36:55 +02:00
models feat(legal): DMCA notice handler + admin queue + 451 playback gate (W3 Day 14) 2026-04-28 15:39:33 +02:00
monitoring feat(cdn): Bunny.net signed URLs + HLS cache headers + metric collision fix (W3 Day 13) 2026-04-28 14:07:20 +02:00
pagination v0.9.8 2026-03-06 19:13:16 +01:00
recovery chore(v0.102): consolidate remaining changes — docs, frontend, backend 2026-02-20 13:02:12 +01:00
repositories fix(v0.12.6.1): remediate 2 CRITICAL + 10 HIGH + 1 MEDIUM pentest findings 2026-03-12 05:40:53 +01:00
resilience chore: consolidate CI, E2E, backend and frontend updates 2026-02-17 16:43:21 +01:00
response fix: stabilize builds, tests, and lint across all stacks 2026-04-05 16:48:07 +02:00
security refactor(backend): replace 40 fmt.Printf calls with zap structured logging 2026-02-22 17:44:38 +01:00
services feat(search): faceted filters (genre/key/BPM/year) + FacetSidebar UI (W4 Day 18) 2026-04-29 10:33:35 +02:00
shutdown incus deployement fully implemented, Makefile updated and make fmt ran 2026-01-13 19:47:57 +01:00
testutils ci: retire legacy backend-ci.yml, centralize Docker probe in SkipIfNoIntegration 2026-04-15 16:12:45 +02:00
tracing feat(observability): OTel SDK + collector + Tempo + 4 hot path spans (W2 Day 9) 2026-04-28 01:15:11 +02:00
types fix(backend): commit swagger annotation pass + missing handler methods 2026-05-01 10:16:57 +02:00
upload [INT-015] int: Add file upload format standardization 2025-12-25 15:40:01 +01:00
utils fix(v0.12.6): apply all pentest remediations — 36 findings across 36 files 2026-03-14 00:44:46 +01:00
validators feat(v0.13.3): complete - Polish Sécurité Avancée 2026-03-13 10:09:01 +01:00
websocket feat(redis): Sentinel HA + cache hit rate metrics (W3 Day 11) 2026-04-28 13:36:55 +02:00
workers feat(transcode): read from S3 signed URL when track is s3-backed (v1.0.8 P2) 2026-04-23 23:34:51 +02:00