Three fixes from the earlier review, plus cleanup:
- submissions.service.ts: a newsletter opt-in present but failing
validation (e.g. malformed email) was silently dropped with no signal
to the client - the rest of the submission saved, but the visitor had
no way to know their newsletter signup didn't go through. Added
newsletterDropped to the submit response so the frontend can tell them.
- reports.admin.service.ts: the newsletter summary tracked
total/sent/pending/failed but silently omitted SKIPPED (stub-mode)
signups from any bucket - every current signup showed total>0 with
every bucket reading 0, indistinguishable from "we don't know what
happened". Added a skipped count.
- Consolidated two things duplicated across the module: sendServerError
(reimplemented ~11 times, three of those as identical local copies of
the same function) into feedback.errors.ts, and formatDatetime/
toMysqlDatetime (the same local-time formatting logic under two names,
in csv.service.ts and events.admin.service.ts respectively) into
feedback.dates.ts.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>