Commit Graph

44 Commits

Author SHA1 Message Date
Paddy 9811610d55 Update the deferred-security advice for the cutover
DEFERRED_SECURITY.md item 1 still told the calendar to move its session
credentials from query parameters into X-Session-Id/X-Session-Key. That
was the right advice when two other modules read those headers; both
stopped in the cutover, so following it now would build a second
mechanism just as the first is being retired. The fix is the shared
admin identity, which closes the item outright rather than moving the
credential somewhere safer.

Also annotates the one assertion in auth-binding.ts that cannot
currently fail. It is kept deliberately - it is a tripwire against
someone reintroducing a header-session fallback for calendar users who
have not been invited yet, which is the shortcut this whole step exists
to close - but that was worth saying out loud rather than leaving it to
look like an oversight.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-06 14:44:27 +02:00
Paddy 2405625f99 Put the feedback and tickets admin areas behind the shared identity
feedback.auth.ts and tickets.auth.ts each become one binding to
requireAppAccess. Everything downstream was already written against
requireAdminAuth and res.locals.admin, and both still mean what they
meant, so no router or service changed. What changed is the policy: an
activated @nachklang.art account is no longer sufficient, an explicit
per-app permission is.

Three things followed from that and are not obvious from the diff:

- APP_ORIGINS gets a production default. It feeds better-auth's
  trustedOrigins, and this is the first time the tickets and feedback
  origins matter there - before, the only browser origin that ever
  reached /admin/auth was the admin app itself. An origin missing from
  that list fails in a way that is easy to misread: sign-in works, the
  app works, and only sign-out returns an origin error.

- Nothing reads X-Session-* any more; these two files were the last
  readers, and the calendar module passes its session in query
  parameters. The headers stay in the CORS allowedHeaders only so a
  browser still running a pre-cutover bundle gets a clean 401 rather
  than a preflight failure, and can come out once both frontends are
  deployed.

- 40 admin operations documented a required X-Session-Id/X-Session-Key
  in swagger. They now declare the AdminSessionCookie scheme the admin
  module already defined, and each documents a 403 next to its 401.

The integration assertions flip as their own comment predicted: one
admin cookie opens both /feedback/admin/me and /tickets/admin/me, a
user holding only feedback gets 200 and 403 respectively, and a legacy
header session gets 401. The unit test that covered the old header
authenticator is replaced by one asserting each module is bound to its
own app and that neither consults the calendar users service.

163 unit tests and 43 integration tests green.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-06 14:10:42 +02:00
Paddy bf7be65b03 Add admin identity module: better-auth, per-app permissions, invitations (#12)
Jenkins Production Deployment
Reviewed-on: #12
Co-authored-by: Patrick Müller <mail@pmueller.me>
Co-committed-by: Patrick Müller <mail@pmueller.me>
2026-09-06 10:41:54 +00:00
Paddy ce9b173c71 Merge pull request 'Document dotenv 16 quoting rule for .env values' (#11) from feature/api-esm-prep into master
Reviewed-on: #11
2026-09-05 14:13:29 +00:00
Paddy bf7f45acce Document dotenv 16 quoting rule for .env values
A production password containing '#' was truncated after the dotenv 8 -> 16
bump (unquoted '#' now starts a comment), causing MariaDB access denied.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-05 16:11:50 +02:00
Paddy 10c459db0f Merge pull request 'Migrate the API to native ESM and vitest; pin Node 26' (#10) from feature/api-esm-prep into master
Jenkins Production Deployment
Reviewed-on: #10
2026-09-05 14:05:13 +00:00
Paddy 3ea9e630ed Migrate the API to native ESM and vitest; pin Node 26
Prep PR for the admin auth module (docs/plan-admin-auth.md step 1).
better-auth 1.7 ships ESM only, so the API moves off CommonJS:

- "type": "module", module nodenext, target ES2024, .js suffixes on all
  relative imports, require('mariadb'|'cors') replaced by imports, and
  export= packages (winston, app-root-path, bcrypt) consumed via default
  imports. The logger now uses appRoot.path explicitly.
- TypeScript 5.9, @types/node 26, tslint removed. Node 26 pinned via
  engines and .nvmrc (Plesk runs 26).
- Jest 28 + ts-jest replaced by vitest 5. Eight test files depend on
  hoisted module mocks with static imports and resetModules + require,
  which Jest's ESM mode does not support; vitest keeps them nearly
  verbatim. Coverage via @vitest/coverage-v8 (lcov), Sonar generic report
  via vitest-sonar-reporter, so sonar-project.properties is unchanged.
  vitest.config.ts sets FEEDBACK_IP_SALT so the suite passes without a
  local .env.
- dotenv 8 -> 16 and axios 0.24 -> 1.x: their old typings are not
  resolvable under nodenext.
- autoCommit: false dropped from the pool configs; it is not a mariadb
  connector option and was silently ignored.

tsc clean, 96/96 tests green, compiled app boots and serves /, /docs and
CORS under Node ESM.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-05 16:02:26 +02:00
Paddy 449edd6c68 Relay transactional email through Salesforce instead of SMTP (#9)
Jenkins Production Deployment
Reviewed-on: #9
Co-authored-by: Patrick Müller <patrick@mueller-patrick.tech>
Co-committed-by: Patrick Müller <patrick@mueller-patrick.tech>
2026-08-31 16:17:59 +00:00
Paddy 3c4f3331d8 Add Tickets domain for the voucher-based ticket shop (#8)
Jenkins Production Deployment
Reviewed-on: #8
Co-authored-by: Patrick Mueller <patrick@mueller-patrick.tech>
Co-committed-by: Patrick Mueller <patrick@mueller-patrick.tech>
2026-08-24 21:18:00 +00:00
Paddy b05f6b9da0 Add Feedback domain module: public submission flow, admin CRUD, reporting (#7)
Jenkins Production Deployment
Co-authored-by: Patrick Müller <mail@pmueller.me>
Reviewed-on: #7
Co-authored-by: Patrick Mueller <patrick@mueller-patrick.tech>
Co-committed-by: Patrick Mueller <patrick@mueller-patrick.tech>
2026-08-23 09:39:02 +00:00
Paddy e7621b8290 Merge pull request 'Add claude init file + refactor some security issues' (#6) from feature/aiRefactoring20260502 into master
Jenkins Production Deployment
Reviewed-on: #6
2026-06-28 11:25:23 +00:00
Paddy da85d1487c Add claude init file + refactor some security issues 2026-05-02 12:22:03 +02:00
Paddy dc65b49219 Add possibility to add birthdays + repeating events to the API
Jenkins Production Deployment
2025-09-07 18:15:15 +02:00
Paddy 9c45fb11ee Add last modified information to event GET endpoints
Jenkins Production Deployment
2025-05-29 12:51:51 +02:00
Paddy 45dfc22c60 Add endpoint for getting upcoming event and adding swagger docs to all endpoints
Jenkins Production Deployment
2025-04-18 15:05:32 +02:00
Paddy a38fb20e5a Add endpoint that allows to move an event to a different calendar
Jenkins Production Deployment
2024-06-04 11:55:30 +02:00
Paddy cb85e81d67 Add new "choir" calendar and add cascading functionality for calendars
Jenkins Production Deployment
2024-06-04 11:17:28 +02:00
Paddy 59fee19a76 Fix issue with sending mails
Jenkins Production Deployment
2023-12-30 23:11:50 +01:00
Paddy a79e2186a2 Fix activation endpoint HTTP method
Jenkins Production Deployment
2023-12-30 22:55:40 +01:00
Paddy 8f93e1ab7d Add password reset endpoints and mail service for user activation
Jenkins Production Deployment
2023-12-30 22:50:47 +01:00
Paddy 34a4a6664f Fix bug where some fields were not sent back via the api
Jenkins Production Deployment
2023-05-15 20:50:50 +02:00
Paddy 76e6bbdbbf Add event versioning capabilities
Jenkins Production Deployment
2023-05-15 20:28:42 +02:00
Paddy 5e84eaea70 Future-proof admin interface of the api, make the api fully capable of handling event status 2023-05-15 19:40:44 +02:00
Paddy b8a68c2480 Add status column for events
Jenkins Production Deployment
2023-05-14 21:26:55 +02:00
Paddy 95983021ed Rework user interface field API names
Jenkins Production Deployment
2023-05-14 21:09:34 +02:00
Paddy 02f7424b56 Upgrade to proper user management 2023-05-14 19:17:30 +02:00
Paddy 93c70b0e1d #1: Add possibility to create whole-day events
Jenkins Production Deployment
2022-12-28 12:15:01 +01:00
Paddy d85f9a992b #2: Remove empty fields from generated ical
Jenkins Production Deployment
2022-12-28 11:34:25 +01:00
Paddy fc071096d8 Fix URL null error when no url is given in event
Jenkins Production Deployment
2022-12-28 01:20:06 +01:00
Paddy a34a5df5a3 Interface change to return eventId after POST call
Jenkins Production Deployment
2022-12-26 15:58:24 +01:00
Paddy 65a5e91ad1 Making createdBy field required
Jenkins Production Deployment
2022-12-25 21:50:21 +01:00
Paddy 6cb7f0d59b Interface adjustments
Jenkins Production Deployment
2022-12-25 20:53:09 +01:00
Paddy ccfa28877c Adjust privileges mgmt
Jenkins Production Deployment
2022-12-25 18:24:18 +01:00
Paddy a8f7189cb3 git add . is a difficult command to execute
Jenkins Production Deployment
2022-12-25 15:43:37 +01:00
Paddy 83c9d090e1 Add methods to insert, update and delete events
Jenkins Production Deployment
2022-12-25 15:38:13 +01:00
Paddy 0348d89121 Add credentials check and rework request structure 2022-12-25 13:49:38 +01:00
Paddy ed9b7dafe0 Update mariadb library
Jenkins Production Deployment
2022-12-24 20:51:31 +01:00
Paddy e76dc7405b Change mariadb connector version
Jenkins Production Deployment
2022-12-24 20:48:54 +01:00
Paddy 9c6befc7b5 More debugging
Jenkins Production Deployment
2022-12-24 20:42:32 +01:00
Paddy 5dd3953542 Debug DB connection
Jenkins Production Deployment
2022-12-24 20:40:02 +01:00
Paddy e08cd70eef Proper error handling
Jenkins Production Deployment
2022-12-24 20:32:29 +01:00
Paddy b00a37eb17 Add iCal converter
Jenkins Production Deployment
2022-12-24 17:44:28 +01:00
Paddy 96f04c6de4 Add JSON Endpoint for events 2022-12-24 15:03:37 +01:00
Paddy 3996e37682 Initial commit 2022-12-24 14:32:13 +01:00