popertots
5a373a3b0b
Unify card selection UI via reusable CardSelection component; fix Buy a Gift Card new-card bug
...
Create CardSelection.svelte reusable component encapsulating the standard
saved-card list + 'Use a new card' + CardInput pattern with blur-based
validation (Luhn, expiry, CVC) — identical to the tip flows and account page.
Refactor UserPaymentModal (Make a Payment submodal) to use CardSelection:
- Removed its bespoke 'Use a different card' expand/collapse UI and inline
validation derivations (parseExpiryParts, isValidLuhn, touched state)
- Bound selectedCardId + new card fields to the component
- payButtonDisabled now driven by component's onValidityChange callback
- Removed now-unused CardInput import, SvelteDate import, formatCardExpiry
Fix account 'Buy a Gift Card' bug: 'Use a new card' click did nothing because
the auto-select effect immediately re-set buySelectedCard back to the default
card. Added buyShowNewCard flag so the effect only auto-selects on initial load;
reset after successful new-card purchase so the next purchase re-defaults.
2026-08-22 00:34:49 +01:00
popertots
28f0ddb328
Fix tip amount-change false dedup, wire BuyerEmail everywhere, clear ESLint errors
...
Money-moving fixes:
- Tip idempotency key regenerates when the tip amount changes after a failed
attempt (all 3 tip flows). Cached key still reused on same-amount retry
(dedup intact) and cleared on success/modal reset. Prevents silent
under-charge when a user retries at a different amount.
- Till replay path returns actual till_sales.status (may be 'pending') instead
of hardcoded 'completed' — no more misreported successful charge.
- BuyerEmail wired for CreateBookingPayment, gift card purchases, and till
sales (saved_card + online_square), matching the tip flow. Email lookup
errors logged, non-fatal.
- Till buyer-email errors now logged (was silently swallowed).
- on_the_house till top-up uses cached getIdempotencyKey() for retry-safe dedup
(was fresh crypto.randomUUID()).
Test/validation fixes:
- Add TestPaymentFromSquare_* unit tests (else-branch + nil card details),
build tag relaxed to 'test' so they run in the standard dev suite.
- Add TestValidateCardInfo table test (7 cases: both/either/neither/empty).
- Add TestCreateTillSale_TwoIdenticalCreateSales_BothSucceed regression test.
- Remove dead mock pre-registration in TestTipPayment_WithSavedCard.
- Correct misleading till regression-test comment.
ESLint cleanup (12 errors -> 0):
- Remove unused loadingCards in tip + pay-tip pages (dead assignments in
loadSavedCards).
- Scoped eslint-disable for {@html} in CardBrandIcon (hardcoded brand SVGs).
- Remove dead confirmSaveDefaultHours + unused rescheduleVersion prop in
WeeklySchedule (and its parent pass-through).
- Replace new Date() with SvelteDate in WeeklySchedule + BusinessHours.
- Fix each-block key in BusinessHours skeleton loader.
- Use void expression for reactivity-tracker reads in effects.
2026-08-22 00:34:49 +01:00
popertots
2459ddc919
Fix review findings: expiry bug (all 8 files), idempotency keys, card_expiry/card_cvc removal, URL encoding, BuyerEmail logging, ValidateCardInfo, saved-card test, future work doc
...
Backend:
- Fix refund idempotency key: clock.Now() → deterministic (pr.ID + amount)
- Fix ValidateCardInfo: enforce mutual exclusivity, handle empty strings symmetrically
- Fix paymentFromSquare brand fallback (remove dead SourceType fallback)
- Fix URL encoding: PathEscape → QueryEscape for customer_id query param
- Fix BuyerEmail: log warning on DB error instead of silent discard
- Fix idempotency key in createCardOnFileHTTP: time.Now() → deterministic hex hash
- Add BuyerEmail to CreateTipPayment Square request
- Move realBaseURL from shared file to square_dev.go (only used in dev)
- Add TestTipPayment_WithSavedCard test (card_id path coverage)
- Fix AMEX brand in mock (AMEX → AMERICAN_EXPRESS, fix test)
Frontend:
- Fix off-by-month expiry bug in ALL 8 files using year-month arithmetic
(parseExpiryParts returns 1-indexed, SvelteDate expects 0-indexed)
Files: tip/+page, pay-tip/[id], UserBookingModal, UserPaymentModal,
BookingFlow, account/+page (add card + buy gift card sections)
- Remove card_expiry/card_cvc from tip request bodies (backend has no fields)
Docs:
- Mark P9 (placeholder tokens) as completed, add P11 (Square Web Payments SDK)
- Mark T13 (rune arithmetic) as completed
2026-08-22 00:34:49 +01:00
popertots
4abcb324c9
Square payment integration: real HTTP client, tip flow rewrite, card UI/validation overhaul
...
Backend:
- Create square_http_client.go: real Square REST API client (Payments, Terminal Checkouts, Refunds, Cards, Locations) with proper JSON types, auth, error handling
- Update ProdClient in square.go to delegate to shared HTTP functions
- Wire devProdClient in square_dev.go to also make real HTTP calls for sandbox/prod env
- Rewrite CreateTipPayment handler: accept card_id OR new_card_token (+save_card), advisory lock, idempotency check, max amount validation
- Add ValidateCardInfo, bump ValidateAmount max to £10,000
- Fix mock CreateCardOnFile to detect brand/last4 from raw card numbers
- Fix mock RefundPayment to index by SquarePayID and accept unknown payment IDs
- Remove dead types (ProcessingFee, sqAddress), add Deadline parity
- Fix AMEX brand inconsistency (AMEX -> AMERICAN_EXPRESS)
- Pre-existing fix: remove unused context import in giftcards.go
Frontend:
- CardInput.svelte: add onfieldblur/onfieldinput callbacks for blur-based validation
- CardBrandIcon.svelte: brand SVGs for VISA, MC, AMEX, Discover, Diners, JCB, Square Gift Card, UnionPay, Interac, EFTPOS
- tip/+page, pay-tip/[id], UserBookingModal tip: saved card list + CardInput + Luhn/expiry/CVC validation + blur-based errors + no-saved-cards edge case
- UserPaymentModal, BookingFlow: card validation parity (blur-based, all-valid check)
- account page: replace text brand badges with CardBrandIcon
- Fix handleCustomTip bug (state mutations outside if block)
- Remove dead pageState variable
- Add tip modal scroll (max-h-[90vh] overflow-y-auto)
- Submit button disabled on !isCardValid
Tests:
- 30 square package tests (+new: CreateCardOnFile raw number path, detectCardInfo variants)
- 5 tip handler tests (HappyPath, NoPriorPayment, WrongOwner, MultipleTips, TxFailure)
- All +-race clean, refund tests fixed
2026-08-22 00:34:49 +01:00
popertots
f6caaab8a3
feat: redesign homepage, add global footer, fix carousel font
...
Homepage: restored original v0 design, replaced lorem ipsum with real service descriptions, added BusinessHours (Opening Hours) section, alternating bg-gray-50 section backgrounds. Layout: added global sticky footer (hidden on /admin/schedule, /account, and ?format=pdf pages), wrapped content in min-h-screen flex layout. PortfolioCarousel: set heading to Playfair Display.
2026-08-22 00:34:49 +01:00
popertots
51d29e6bd4
fix: remove card shadows from prices page to match site-wide border-style
...
All other pages (contact, admin, account, today, book) use border-based card styling without drop shadows. Removes shadow-sm, hover:shadow-md, and transition classes from all Card.Root instances on the prices page.
2026-08-22 00:34:49 +01:00
popertots
3c0c4dd962
feat: sort price list by booking popularity over last 6 months
...
Adds GET /api/services/popular endpoint that returns services sorted by booking count (desc) then price (desc) for ties. Prices page now fetches from this endpoint instead of the default alphabetical sort.
2026-08-22 00:34:49 +01:00
popertots
8384197ef0
fix: clear date selection when clicking an unavailable/closed day
...
bits-ui blocks onValueChange for unavailable dates, leaving stale selection. Adds native click detection on [data-unavailable] elements to call onchange(undefined) so the time picker hides and the user knows nothing was picked.
2026-08-22 00:34:49 +01:00
popertots
a991642157
fix: show only differing days in scheduled hours change section
...
Replace unreactive @const with for the changed-days filter. Normalize PostgreSQL microsecond times before comparing (TIME::text produces '17:00:00.000000' but staged hours are '17:00'). Change header text to 'These opening hours will change from' when fewer than 7 days differ.
2026-08-22 00:34:49 +01:00
popertots
0323313921
fix: add conflict re-check guard before saving holiday hours and time blockers
...
Re-check conflicts immediately before finalizing holiday hours and time blocker saves to prevent race conditions. Add Refresh button to conflict banners. Fix prettier formatting in login page.
2026-08-22 00:34:49 +01:00
popertots
6470a3f6c9
feat: add scheduled change UI and conflict display to weekly schedule
...
Convert WeeklySchedule to schedule staged changes with an effective date picker and conflict detection UI. Show pending scheduled changes in BusinessHours component. Update admin page to pass through props.
2026-08-22 00:34:49 +01:00
popertots
3eec71a56c
fix: sanitize API error text display and add time_blockers tests
...
Add extractErrorMessage helper for JSON error body parsing and apply sanitizeText across all toast displays. Add time_blockers test coverage for new holiday placeholder cleanup and overlapping scenarios.
2026-08-22 00:34:48 +01:00
popertots
5deefa1205
fix: prevent empty login form submission
...
Fix isFormComplete derived always returning true for login mode. Now requires email and password to be non-empty before enabling Sign In button. Add early-return guard in handleSubmit to prevent sending empty credentials.
2026-08-22 00:34:48 +01:00
popertots
9170990340
feat: add conflict resolution UI to holiday hours modal
...
Add conflict detection to the Create Exception Schedule modal with auto-checking, amber warning display, and View Booking/View Client buttons. Wire openUserModal and openBookingModal props from admin page. Fix TimeBlockers placeholder duration from hardcoded 60 to booking.duration_minutes. Remove dead placeholder creation code (isFormValid prevents save while conflicts exist). Fix formatTime overwriting raw hour data with display strings.
2026-08-22 00:34:48 +01:00
popertots
04d5c21f8c
feat: show live availability status on ContactCard
2026-08-22 00:34:48 +01:00
popertots
bea1582088
feat: add BusinessHours component and update contact page
2026-08-22 00:34:48 +01:00
popertots
24af3a1fca
fix: enable eslint-plugin-svelte a11y rules and fix violations
CI / Env docs check (push) Successful in 30s
CI / Nginx config check (push) Successful in 37s
CI / Docker compose check (push) Successful in 38s
CI / Frontend deps check (push) Successful in 46s
CI / Frontend major deps (push) Successful in 51s
CI / Secrets scan (push) Successful in 52s
CI / Go build (push) Successful in 56s
CI / Frontend build (push) Successful in 1m9s
CI / Knip (push) Successful in 46s
CI / Go vet (prod) (push) Successful in 1m59s
CI / Frontend a11y check (push) Successful in 2m7s
CI / Go vet (dev) (push) Successful in 2m4s
CI / go mod tidy (push) Successful in 25s
CI / Staticcheck (prod) (push) Successful in 2m43s
CI / Frontend QC (audit) (push) Successful in 1m39s
CI / Staticcheck (dev) (push) Successful in 3m47s
CI / Go vulnerabilities (push) Successful in 1m48s
CI / golangci-lint (push) Successful in 3m57s
CI / Frontend QC (typecheck) (push) Successful in 1m49s
CI / Security scan (prod) (push) Successful in 4m1s
CI / Security scan (dev) (push) Successful in 4m30s
CI / Frontend QC (lint) (push) Successful in 2m5s
CI / Svelte strict check (push) Failing after 988h42m2s
CI / Race (dev) (push) Failing after 988h42m18s
CI / Race (prod) (push) Failing after 988h42m19s
CI / Tests (dev) (push) Failing after 988h42m19s
CI / Tests (prod) (push) Failing after 988h42m20s
2026-07-11 18:17:49 +01:00
popertots
8ae592d0c5
fix: add golangci config, restore CI timeouts, svelte-check warnings, RespondError helper
CI / Env docs check (push) Successful in 13s
CI / Nginx config check (push) Successful in 36s
CI / Frontend major deps (push) Successful in 37s
CI / Docker compose check (push) Successful in 38s
CI / Frontend deps check (push) Successful in 41s
CI / Secrets scan (push) Successful in 42s
CI / Go build (push) Successful in 42s
CI / Frontend build (push) Successful in 49s
CI / go mod tidy (push) Successful in 26s
CI / Go vet (dev) (push) Has been cancelled
CI / Go vet (prod) (push) Has been cancelled
CI / golangci-lint (push) Has been cancelled
CI / Staticcheck (dev) (push) Has been cancelled
CI / Staticcheck (prod) (push) Has been cancelled
CI / Security scan (dev) (push) Has been cancelled
CI / Security scan (prod) (push) Has been cancelled
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
CI / Go vulnerabilities (push) Has been cancelled
CI / Knip (push) Has been cancelled
CI / Frontend a11y check (push) Has been cancelled
CI / Svelte strict check (push) Has been cancelled
CI / Frontend QC (audit) (push) Has been cancelled
CI / Frontend QC (typecheck) (push) Has been cancelled
CI / Frontend QC (lint) (push) Has been cancelled
2026-07-11 17:38:50 +01:00
popertots
7d6cb0c375
fix: prettier formatting on EditRequestModal.svelte
CI / Docker compose check (push) Successful in 14s
CI / Env docs check (push) Successful in 14s
CI / Nginx config check (push) Successful in 16s
CI / Frontend deps check (push) Successful in 52s
CI / Frontend major deps (push) Successful in 51s
CI / Frontend build (push) Successful in 1m8s
CI / Secrets scan (push) Successful in 1m8s
CI / Go build (push) Successful in 1m8s
CI / Knip (push) Successful in 45s
CI / Go vet (prod) (push) Successful in 1m19s
CI / Go vet (dev) (push) Successful in 1m37s
CI / Frontend a11y check (push) Successful in 2m21s
CI / go mod tidy (push) Successful in 51s
CI / Frontend QC (audit) (push) Successful in 37s
CI / Staticcheck (prod) (push) Successful in 3m34s
CI / Staticcheck (dev) (push) Successful in 3m35s
CI / golangci-lint (push) Successful in 3m37s
CI / Frontend QC (typecheck) (push) Successful in 1m52s
CI / Go vulnerabilities (push) Successful in 2m26s
CI / Security scan (prod) (push) Successful in 4m9s
CI / Security scan (dev) (push) Successful in 4m43s
CI / Frontend QC (lint) (push) Successful in 2m12s
CI / Svelte strict check (push) Successful in 1m23s
CI / Tests (prod) (push) Successful in 3m25s
CI / Tests (dev) (push) Successful in 3m24s
CI / Race (prod) (push) Successful in 7m7s
CI / Race (dev) (push) Successful in 7m32s
2026-07-11 16:37:33 +01:00
popertots
c8051a76d6
fix: replace time.Sleep with poll loops in tests, fix a11y target=_blank violations
CI / Env docs check (push) Successful in 16s
CI / Nginx config check (push) Successful in 22s
CI / Docker compose check (push) Successful in 23s
CI / Frontend major deps (push) Successful in 23s
CI / Frontend deps check (push) Successful in 28s
CI / Secrets scan (push) Successful in 36s
CI / Go build (push) Successful in 37s
CI / Frontend build (push) Successful in 43s
CI / Knip (push) Successful in 52s
CI / Frontend a11y check (push) Successful in 1m48s
CI / Go vet (prod) (push) Successful in 1m36s
CI / Go vet (dev) (push) Successful in 2m11s
CI / go mod tidy (push) Successful in 1m0s
CI / Frontend QC (audit) (push) Successful in 35s
CI / Staticcheck (prod) (push) Successful in 2m47s
CI / Staticcheck (dev) (push) Successful in 3m4s
CI / golangci-lint (push) Successful in 3m24s
CI / Go vulnerabilities (push) Successful in 1m52s
CI / Frontend QC (lint) (push) Failing after 1m2s
CI / Frontend QC (typecheck) (push) Successful in 1m23s
CI / Svelte strict check (push) Has been skipped
CI / Security scan (prod) (push) Successful in 4m15s
CI / Security scan (dev) (push) Successful in 4m54s
CI / Tests (prod) (push) Successful in 3m48s
CI / Tests (dev) (push) Failing after 4m2s
CI / Race (prod) (push) Failing after 7m15s
CI / Race (dev) (push) Failing after 7m20s
2026-07-11 16:16:23 +01:00
popertots
d410dce0e0
fix: gift card friend purchase notifies admin, frontend no longer falsely claims email sent
2026-07-11 14:39:54 +01:00
popertots
28620f69a5
fix: restore dead functions properly, match test expectations, fix vet/lint
CI / Docker compose check (push) Successful in 13s
CI / Env docs check (push) Successful in 14s
CI / Nginx config check (push) Successful in 14s
CI / Frontend major deps (push) Successful in 25s
CI / Frontend deps check (push) Successful in 25s
CI / Secrets scan (push) Successful in 39s
CI / Go build (push) Successful in 39s
CI / Frontend build (push) Successful in 45s
CI / Knip (push) Successful in 27s
CI / Frontend a11y check (push) Successful in 1m27s
CI / Go vet (prod) (push) Successful in 1m53s
CI / go mod tidy (push) Successful in 43s
CI / Go vet (dev) (push) Successful in 2m6s
CI / Frontend QC (audit) (push) Successful in 45s
CI / Staticcheck (prod) (push) Successful in 2m51s
CI / Staticcheck (dev) (push) Successful in 3m5s
CI / Frontend QC (typecheck) (push) Successful in 1m50s
CI / Go vulnerabilities (push) Successful in 2m8s
CI / golangci-lint (push) Failing after 4m3s
CI / Security scan (prod) (push) Successful in 4m35s
CI / Security scan (dev) (push) Successful in 4m47s
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 2m8s
CI / Svelte strict check (push) Successful in 38s
2026-07-11 13:23:27 +01:00
popertots
294d844493
fix: replace {__} workaround with clean range() helper in Svelte templates
2026-07-11 12:50:13 +01:00
popertots
d172adf392
fix: enable svelte a11y linting and fix violations
2026-07-11 12:41:10 +01:00
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
1e4460271b
fix: fix frontend a11y and lint errors
2026-07-11 00:21:31 +01:00
popertots
d787c9a94e
fix: remove duplicate green lunch warning, green card always shows Time selected
CI / Nginx config check (push) Successful in 18s
CI / Docker compose check (push) Successful in 19s
CI / Env docs check (push) Successful in 58s
CI / Frontend deps check (push) Successful in 36s
CI / Frontend major deps (push) Failing after 37s
CI / Secrets scan (push) Successful in 1m21s
CI / Go build (push) Successful in 45s
CI / Frontend build (push) Successful in 53s
CI / Frontend a11y check (push) Failing after 16s
CI / Knip (push) Successful in 26s
CI / Go vet (prod) (push) Successful in 1m37s
CI / Go vet (dev) (push) Successful in 1m38s
CI / go mod tidy (push) Successful in 1m38s
CI / Frontend QC (audit) (push) Successful in 1m46s
CI / Go vulnerabilities (push) Successful in 1m57s
CI / Staticcheck (prod) (push) Successful in 3m35s
CI / golangci-lint (push) Successful in 3m38s
CI / Staticcheck (dev) (push) Successful in 3m39s
CI / Security scan (dev) (push) Successful in 4m3s
CI / Frontend QC (lint) (push) Failing after 58s
CI / Frontend QC (typecheck) (push) Successful in 2m36s
CI / Svelte strict check (push) Has been skipped
CI / Security scan (prod) (push) Successful in 4m29s
CI / Tests (prod) (push) Successful in 2m41s
CI / Tests (dev) (push) Failing after 2m55s
CI / Race (prod) (push) Successful in 6m50s
CI / Race (dev) (push) Successful in 7m14s
2026-07-10 21:27:34 +01:00
popertots
a2b4f84503
chore: bump @eslint/js 9.39.4 → 9.39.5
CI / Env docs check (push) Successful in 1m14s
CI / Secrets scan (push) Successful in 1m17s
CI / Go build (push) Successful in 1m17s
CI / Frontend deps check (push) Successful in 1m17s
CI / Frontend major deps (push) Failing after 1m11s
CI / Docker compose check (push) Successful in 1m38s
CI / Nginx config check (push) Successful in 1m40s
CI / Go vet (dev) (push) Has been cancelled
CI / Go vet (prod) (push) Has been cancelled
CI / golangci-lint (push) Has been cancelled
CI / Staticcheck (dev) (push) Has been cancelled
CI / Staticcheck (prod) (push) Has been cancelled
CI / Security scan (dev) (push) Has been cancelled
CI / Security scan (prod) (push) Has been cancelled
CI / go mod tidy (push) Has been cancelled
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
CI / Go vulnerabilities (push) Has been cancelled
CI / Knip (push) Has been cancelled
CI / Frontend a11y check (push) Has been cancelled
CI / Frontend build (push) Has been cancelled
CI / Svelte strict check (push) Has been cancelled
CI / Frontend QC (audit) (push) Has been cancelled
CI / Frontend QC (typecheck) (push) Has been cancelled
CI / Frontend QC (lint) (push) Has been cancelled
2026-07-10 21:25:22 +01:00
popertots
7833e87aab
fix: add split-lunch detection with formatted time range warnings
CI / Env docs check (push) Successful in 29s
CI / Frontend deps check (push) Failing after 27s
CI / Knip (push) Has been skipped
CI / Frontend a11y check (push) Has been skipped
CI / Docker compose check (push) Successful in 20s
CI / Nginx config check (push) Successful in 43s
CI / Frontend major deps (push) Failing after 52s
CI / Go build (push) Successful in 1m5s
CI / Secrets scan (push) Successful in 1m8s
CI / Frontend build (push) Successful in 53s
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 1m17s
CI / Go vet (dev) (push) Successful in 1m47s
CI / Go vet (prod) (push) Successful in 2m2s
CI / Go vulnerabilities (push) Successful in 1m24s
CI / Staticcheck (prod) (push) Successful in 2m54s
CI / Staticcheck (dev) (push) Successful in 3m4s
CI / golangci-lint (push) Successful in 3m24s
CI / Security scan (prod) (push) Successful in 4m29s
CI / Security scan (dev) (push) Successful in 4m29s
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-10 21:16:59 +01:00
popertots
7c8fd94fcb
fix: restore admin lunch warning tier (30-60min) with gap-worsening comparison
CI / Nginx config check (push) Successful in 25s
CI / Docker compose check (push) Successful in 25s
CI / Env docs check (push) Successful in 26s
CI / Frontend major deps (push) Failing after 26s
CI / Frontend deps check (push) Successful in 34s
CI / Secrets scan (push) Successful in 38s
CI / Go build (push) Successful in 38s
CI / Frontend build (push) Successful in 44s
CI / Frontend a11y check (push) Failing after 31s
CI / Knip (push) Successful in 42s
CI / go mod tidy (push) Successful in 31s
CI / Go vet (prod) (push) Successful in 1m58s
CI / Go vet (dev) (push) Successful in 2m15s
CI / Frontend QC (audit) (push) Successful in 1m37s
CI / Staticcheck (prod) (push) Successful in 3m39s
CI / Go vulnerabilities (push) Successful in 2m48s
CI / golangci-lint (push) Successful in 4m36s
CI / Staticcheck (dev) (push) Successful in 4m47s
CI / Frontend QC (typecheck) (push) Successful in 2m42s
CI / Security scan (dev) (push) Successful in 4m57s
CI / Security scan (prod) (push) Successful in 4m33s
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
CI / Svelte strict check (push) Has been cancelled
CI / Frontend QC (lint) (push) Has been cancelled
2026-07-10 21:10:00 +01:00
popertots
50ce98d729
fix: remove dead GenerateRefreshToken calls (tokens never consumed)
2026-07-10 20:52:47 +01:00
popertots
e896591098
chore: upgrade npm deps — vite 8, prettier plugins, @types/node, @eslint/compat
...
CI / Docker compose check (push) Successful in 14s
CI / Env docs check (push) Successful in 15s
CI / Nginx config check (push) Successful in 18s
CI / Frontend deps check (push) Successful in 27s
CI / Frontend major deps (push) Failing after 27s
CI / Go build (push) Successful in 35s
CI / Secrets scan (push) Successful in 41s
CI / Frontend build (push) Successful in 43s
CI / Knip (push) Successful in 28s
CI / Frontend a11y check (push) Successful in 1m35s
CI / Go vet (prod) (push) Successful in 2m11s
CI / go mod tidy (push) Successful in 42s
CI / Go vet (dev) (push) Successful in 2m18s
CI / Frontend QC (audit) (push) Successful in 48s
CI / Staticcheck (prod) (push) Successful in 2m57s
CI / Staticcheck (dev) (push) Successful in 3m1s
CI / Go vulnerabilities (push) Successful in 1m27s
CI / golangci-lint (push) Successful in 3m41s
CI / Frontend QC (typecheck) (push) Successful in 1m35s
CI / Frontend QC (lint) (push) Successful in 1m51s
CI / Security scan (prod) (push) Successful in 4m29s
CI / Security scan (dev) (push) Successful in 4m44s
CI / Svelte strict check (push) Successful in 1m49s
CI / Tests (prod) (push) Successful in 3m30s
CI / Tests (dev) (push) Successful in 3m57s
CI / Race (prod) (push) Successful in 7m14s
CI / Race (dev) (push) Successful in 7m25s
Upgrades applied:
@types/node: 22.20.1 → 26.1.1
@eslint/compat: 1.4.1 → 2.1.0
prettier-plugin-tailwindcss: 0.7.4 → 0.8.0
prettier-plugin-svelte: 3.5.2 → 4.1.1 (formatted textarea.svelte)
vite: 7.3.6 → 8.1.4
@sveltejs/vite-plugin-svelte: 6.2.4 → 7.2.0
Left at current (blocked by deps chain):
eslint / @eslint/js — typescript-eslint needs eslint 10 support
typescript — typescript-eslint needs TS 7 support
Added CI TODO note for when vite-plugin-svelte-inspector catches up.
2026-07-10 20:03:41 +01:00
popertots
c0442d4ebd
ci: enable coverage on Tests (prod), remove unrealistic threshold, fix prettier
CI / Env docs check (push) Successful in 20s
CI / Nginx config check (push) Successful in 20s
CI / Frontend major deps (push) Failing after 26s
CI / Docker compose check (push) Successful in 30s
CI / Frontend deps check (push) Successful in 32s
CI / Secrets scan (push) Successful in 1m0s
CI / Go build (push) Successful in 1m1s
CI / Frontend build (push) Successful in 1m0s
CI / Knip (push) Successful in 58s
CI / Go vet (prod) (push) Successful in 1m38s
CI / Frontend a11y check (push) Successful in 2m12s
CI / Go vet (dev) (push) Successful in 2m2s
CI / go mod tidy (push) Successful in 35s
CI / Frontend QC (audit) (push) Successful in 39s
CI / Staticcheck (prod) (push) Successful in 2m59s
CI / Go vulnerabilities (push) Successful in 1m26s
CI / Staticcheck (dev) (push) Successful in 3m15s
CI / golangci-lint (push) Successful in 3m31s
CI / Frontend QC (typecheck) (push) Successful in 1m31s
CI / Frontend QC (lint) (push) Successful in 2m14s
CI / Security scan (prod) (push) Successful in 4m32s
CI / Security scan (dev) (push) Successful in 5m2s
CI / Svelte strict check (push) Successful in 28s
CI / Tests (prod) (push) Successful in 1m54s
CI / Tests (dev) (push) Failing after 2m20s
CI / Race (prod) (push) Successful in 3m41s
CI / Race (dev) (push) Successful in 5m15s
2026-07-10 13:18:23 +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
19d1d8dd47
fix: correct prop names in Svelte templates after a11y cleanup
2026-07-10 12:27:08 +01:00
popertots
bee2ce81e6
fix: resolve remaining staticcheck SA4006 and gosec G120 issues
2026-07-10 12:25:29 +01:00
popertots
0c91482aac
fix: adjust upload limits to 20MB profile, 30MB portfolio
2026-07-10 12:25:25 +01:00
popertots
eed8814021
fix: remove unused variables from Svelte components
2026-07-10 11:58:42 +01:00
popertots
895d7f0df9
chore: update shadcn-svelte from 1.4.0 to 1.4.1
CI / Docker compose check (push) Successful in 26s
CI / Env docs check (push) Successful in 27s
CI / Frontend major deps (push) Failing after 54s
CI / Secrets scan (push) Successful in 55s
CI / Go build (push) Successful in 55s
CI / Frontend deps check (push) Successful in 55s
CI / Nginx config check (push) Successful in 1m0s
CI / Frontend build (push) Successful in 1m1s
CI / go mod tidy (push) Successful in 38s
CI / Go vet (dev) (push) Successful in 1m49s
CI / Go vet (prod) (push) Successful in 2m26s
CI / Go vulnerabilities (push) Successful in 1m41s
CI / Knip (push) Successful in 56s
CI / Staticcheck (prod) (push) Failing after 2m46s
CI / golangci-lint (push) Successful in 4m24s
CI / Staticcheck (dev) (push) Failing after 4m22s
CI / Frontend a11y check (push) Failing after 2m11s
CI / Security scan (prod) (push) Failing after 4m31s
CI / Security scan (dev) (push) Failing after 4m37s
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 (audit) (push) Successful in 1m58s
CI / Frontend QC (typecheck) (push) Successful in 2m10s
CI / Frontend QC (lint) (push) Successful in 2m26s
CI / Svelte strict check (push) Successful in 26s
2026-07-10 11:20:35 +01:00
popertots and Sisyphus
5f95abf804
ci: add secrets scanning, staticcheck, gosec, coverage, env docs, compose/nginx validation, a11y
...
CI / Nginx config check (push) Failing after 7s
CI / Docker compose check (push) Failing after 7s
CI / Secrets scan (push) Failing after 7s
CI / Env docs check (push) Failing after 8s
CI / Frontend deps check (push) Failing after 23s
CI / Knip (push) Has been skipped
CI / Frontend a11y check (push) Has been skipped
CI / Go build (push) Successful in 37s
CI / Go vulnerabilities (push) Successful in 37s
CI / Frontend build (push) Successful in 1m1s
CI / go mod tidy (push) Successful in 24s
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 1m31s
CI / Staticcheck (push) Failing after 1m50s
CI / golangci-lint (push) Successful in 2m26s
CI / Security scan (gosec) (push) Failing after 2m38s
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
New jobs in pipeline:
secrets-scan: gitleaks detection
go-staticcheck: static analysis (complement to golangci-lint)
go-gosec: Go security linter
test: coverage profiling with 50% threshold gate
env-docs-check: verifies all env vars are documented in .env.example
docker-compose-check: validates compose.yml syntax
nginx-check: validates nginx config
frontend-a11y: Svelte a11y accessibility checks
Also: remove orphaned Makefile, update .env.example with 11 missing vars,
create .gitleaks.toml with allowlist, add check-env-docs.py script.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-07-10 09:38:07 +01:00
popertots and Sisyphus
0668438ab0
fix: knip clean — delete remaining dead map files, add knip config, unexport internal types
...
CI / Frontend deps check (push) Successful in 21s
CI / Go build (push) Successful in 36s
CI / Go vulnerabilities (push) Successful in 36s
CI / Frontend build (push) Successful in 53s
CI / Knip (push) Successful in 29s
CI / go mod tidy (push) Successful in 20s
CI / Frontend QC (audit) (push) Successful in 41s
CI / Go vet (push) Successful in 1m5s
CI / Frontend QC (typecheck) (push) Successful in 1m0s
CI / golangci-lint (push) Successful in 1m21s
CI / Frontend QC (lint) (push) Successful in 1m18s
CI / Tests (prod) (push) Successful in 1m39s
CI / Svelte strict check (push) Successful in 1m29s
CI / Tests (dev) (push) Successful in 1m59s
CI / Race (prod) (push) Successful in 3m26s
CI / Race (dev) (push) Successful in 4m55s
Delete 6 unused map components and use-map.svelte.ts hook.
Create knip.json to handle worker entry points and dynamic imports.
Unexport UserRole/DecodedToken types (only used internally).
Remove resolved ignoreDependencies entries.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-07-09 19:45:14 +01:00
popertots and Sisyphus
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
popertots and Sisyphus
96410c9f18
chore: remove minimatch override (no longer needed), keep cookie override (SvelteKit pinned dep)
...
CI / Go vulnerabilities (push) Successful in 57s
CI / Build & Vet (push) Successful in 1m14s
CI / Frontend build (gate) (push) Successful in 1m2s
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
CI / Frontend QC (audit) (push) Has been cancelled
CI / Frontend QC (typecheck) (push) Has been cancelled
CI / Frontend QC (lint) (push) Has been cancelled
npm update resolved minimatch transitively. cookie still pinned via override because SvelteKit <= 2.69.2 depends on vulnerable cookie < 0.7.0.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-07-09 17:44:34 +01:00
popertots and Sisyphus
914f9993ec
ci: remove test/race timeouts, add concurrency cancel-in-progress, fix npm audit vulns
...
CI / Go vulnerabilities (push) Successful in 35s
CI / Build & Vet (push) Successful in 49s
CI / Frontend build (gate) (push) Successful in 57s
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
CI / Frontend QC (audit) (push) Has been cancelled
CI / Frontend QC (typecheck) (push) Has been cancelled
CI / Frontend QC (lint) (push) Has been cancelled
- Remove -timeout 180s/240s from go test and race commands
- Add concurrency group to cancel stale pipelines on new pushes
- Run npm update to bump Vite 7.3.5 -> 7.3.6, fixing nested esbuild vuln
- npm audit now at 0 vulnerabilities
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-07-09 17:43:13 +01:00
popertots and Sisyphus
92124158bf
feat(frontend): add apiFetch wrapper for automatic auth token injection
...
Centralizes auth token management into a reusable apiFetch() helper and getAuthHeaders() utility, eliminating inline Bearer token logic across all frontend files.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-07-06 19:21:34 +01:00
popertots
e831953e5b
fix(ui): improve reservation lifecycle in BookingFlow
...
- Release reservation on service change, date change, and step-back navigation
- Add synchronous double-click payment guard (isProcessingPaymentSync)
- Immutable update for confirmedBooking to prevent race-condition overcharge
- Generate fresh idempotency key per submission attempt (was reused across
component lifetime, causing stale-booking illusion on re-submit)
- Release reservation after successful booking submission
- Extract releaseReservation() helper for DRY reservation cleanup
- Race-condition guard in selectTimeWithValidation: pass clicked time
explicitly so stale validation can't clobber a newer selection
2026-07-06 17:58:14 +01:00
popertots and Sisyphus
1c09e4220b
fix: run eslint on every commit and restore gdpr navigation eslint-disable
...
CI / Go vulnerabilities (push) Successful in 29s
CI / Frontend lint & types (push) Successful in 1m37s
CI / Tests (push) Successful in 1m50s
CI / Race detector (push) Successful in 3m48s
Pre-commit hook now runs eslint on all frontend files regardless of what's staged, catching pre-existing issues. Restore the necessary eslint-disable in gdpr page for the async goto call.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-07-05 22:43:48 +01:00
popertots and Sisyphus
878624e6f2
fix: resolve eslint warnings and error
...
CI / Go vulnerabilities (push) Successful in 59s
CI / Tests (push) Has been cancelled
CI / Race detector (push) Has been cancelled
CI / Frontend lint & types (push) Has been cancelled
Remove unused eslint-disable directives in BookingCreateModal and GDPR page. Rename isMobile to _isMobile to match allowed unused vars pattern.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-07-05 22:39:55 +01:00
popertots and Sisyphus
9c0b189b73
style: fix prettier formatting in 3 admin files
...
CI / Go vulnerabilities (push) Successful in 34s
CI / Tests (push) Successful in 1m34s
CI / Frontend lint & types (push) Failing after 1m52s
CI / Race detector (push) Successful in 3m33s
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-07-05 22:30:42 +01:00
popertots and Sisyphus
5f1f6c4b44
style: standardise select styling in DiscountsManagement, HolidayHours, TodayCalendar
...
CI / Go vulnerabilities (push) Successful in 34s
CI / Frontend lint & types (push) Failing after 1m7s
CI / Tests (push) Successful in 1m29s
CI / Race detector (push) Successful in 3m25s
Update select element classes to consistent h-9, shadow-xs, bg-background, focus-visible ring styling.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-07-05 22:26:38 +01:00