Commit Graph
338 Commits
Author SHA1 Message Date
popertots ae2acc45c3 chore: bump eslint 9.39.4 -> 9.39.5
CI / Env docs check (push) Successful in 1m46s
CI / Docker compose check (push) Successful in 51s
CI / Nginx config check (push) Successful in 55s
CI / Frontend deps check (push) Successful in 1m52s
CI / Frontend major deps (push) Failing after 1m6s
CI / Go build (push) Successful in 2m14s
CI / Frontend build (push) Successful in 1m29s
CI / Secrets scan (push) Successful in 2m26s
CI / Knip (push) Successful in 1m4s
CI / Frontend a11y check (push) Successful in 2m18s
CI / Go vet (prod) (push) Successful in 1m51s
CI / Go vet (dev) (push) Successful in 2m11s
CI / go mod tidy (push) Successful in 40s
CI / Staticcheck (prod) (push) Successful in 2m43s
CI / Frontend QC (audit) (push) Successful in 58s
CI / Go vulnerabilities (push) Successful in 1m27s
CI / Staticcheck (dev) (push) Successful in 3m20s
CI / golangci-lint (push) Successful in 3m30s
CI / Frontend QC (typecheck) (push) Successful in 1m26s
CI / Frontend QC (lint) (push) Successful in 1m54s
CI / Security scan (dev) (push) Successful in 4m38s
CI / Security scan (prod) (push) Successful in 4m2s
CI / Svelte strict check (push) Successful in 57s
CI / Tests (prod) (push) Failing after 3m55s
CI / Tests (dev) (push) Failing after 4m9s
CI / Race (prod) (push) Failing after 7m35s
CI / Race (dev) (push) Failing after 7m44s
2026-07-11 00:31:40 +01:00
popertots de37b07233 fix: use savepoint pattern for today test (matches other tests in file)
CI / Docker compose check (push) Successful in 16s
CI / Env docs check (push) Successful in 18s
CI / Nginx config check (push) Successful in 17s
CI / Frontend deps check (push) Failing after 28s
CI / Frontend major deps (push) Failing after 28s
CI / Knip (push) Has been skipped
CI / Frontend a11y check (push) Has been skipped
CI / Secrets scan (push) Successful in 41s
CI / Go build (push) Successful in 41s
CI / Frontend build (push) Successful in 45s
CI / Svelte strict check (push) Has been skipped
CI / Frontend QC (audit) (push) Has been skipped
CI / Frontend QC (typecheck) (push) Has been skipped
CI / Frontend QC (lint) (push) Has been skipped
CI / go mod tidy (push) Successful in 18s
CI / Go vet (prod) (push) Successful in 1m46s
CI / Go vulnerabilities (push) Successful in 2m2s
CI / Go vet (dev) (push) Successful in 2m22s
CI / Staticcheck (prod) (push) Successful in 2m31s
CI / Staticcheck (dev) (push) Successful in 3m29s
CI / golangci-lint (push) Successful in 3m38s
CI / Security scan (prod) (push) Successful in 4m5s
CI / Security scan (dev) (push) Successful in 4m6s
CI / Tests (prod) (push) Has been cancelled
CI / Tests (dev) (push) Has been cancelled
CI / Race (prod) (push) Has been cancelled
CI / Race (dev) (push) Has been cancelled
2026-07-11 00:26:14 +01:00
popertots fe47cb486a fix: replace 3.5s sleep with poll loop in till checkout test
CI / Docker compose check (push) Successful in 51s
CI / Env docs check (push) Successful in 55s
CI / Frontend major deps (push) Failing after 55s
CI / Secrets scan (push) Successful in 58s
CI / Frontend deps check (push) Successful in 57s
CI / Frontend build (push) Successful in 55s
CI / Go build (push) Successful in 57s
CI / Nginx config check (push) Successful in 56s
CI / go mod tidy (push) Successful in 20s
CI / Go vet (prod) (push) Successful in 2m17s
CI / Go vulnerabilities (push) Successful in 1m56s
CI / Go vet (dev) (push) Successful in 2m21s
CI / Staticcheck (prod) (push) Successful in 2m57s
CI / Frontend a11y check (push) Failing after 57s
CI / Staticcheck (dev) (push) Successful in 3m16s
CI / Knip (push) Successful in 1m7s
CI / golangci-lint (push) Successful in 3m36s
CI / Frontend QC (audit) (push) Successful in 1m8s
CI / Security scan (prod) (push) Successful in 4m37s
CI / Security scan (dev) (push) Successful in 4m43s
CI / Frontend QC (typecheck) (push) Successful in 1m20s
CI / Frontend QC (lint) (push) Successful in 1m37s
CI / Svelte strict check (push) Successful in 2m18s
CI / Tests (prod) (push) Successful in 3m25s
CI / Tests (dev) (push) Failing after 3m32s
CI / Race (prod) (push) Successful in 7m11s
CI / Race (dev) (push) Successful in 7m25s
2026-07-10 20:53:42 +01:00
popertots 50ce98d729 fix: remove dead GenerateRefreshToken calls (tokens never consumed) 2026-07-10 20:52:47 +01:00
popertots a4a80246d1 fix: restore S3 error stubs, add CI timeouts, gofmt handlers.go, fix comment
CI / Env docs check (push) Successful in 14s
CI / Docker compose check (push) Successful in 20s
CI / Nginx config check (push) Successful in 20s
CI / Frontend major deps (push) Failing after 30s
CI / Frontend deps check (push) Successful in 31s
CI / Secrets scan (push) Successful in 38s
CI / Go build (push) Successful in 38s
CI / Frontend build (push) Successful in 42s
CI / Knip (push) Successful in 40s
CI / Frontend a11y check (push) Successful in 2m2s
CI / Go vet (prod) (push) Successful in 1m56s
CI / Go vet (dev) (push) Successful in 2m7s
CI / Staticcheck (prod) (push) Successful in 2m51s
CI / Staticcheck (dev) (push) Successful in 3m3s
CI / go mod tidy (push) Successful in 1m17s
CI / Frontend QC (audit) (push) Successful in 1m34s
CI / golangci-lint (push) Successful in 3m44s
CI / Go vulnerabilities (push) Successful in 2m10s
CI / Frontend QC (typecheck) (push) Successful in 1m29s
CI / Security scan (prod) (push) Successful in 4m3s
CI / Security scan (dev) (push) Successful in 4m37s
CI / Frontend QC (lint) (push) Successful in 1m40s
CI / Svelte strict check (push) Successful in 1m22s
CI / Tests (prod) (push) Successful in 3m12s
CI / Tests (dev) (push) Successful in 3m32s
CI / Race (prod) (push) Successful in 7m12s
CI / Race (dev) (push) Successful in 7m22s
- s3.go: restore error returns on prod Upload/Download/Delete stubs
  (silent nil was dangerous — callers would think writes succeeded)
- CI: add -timeout 300s to tests, -timeout 480s to race, GO_TESTING to race env
- handlers.go: gofmt indentation fix for GetCheckoutStatus struct literal
- validators.go: fix comment to include A-F (matched the regex)
2026-07-10 20:39:17 +01:00
popertots 2cd35ea84a fix: S3-dependent tests skip in prod, add GO_TESTING to CI for dav init
CI / Env docs check (push) Successful in 15s
CI / Nginx config check (push) Successful in 21s
CI / Docker compose check (push) Successful in 22s
CI / Frontend deps check (push) Successful in 22s
CI / Frontend major deps (push) Failing after 40s
CI / Secrets scan (push) Successful in 44s
CI / Go build (push) Successful in 45s
CI / Frontend build (push) Successful in 1m8s
CI / Knip (push) Successful in 41s
CI / Frontend a11y check (push) Successful in 1m20s
CI / go mod tidy (push) Successful in 35s
CI / Go vet (prod) (push) Successful in 2m35s
CI / Go vet (dev) (push) Successful in 2m36s
CI / Go vulnerabilities (push) Successful in 1m27s
CI / Staticcheck (prod) (push) Successful in 3m13s
CI / Frontend QC (audit) (push) Successful in 50s
CI / Staticcheck (dev) (push) Successful in 3m31s
CI / golangci-lint (push) Successful in 4m0s
CI / Frontend QC (typecheck) (push) Successful in 1m35s
CI / Security scan (prod) (push) Successful in 4m28s
CI / Security scan (dev) (push) Successful in 4m33s
CI / Frontend QC (lint) (push) Successful in 1m59s
CI / Svelte strict check (push) Successful in 1m5s
CI / Tests (prod) (push) Successful in 4m8s
CI / Tests (dev) (push) Successful in 4m13s
CI / Race (prod) (push) Successful in 8m3s
CI / Race (dev) (push) Failing after 8m14s
2026-07-10 18:45:18 +01:00
popertots cbaed41056 fix: restrict user_coverage_test build to test && dev
CI / Env docs check (push) Successful in 45s
CI / Frontend deps check (push) Successful in 45s
CI / Secrets scan (push) Successful in 49s
CI / Frontend major deps (push) Failing after 46s
CI / Go build (push) Successful in 47s
CI / Nginx config check (push) Successful in 44s
CI / Docker compose check (push) Successful in 46s
CI / Frontend build (push) Successful in 1m22s
CI / Knip (push) Successful in 46s
CI / Go vet (prod) (push) Successful in 1m32s
CI / Frontend a11y check (push) Successful in 2m0s
CI / Go vet (dev) (push) Successful in 2m1s
CI / go mod tidy (push) Successful in 34s
CI / Frontend QC (audit) (push) Successful in 39s
CI / Staticcheck (prod) (push) Successful in 2m51s
CI / Staticcheck (dev) (push) Successful in 3m57s
CI / Frontend QC (typecheck) (push) Successful in 1m51s
CI / Go vulnerabilities (push) Successful in 1m58s
CI / golangci-lint (push) Successful in 4m1s
CI / Security scan (prod) (push) Successful in 3m53s
CI / Frontend QC (lint) (push) Successful in 2m5s
CI / Security scan (dev) (push) Successful in 4m12s
CI / Svelte strict check (push) Successful in 1m18s
CI / Tests (prod) (push) Failing after 2m59s
CI / Tests (dev) (push) Successful in 3m33s
CI / Race (prod) (push) Failing after 7m40s
CI / Race (dev) (push) Failing after 8m0s
2026-07-10 18:24:39 +01:00
popertots 3029fd5179 test: add coverage tests across backend + fix mock for PENDING checkout support
CI / Nginx config check (push) Successful in 13s
CI / Env docs check (push) Successful in 15s
CI / Docker compose check (push) Successful in 15s
CI / Frontend major deps (push) Failing after 24s
CI / Frontend deps check (push) Successful in 30s
CI / Secrets scan (push) Successful in 38s
CI / Go build (push) Successful in 39s
CI / Frontend build (push) Successful in 1m3s
CI / Knip (push) Successful in 45s
CI / Go vet (prod) (push) Failing after 1m42s
CI / Frontend a11y check (push) Successful in 2m34s
CI / Go vet (dev) (push) Successful in 2m29s
CI / Staticcheck (prod) (push) Failing after 2m38s
CI / go mod tidy (push) Successful in 1m3s
CI / Staticcheck (dev) (push) Successful in 2m55s
CI / Frontend QC (audit) (push) Successful in 51s
CI / golangci-lint (push) Successful in 3m22s
CI / Go vulnerabilities (push) Successful in 1m26s
CI / Frontend QC (typecheck) (push) Successful in 2m18s
CI / Security scan (prod) (push) Successful in 4m18s
CI / Security scan (dev) (push) Successful in 4m40s
CI / Tests (prod) (push) Has been skipped
CI / Tests (dev) (push) Has been skipped
CI / Race (prod) (push) Has been skipped
CI / Race (dev) (push) Has been skipped
CI / Frontend QC (lint) (push) Successful in 2m18s
CI / Svelte strict check (push) Successful in 43s
New test files cover previously untested paths across DAV, validators,
S3, Square, mw, bookings, user, and payments packages.

Includes mock fix: HoldCheckouts flag on MockClient allows tests to
pause auto-complete goroutine for testing PENDING checkout states.

Coverage: 50.4% → 65.0% (+14.6pp)
2026-07-10 18:13:44 +01:00
popertots 990c86495c fix: suppress unused nonDepositPaymentType in prod-staticcheck
CI / Docker compose check (push) Successful in 1m6s
CI / Env docs check (push) Successful in 1m6s
CI / Frontend deps check (push) Successful in 1m9s
CI / Frontend major deps (push) Failing after 1m9s
CI / Secrets scan (push) Successful in 1m9s
CI / Go build (push) Successful in 1m10s
CI / Frontend build (push) Successful in 1m10s
CI / Nginx config check (push) Successful in 1m12s
CI / Knip (push) Successful in 25s
CI / Go vet (prod) (push) Successful in 2m1s
CI / Frontend a11y check (push) Successful in 2m13s
CI / Go vet (dev) (push) Successful in 2m20s
CI / go mod tidy (push) Successful in 1m18s
CI / Staticcheck (prod) (push) Successful in 3m23s
CI / Staticcheck (dev) (push) Successful in 3m25s
CI / golangci-lint (push) Successful in 3m51s
CI / Frontend QC (audit) (push) Successful in 2m9s
CI / Security scan (prod) (push) Successful in 4m5s
CI / Security scan (dev) (push) Successful in 4m31s
CI / Go vulnerabilities (push) Successful in 2m22s
CI / Frontend QC (lint) (push) Failing after 1m11s
CI / Frontend QC (typecheck) (push) Successful in 1m21s
CI / Svelte strict check (push) Has been skipped
CI / Tests (prod) (push) Successful in 1m52s
CI / Tests (dev) (push) Failing after 2m12s
CI / Race (prod) (push) Successful in 3m31s
CI / Race (dev) (push) Successful in 5m0s
2026-07-10 13:00:33 +01:00
popertots 3d337b61b8 fix: remove t.Parallel from VAT tests to eliminate deadlock flakiness
CI / Nginx config check (push) Successful in 10s
CI / Docker compose check (push) Successful in 11s
CI / Env docs check (push) Successful in 11s
CI / Frontend major deps (push) Failing after 25s
CI / Frontend deps check (push) Successful in 26s
CI / Secrets scan (push) Successful in 40s
CI / Go build (push) Successful in 40s
CI / Frontend build (push) Successful in 1m8s
CI / Knip (push) Successful in 38s
CI / Go vet (prod) (push) Successful in 1m51s
CI / Frontend a11y check (push) Failing after 2m3s
CI / Go vet (dev) (push) Successful in 2m1s
CI / go mod tidy (push) Successful in 1m24s
CI / Staticcheck (prod) (push) Failing after 3m19s
CI / Staticcheck (dev) (push) Successful in 3m20s
CI / golangci-lint (push) Successful in 3m22s
CI / Go vulnerabilities (push) Successful in 1m30s
CI / Frontend QC (audit) (push) Successful in 2m14s
CI / Frontend QC (lint) (push) Failing after 1m5s
CI / Frontend QC (typecheck) (push) Successful in 1m16s
CI / Security scan (dev) (push) Failing after 4m7s
CI / Security scan (prod) (push) Failing after 4m4s
CI / Tests (prod) (push) Has been skipped
CI / Tests (dev) (push) Has been skipped
CI / Race (prod) (push) Has been skipped
CI / Race (dev) (push) Has been skipped
CI / Svelte strict check (push) Has been skipped
2026-07-10 12:49:57 +01:00
popertots 19d1d8dd47 fix: correct prop names in Svelte templates after a11y cleanup 2026-07-10 12:27:08 +01:00
popertots 0c91482aac fix: adjust upload limits to 20MB profile, 30MB portfolio 2026-07-10 12:25:25 +01:00
popertots 9ea929901a fix: exclude RefreshToken from JSON response (G117)
CI / Env docs check (push) Successful in 8s
CI / Docker compose check (push) Successful in 14s
CI / Nginx config check (push) Successful in 17s
CI / Frontend deps check (push) Successful in 31s
CI / Frontend major deps (push) Failing after 32s
CI / Secrets scan (push) Successful in 38s
CI / Go build (push) Successful in 39s
CI / Frontend build (push) Successful in 1m14s
CI / Knip (push) Successful in 37s
CI / Frontend a11y check (push) Failing after 1m52s
CI / Go vet (prod) (push) Successful in 1m51s
CI / Go vet (dev) (push) Successful in 1m51s
CI / Staticcheck (prod) (push) Failing after 2m2s
CI / Staticcheck (dev) (push) Failing after 2m3s
CI / golangci-lint (push) Successful in 2m10s
CI / go mod tidy (push) Successful in 48s
CI / Frontend QC (audit) (push) Successful in 47s
CI / Frontend QC (lint) (push) Failing after 1m0s
CI / Go vulnerabilities (push) Successful in 1m14s
CI / Frontend QC (typecheck) (push) Failing after 1m10s
CI / Svelte strict check (push) Has been skipped
CI / Security scan (prod) (push) Failing after 4m5s
CI / Security scan (dev) (push) Failing after 4m11s
CI / Tests (prod) (push) Has been skipped
CI / Tests (dev) (push) Has been skipped
CI / Race (prod) (push) Has been skipped
CI / Race (dev) (push) Has been skipped
2026-07-10 12:09:54 +01:00
popertots 3a9bc02796 fix: check ParseMultipartForm errors, reduce maxMemory, handle 413 properly 2026-07-10 12:06:12 +01:00
popertots ef3cfe8c4f fix: replace crypto/md5 with crypto/sha256 for IP hashing 2026-07-10 12:04:49 +01:00
popertots d1e85bb855 fix: add missing err checks and fix loop termination in tests 2026-07-10 12:03:11 +01:00
popertots cf0cd8de15 fix: remove 10 unused test functions flagged by staticcheck U1000 2026-07-10 12:01:02 +01:00
popertotsandSisyphus 407de74b51 fix: restore test-used functions, silence tx.Rollback closed errors, prune knip dead code
CI / Frontend deps check (push) Successful in 22s
CI / Go vulnerabilities (push) Successful in 32s
CI / Go build (push) Successful in 32s
CI / go mod tidy (push) Successful in 13s
CI / Knip (push) Failing after 33s
CI / Frontend build (push) Successful in 1m12s
CI / Svelte strict check (push) Has been skipped
CI / Frontend QC (audit) (push) Has been skipped
CI / Frontend QC (typecheck) (push) Has been skipped
CI / Frontend QC (lint) (push) Has been skipped
CI / Go vet (push) Successful in 57s
CI / golangci-lint (push) Successful in 1m8s
CI / Tests (prod) (push) Successful in 1m45s
CI / Tests (dev) (push) Successful in 2m5s
CI / Race (prod) (push) Successful in 3m27s
CI / Race (dev) (push) Successful in 4m52s
Restore processImage (images.go) and nonDepositPaymentType (handlers.go) with //nolint:unused — used in test files.
Fix 97 tx.Rollback defers to silently discard expected "tx is closed" error after commit.
Frontend: remove 44 unused shadcn-svelte files, 2 dead components, 9 stale npm deps, prune unused exports.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-07-09 19:20:25 +01:00
popertotsandSisyphus ed9cb1489c fix: resolve golangci-lint violations (errcheck, unused, gosimple, ineffassign)
errcheck: add proper error handling with slog.Error for tx.Rollback, key generation, and s3/dav operations. Add nolint comments for intentionally discarded DB scan errors and HTTP write errors.
unused: remove dead code (svcRow type, processImage, nonDepositPaymentType, generateSecureCode, colorBold, nGreen, nRed)
gosimple S1021: merge var declaration with assignment in manage.go
ineffassign: remove dead assignments in settings.go, till.go, images.go

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-07-09 18:53:51 +01:00
popertotsandSisyphus 510828c924 chore: run go fix for Go 1.26 modernization
CI / Go vulnerabilities (push) Successful in 1m10s
CI / Build & Vet (push) Successful in 1m39s
CI / Frontend build (gate) (push) Successful in 1m42s
CI / Frontend QC (audit) (push) Successful in 56s
CI / Frontend QC (typecheck) (push) Successful in 1m36s
CI / Frontend QC (lint) (push) Successful in 1m51s
CI / Tests (prod) (push) Has been cancelled
CI / Tests (dev) (push) Has been cancelled
CI / Race (prod) (push) Has been cancelled
CI / Race (dev) (push) Has been cancelled
106 files: interface{}→any, strings.Split→SplitSeq, CutPrefix/Cut, strings.Builder, slices.Contains, remove redundant // +build directives, gofmt import ordering and indentation.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-07-09 17:25:23 +01:00
popertotsandSisyphus e86248b27c refactor: move auth, GDPR, and booking cleanup to centralized scheduler
Convert CleanupRevokedJTIs to return (int, error) and remove StartJTICleanup goroutine. Add CleanupStaleLoginEntries and CleanupGDPRExportCache for centralized scheduler. Add clock.London timezone location.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-07-07 00:10:00 +01:00
popertotsandSisyphus a4fa75154d refactor: centralize scheduling cleanup with row-count returns
Convert all scheduling cleanup functions to return (int, error). Remove inline cleanup calls from GetAvailableHours. Add scheduled-cleanup.go for centralized job wrappers.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-07-07 00:09:51 +01:00
popertotsandSisyphus 72161e8c4f docs(backend): clarify auth fallback rationale in reserve handler
CI / Go vulnerabilities (push) Successful in 37s
CI / Tests (push) Successful in 1m33s
CI / Frontend lint & types (push) Successful in 1m46s
CI / Race detector (push) Successful in 3m38s
Expands inline comments to explain why the Bearer token fallback is deliberately kept — it serves 22+ test invocations that call ReserveSlotHandler directly without middleware, never executes in production, and acts as defense-in-depth.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-07-06 19:22:08 +01:00
popertotsandSisyphus e303c07f8d refactor(backend): replace inline Bearer parsing with OptionalAuth middleware in services
Removes the inline Bearer token fallback in ServicesHandler — the OptionalAuth middleware (added to the public services route group in main.go) now handles auth context population. This eliminates duplicated token parsing logic and ensures consistent auth behavior across all routes.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-07-06 19:22:00 +01:00
popertots c2aa0b93cb feat(api): add admin reservation cancel endpoint
Add DELETE /api/admin/bookings/reserve to release admin walk-in/call-in reservations.

New handler AdminCancelReservationHandler targets only RESERVATION:admin:%
entries (partitioned from user RESERVATION:user:% by WHERE clause). Includes
12 tests covering walkin + callin success, isolation, no-op, unauth, empty ctx,
walkin+callin coexistence, anon untouched, response format parity, overlapping
reservations deleted, user reservations untouched, and idempotent double-cancel.

Inverse-isolation tests in cancel_reservation_test.go prove the user-side
DELETE /api/bookings/reserve does not touch admin or anon reservations.
2026-07-06 17:58:03 +01:00
popertotsandSisyphus be22710f7b test: add scheduling excludeUserID integration test
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-07-05 20:26:40 +01:00
popertotsandSisyphus 2e0760f083 feat: add IP-based anon reservation cleanup to admin reserve handler
Extend AdminReserveSlotHandler's pre-overlap DELETE to also clean up anonymous RESERVATION:anon entries matching the admin's IP address. This handles the edge case where an admin previously reserved a slot without authentication. Also reorganise imports to follow goimports conventions.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-07-05 20:26:33 +01:00
popertotsandSisyphus cc6ad7f00f fix: remove t.Parallel from VAT lifecycle test
CI / Go vulnerabilities (push) Successful in 33s
CI / Tests (push) Successful in 1m28s
CI / Frontend lint & types (push) Successful in 1m45s
CI / Race detector (push) Successful in 3m28s
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-07-05 20:08:12 +01:00
popertotsandSisyphus 30c9012562 fix: move dav.Service init from auth_test to user testmain
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-07-05 20:08:09 +01:00
popertotsandSisyphus 33c945159c feat: add cancel reservation handler and background cleanup
Add CancelReservationHandler (DELETE /api/bookings/reserve) to release authenticated user's active reservation. Register route in main.go. Add background goroutine for periodic reservation cleanup using CleanupOldReservations. Add idx_time_blockers_created_at index and extend anon cleanup to cover edit_request reservations in init-script.sql.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-07-05 11:47:54 +01:00
popertotsandSisyphus 2386bd0ca2 test: add tests for reservation self-block prevention
Add TestReserveSlot_DoesNotSelfBlock, TestAdminReserveSlot_DoesNotSelfBlock and TestReserveSlot_CleansUpAnonReservation. Add UserIDKey context to admin approve edit request tests. Remove weekend-day adjustment in TestAdminApproveEditRequest_OverlapWithBooking_Regression and TestAdminApproveEditRequest_EvictsPendingRelease (no longer needed).

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-07-05 11:47:43 +01:00
popertotsandSisyphus c1a9f35ea5 feat: prevent reservation self-block in booking handlers
Pass excludeUserID to CheckTimeBlockerOverlap in AdminReserveSlotHandler, CreateBookingHandler, EditBookingHandler, AdminRescheduleBookingHandler, AdminCreateBookingForUserHandler, AdminApproveEditRequestHandler, and ReserveSlotHandler. Also clean up stale reservations before overlap check in AdminReserveSlotHandler and ReserveSlotHandler via db.Conn.Exec for cross-connection visibility. Improve error handling in RequestEditHandler's service update block.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-07-05 11:45:02 +01:00
popertotsandSisyphus 920eb761fd feat: add excludeUserID param to scheduling time blockers
Add optional excludeUserID parameter to GetTimeBlockersInRange and CheckTimeBlockerOverlap so a user's own RESERVATION entries are excluded from overlap checks. This prevents users from self-blocking on their existing reservation when checking availability or confirming a booking.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-07-05 11:44:52 +01:00
popertots 766b5b7dbd fix(vat): resolve non-deterministic ORDER BY in TestVAT_ToggleLifecycle
Frontend Lint & Vulns / Lint & vulns (push) Failing after 48s
The phase 3 payment query used ORDER BY created_at DESC LIMIT 1.
Within a single transaction, NOW() returns the same timestamp for all
inserts, making the ordering non-deterministic when other parallel tests
insert payment rows with the same timestamp. Fix by parsing the
response's payment ID and querying by it directly.

Also revert eslint.config.js back to error-level rules for all categories
(removing the previous 'warn' overrides).
2026-06-25 14:12:48 +01:00
popertotsandSisyphus e4b9003439 refactor(handlers): migrate remaining backend handlers to clock.Now() and transaction patterns
Apply clock.Now() migration, transaction wrapping, and minor refactors across admin, scheduling, today, user, auth handler, notifications, webhooks, services, portfolio, ratelimit, testutils, and main.go.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-06-24 23:43:50 +01:00
popertotsandSisyphus 7b24f8e484 refactor(payments): integrate VAT into gift card buy flow and wrap in transactions
Refactor BuyGiftCard to insert pending payment before Square call with VAT applied. Add transaction wrapping to gift card handlers. Remove redundant Content-Type header sets. Migrate all time.Now() to clock.Now().

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-06-24 23:43:40 +01:00
popertotsandSisyphus 40bbd9ba49 refactor(bookings): migrate remaining handlers and tests to clock.Now()
Replace time.Now() with clock.Now() in bookings handlers and all test files. Includes deposit, discount, dedup, overlap, and edit request test updates.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-06-24 23:43:32 +01:00
popertotsandSisyphus 0ea1bb64b4 feat(bookings): add closing_time validation and repo layer
Extract closing hours check into reusable checkClosingHours helper. Add repo.go for shared DB query helpers. Update admin_reserve to use closing_time and move overlap check inside transaction with FOR UPDATE.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-06-24 23:43:23 +01:00
popertotsandSisyphus 37a9ba3517 fix(bookings): use transaction context for discount check in approve edit
Use tx.QueryRow instead of db.Conn.QueryRow for discount count check in AdminApproveEditRequestHandler to ensure consistency within the transaction.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-06-22 17:06:18 +01:00
popertotsandSisyphus 80b9877686 feat(api): add public business info route and TotalVATCollected to daily summary
Expose GET /business-info public endpoint for non-admin users. Add TotalVATCollected field to DailySummary and compute it in the aggregate query.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-06-22 17:06:12 +01:00
popertotsandSisyphus 7756f3af96 test(scheduling): add exhaustive blocker, gap, and cross-day tests
Add comprehensive time blocker tests: multiple blockers, blocker+booking combination, all-day, non-overlapping, multi-day, boundary start/end, out-of-hours, recurring (cron), reservation, overlapping, adjacent, cross-day midnight, closed days, exceptional hours. Add subtractTimeSlots and normalizeTime unit tests.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-06-22 17:06:05 +01:00
popertotsandSisyphus edc7d833ea refactor(scheduling): split multi-day blockers and normalize time strings
Split multi-day time blockers into per-day segments for subtractTimeSlots. Add normalizeTime helper to strip seconds from HH:MM:SS for consistent comparison. Subtract blockers for all users (not just non-admin) to prevent 409 errors on reserve. Move late-night lock logic to separate block.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-06-22 17:05:58 +01:00
popertotsandSisyphus 9d70d42bd4 test(admin): add settings validation, public info, and out_of_hours tests
Add comprehensive tests for business settings validation (name length, phone, email, VAT number, URL, voucher type, VAT rate). Add GetPublicBusinessInfo tests verifying correct JSON shape. Add out_of_hours field search tests for admin booking search.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-06-22 17:05:52 +01:00
popertotsandSisyphus 280b05bd34 feat(admin): add public business info, input validation, and VAT enable
Add GetPublicBusinessInfo endpoint for non-admin users. Add URL validation for website_url. Add length/bounds validation for name, address, phone, email, VAT number. Retroactively apply VAT to past payments/till sales when is_vat_registered is enabled.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-06-22 17:05:45 +01:00
popertotsandSisyphus 6561ceb7a9 feat(payments): integrate VAT into gift cards, payment handlers, and till sales
Track voucher_type_at_purchase on gift card creation. Apply VAT at gift card purchase (SPV), at redemption (MPV). Use transaction-aware GetCardByIDQuerier for till saved card lookups. Apply VAT to all booking payments (split records, terminal, tip, checkout). Add TotalVATAmount and TotalNetAmount to PaymentSummary responses.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-06-22 17:05:39 +01:00
popertotsandSisyphus 7cd71e4485 feat(payments): add VAT config helper and apply functions
Add GetVATConfig for reading VAT settings via any db.Querier, ApplyVATToBookingPayment for applying VAT to payment records, and ApplyVATToTillSale for SPV gift card till sales. Errors are logged without blocking payment flow.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-06-22 17:05:31 +01:00
popertotsandSisyphus 34aba319f1 test(admin): add t.Parallel() to exceptional hours test
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-06-22 12:55:24 +01:00
popertotsandSisyphus b4f70ada49 fix(today): use date string instead of time.Date for exceptional hours query
Replace time.Date with formatted date string for exceptional hours query parameters to ensure correct PostgreSQL type inference.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-06-22 12:55:16 +01:00
popertotsandSisyphus 8ad0111954 feat(scheduling): add out_of_hours override and fix timezone handling
Support out_of_hours query param in GetWorkingHours and GetAvailableHours (admin-only, returns 06:00-22:00 for all days). Replace ukLocation with time.Local for date boundaries. Add OptionalAuth middleware to scheduling routes for admin role detection. Add tests for admin/non-admin/no-auth scenarios, booking respect, and exceptional hours interaction.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-06-22 12:55:08 +01:00
popertotsandSisyphus 8ab7408e00 feat(bookings): support out_of_hours flag in admin create booking
Add OutOfHours field to AdminCreateBookingForUserRequest. When true, skip exceptional hours closed check and include out_of_hours in INSERT. Add tests verifying: bypass of exceptional closure, rejection without flag, overlap detection still works, and time blocker warning.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-06-22 12:55:00 +01:00