popertots and Sisyphus
0da7498ad7
feat(images): multi-format portfolio pipeline (AVIF/WebP/JPEG/JXL)
...
Backend now stores AVIF, WebP, JPEG, and optional JXL variants for both full-size and thumbnail images. Database schema extended with 7 new columns. Image validation supports AVIF and JXL magic bytes. Comprehensive test coverage for all format URL fields and magic byte detection. Legacy single-URL images remain backward-compatible.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-06-04 01:06:33 +01:00
popertots
bffb984ebb
feat(auth,security,scheduling): JWT revocation, S3 fix, notes validation, docs, tests
...
- JWT revocation with JTI (UUID v4): in-memory tracking, POST /api/logout,
refresh handler revokes old JTI, RequireAuth rejects revoked tokens
- Fix extractKey for S3 portfolio deletion: extracts full key path from URLs
instead of just filename, preventing orphaned storage files
- Notes validation: max=1000000 on all 13 Notes fields across 4 booking structs
- CharCounter: grapheme-aware counter (Intl.Segmenter), threshold 750K,
color-coded, integrated into 6 booking/admin components
- loginInProgress: timestamp-based tracking, 30s staleness, 20-entry cap (429),
ticker cleanup for stuck entries
- Profile picture 15MB client-side limit, portfolio 20MB backend limit
- Exceptional scheduling: expand query start to Monday of week
- TodayCalendar: week-range fetching, closing time indicator, short-day lunch skip
- NavBar: link reorder, mobile burger badge, slide transition, backdrop
- ImageUpload: 20MB limit with visual feedback
- formatDateISO: shared YYYY-MM-DD utility, shouldApplyLunchProtection helper
- Update README.md and all Obsidian docs (Overview, Technical, Admin, Future Work)
- Add 28 new tests: JWT (11), auth handlers (7), portfolio extractKey (5),
notes validation (5). go build + go vet clean with test,dev tags
2026-06-03 11:17:41 +01:00
popertots
169d7dc6e3
feat(scheduling,admin,today): week-range queries, file size limits, mobile nav UX
...
- Expand exceptional application query to Monday of start week
- Add 20MB file size limit with visual feedback in ImageUpload
- Reorder admin nav links, add burger badge, slide transition + backdrop
- Fetch week-range working/available hours, add closing time indicator
- Skip lunch protection for days <= 5h via shouldApplyLunchProtection
- Extract formatDateISO to shared utils
2026-06-03 10:22:16 +01:00
popertots and Sisyphus
b1847b4cfc
fix(payments,portfolio,scheduling): add ID validation hardening
...
Add validators.IsValidID() checks on URL param IDs to return 404 instead of 400 for invalid IDs. Add offset cap and query length limit in portfolio images handler.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-31 18:49:16 +01:00
popertots and Sisyphus
1d8247e655
fix(auth,services,profile): add request struct validation
...
Add validate tags and validators.Validate.Struct() calls on request structs for auth verification, service creation, and user patch test endpoints.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-31 18:49:12 +01:00
popertots and Sisyphus
577cceb304
fix(bookings): add request struct validation and fix patch test notice logic
...
Add validators.Validate.Struct() calls across booking handlers. Fix patch test notice period check to compare against booking start time (not current time) and fix expiry check similarly. Update test to match new error message.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-31 18:49:07 +01:00
popertots and Sisyphus
304a54c283
fix(admin): replace string(rune) with strconv.Itoa and validate status param
...
Fix query parameter construction by using strconv.Itoa instead of string(rune('0'+argNum)). Add status filter validation against allowed values.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-31 18:49:02 +01:00
popertots and Sisyphus
253d8785a4
fix(main): add request body size limits to API routes
...
Add limitBody(defaultBodyLimit) middleware to register, login, verify, booking, guest user, and admin routes.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-31 18:48:57 +01:00
popertots and Sisyphus
306f942d00
feat(mw): add dev-mode rate limiting bypass
...
Add build tag split: real rate limiter under !dev, no-op under dev build tag.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-31 18:48:53 +01:00
popertots and Sisyphus
d7857766fb
chore: configure env-based DAV_ADMIN_PASSWORD and add security headers
...
Ultraworked with Sisyphus (https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-31 10:55:43 +01:00
popertots and Sisyphus
1a6947a9b6
fix: enforce request body size limits across the API
...
Ultraworked with Sisyphus (https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-31 10:55:33 +01:00
popertots and Sisyphus
700b7c1152
fix: extract client IP via net.SplitHostPort consistently
...
Ultraworked with Sisyphus (https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-31 10:55:23 +01:00
popertots and Sisyphus
a38fda612e
fix: harden notification pagination and ID validation
...
Ultraworked with Sisyphus (https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-31 10:55:19 +01:00
popertots and Sisyphus
453fd0dc1d
feat: validate image type on server-side upload
...
Ultraworked with Sisyphus (https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-31 10:55:09 +01:00
popertots and Sisyphus
965b8b2794
feat: validate admin and time-blocker request structs
...
Ultraworked with Sisyphus (https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-31 10:54:59 +01:00
popertots and Sisyphus
605c1422b9
feat: validate auth and user request structs
...
Ultraworked with Sisyphus (https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-31 10:54:48 +01:00
popertots and Sisyphus
8b72c3fbef
deps: add go-playground/validator/v10 and update crypto deps
...
Ultraworked with Sisyphus (https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-31 10:54:40 +01:00
popertots
0de5128201
fix copy
2026-05-31 00:57:33 +01:00
popertots and Sisyphus
6e901690fd
chore: apply project-wide formatting and UI library updates
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-29 20:23:14 +01:00
popertots
ef650e013a
feat: implement patch test management and validation improvements
2026-05-29 20:21:26 +01:00
popertots
ddaa468a3e
fix: correctly validate number inputs against null/NaN bypass in admin modals
2026-05-29 18:35:11 +01:00
popertots
cf81916278
fix: safely enforce validation onblur for HolidayHours modal without dropping code
2026-05-29 18:28:13 +01:00
popertots
6625a3a699
fix: enforce derived validation onblur in patch tests modal to block invalid submissions
2026-05-29 18:24:03 +01:00
popertots
20bd3e3310
fix: add inputmode to number inputs across admin modals to enforce numeric keyboard on mobile
2026-05-29 18:20:30 +01:00
popertots
c21a59d61d
fix: validate Patch Test modal inputs
2026-05-29 18:12:39 +01:00
popertots
0750c7ac0e
fix: deduplicate service list in PatchTestsManagement to prevent each_key_duplicate
2026-05-29 18:10:40 +01:00
popertots
eda4b6d865
fix: deduplicate service list to prevent each_key_duplicate
2026-05-29 18:09:35 +01:00
popertots
94f3f77985
fix: restore ServicesManagement.svelte component
2026-05-29 18:09:06 +01:00
popertots
7d1266707c
refactor: use shadcn Checkbox in PatchTestsManagement
2026-05-29 18:06:05 +01:00
popertots
db4c3aa076
feat: complete PatchTestsManagement UI and modal logic
2026-05-29 18:04:27 +01:00
popertots
df32f5518c
fix: resolve svelte syntax error and cleanup ServicesManagement.svelte
2026-05-29 17:57:33 +01:00
popertots
a22ddb7a0f
fix: remove duplicate and deprecated createService implementation
2026-05-29 17:55:23 +01:00
popertots
e1c0d3a03f
fix: remove duplicate validateMinimumAgeField
2026-05-29 17:54:00 +01:00
popertots
10bb1b4e9e
fix: remove duplicate validation functions
2026-05-29 17:52:25 +01:00
popertots
dec3e1023e
fix: remove duplicated validation functions in ServicesManagement.svelte
2026-05-29 17:51:36 +01:00
popertots
f5c2c26fe4
fix: resolve compilation errors in frontend and backend
2026-05-29 17:46:15 +01:00
popertots
f36497090a
feat: migrate to dedicated patch test management
2026-05-29 17:19:02 +01:00
popertots
9d8015f1b8
feat: add comprehensive test suite for recent backend changes
2026-05-29 17:13:16 +01:00
popertots and Sisyphus
9ba4949d37
docs: update all documentation for referral codes, admin schedule page, BookingFlow welcome step, format utilities, and patch_test_duration_hours
...
- README: add new features (referral codes, admin schedule page, welcome step, format utils, patch_test_duration_hours, created_by_name, admin login redirect), update project structure, update test count to 446/449
- Overview: add referral code support to Auth section, created_by_name to Booking System, admin schedule page to Scheduling and Admin Features, welcome step to Customer Features, update test coverage
- Technical Manual: add format.ts utilities to Shared Utilities, add /admin/schedule route, update handler descriptions (auth, bookings, services), add Referral Code System, Admin Schedule Page, BookingFlow Welcome Step, and patch_test_duration_hours sections, update test coverage
- Admin Manual: add Schedule page to main pages list, add full Schedule (Weekly Calendar View) section, add patch test duration to service creation, update referral history description
- User Manual: add referral code field to registration, add welcome step explanation to Step 1
- Future Work: update header, add #52-58 completed items, update #21 referral system status, add Phase 6 execution order
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-29 16:21:18 +01:00
popertots and Sisyphus
ec097af0f6
refactor: route pages with shared formatting and layout updates
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-29 16:10:29 +01:00
popertots and Sisyphus
5705ef71b8
refactor: dialog and alert-dialog UI primitives
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-29 16:10:07 +01:00
popertots and Sisyphus
3aa0814b1a
fix: navbar layout and styling improvements
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-29 16:09:46 +01:00
popertots and Sisyphus
040a47401e
refactor: user payment modal
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-29 16:09:25 +01:00
popertots and Sisyphus
91999d8244
refactor: account modals with auto-select and formatting
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-29 16:09:05 +01:00
popertots and Sisyphus
fc69fec361
refactor: today page components with calendar grid and stats
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-29 16:08:44 +01:00
popertots and Sisyphus
18d8822c47
refactor: admin user modal, image upload, and new schedule page
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-29 16:08:25 +01:00
popertots and Sisyphus
a44972fbc6
refactor: admin edit and approval modals
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-29 16:08:05 +01:00
popertots and Sisyphus
b2788b2269
refactor: admin management components (discounts, holidays, schedule, time blockers)
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-29 16:07:44 +01:00
popertots and Sisyphus
96ab71a579
refactor: admin booking modals with shared formatting and auto-select
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-29 16:07:26 +01:00
popertots and Sisyphus
0b3d26914b
refactor: booking flow wizard with step indicator improvements
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-29 16:07:02 +01:00
popertots and Sisyphus
aa75217898
refactor: bookings and services handlers with shared formatting
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-29 16:06:40 +01:00
popertots and Sisyphus
9deae1b0d7
feat: referral code validation in registration with tests
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-29 16:06:19 +01:00
popertots and Sisyphus
0f118205d6
feat: add created_by_name field to Booking type
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-29 16:05:56 +01:00
popertots and Sisyphus
e8c03d6c30
refactor: extract shared formatting utilities (duration, date, age)
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-29 16:05:35 +01:00
popertots and Sisyphus
2b56c5640d
docs: update all documentation for reschedule modal, time blockers UI, and booking flow improvements
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-28 16:48:56 +01:00
popertots and Sisyphus
d23ed1831a
chore: update init scripts, dev script, and remove stale HAR file
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-28 16:34:13 +01:00
popertots and Sisyphus
91d20d474b
refactor: lunch protection to find all gaps instead of largest
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-28 16:34:13 +01:00
popertots and Sisyphus
72270649b6
fix: UI polish across navbar, payment modal, calendar, and dialog
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-28 16:34:13 +01:00
popertots and Sisyphus
fff8afcbe9
feat: account edit request modal with auto-select and responsive improvements
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-28 16:34:13 +01:00
popertots and Sisyphus
f69750da82
feat: today calendar with time blockers, stats, and pending approvals improvements
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-28 16:34:13 +01:00
popertots and Sisyphus
db5f6ff135
fix: admin booking modals and schedule components polish
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-28 16:34:13 +01:00
popertots and Sisyphus
329eb28ec7
feat: admin reschedule modal and time blockers for schedule management
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-28 16:34:13 +01:00
popertots and Sisyphus
6cf1f12442
refactor: admin BookingCreateModal to use shared time slot utilities
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-28 16:30:32 +01:00
popertots and Sisyphus
efbcfbaaf0
refactor: booking flow components with shared utilities and auto-select
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-28 16:30:07 +01:00
popertots and Sisyphus
7ee77d6bff
feat: shared time slot utility module for booking and admin components
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-28 16:29:41 +01:00
popertots and Sisyphus
c442c150c0
feat: scheduling exceptional hours support and default hours validation
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-28 16:29:17 +01:00
popertots and Sisyphus
3bda86e910
feat: GetBookingsByCreatedRange endpoint for admin booking queries
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-28 16:28:52 +01:00
popertots
8574bf2221
feat: enriched edit request system with side-by-side snapshots, calendar preloading, and admin review UI
...
Backend:
- Add enriched response types (EditSnapshot, EnrichedEditRequest) with original vs proposed snapshots
- Add 4 new GET endpoints for viewing edit requests (user and admin scoped)
- Remove github.com/lib/pq dependency — use native PostgreSQL array scanning
- Clean up edit requests, time blockers, and notifications on booking cancellation
- Validate exceptional closed hours on admin approve (409 Conflict)
- Notification upsert on edit request replace (no duplicate admin notifications)
Frontend:
- New user EditRequestModal with time/services/both modes and lunch protection
- New admin EditRequestModal with side-by-side diff (date/time, services, notes)
- Integrate edit requests into PendingApprovals card and notifications page
- Preload 3 months of availability to prevent calendar snap-back
- Apply lunch protection to isDateUnavailable in BookingFlow and BookingCreateModal
- Fix accessibility: card list items use <button> instead of <div>
Dev & Docs:
- Seed edit requests in local-dev-2.sh
- Update all Obsidian manuals with enriched edit request documentation
- 42 new tests (438/441 passing)
2026-05-26 11:59:07 +01:00
popertots and Sisyphus
3ccc017716
feat: user payment modal and tip route for online payments
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-25 18:05:14 +01:00
popertots and Sisyphus
97c9d1643f
docs: update all documentation for multi-method payments and saved cards
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-25 18:04:53 +01:00
popertots and Sisyphus
f553ebad99
fix: booking duration calculation, tip page auth, and UI polish across frontend
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-25 18:04:43 +01:00
popertots and Sisyphus
2a8f04e7b3
feat: saved cards management and account cards tab
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-25 18:04:21 +01:00
popertots and Sisyphus
785a6dbf6f
feat: multi-method payment modal with tip presets and price overrides
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-25 18:04:12 +01:00
popertots and Sisyphus
25ece1e0b4
feat: Square client dev mock for online payments and type additions
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-25 18:04:04 +01:00
popertots and Sisyphus
4a37fd6396
fix: payment API amount precision (pence), partial validation, and create payment method endpoint
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-25 18:03:55 +01:00
popertots
8cd393f95d
docs: update all documentation for Square payment integration
...
- README: add Square payments to features, expand project structure, update test count
- Overview: mark Square as active, add payment integration + saved cards sections
- Technical Manual: add payment handlers, API endpoints, 4 new DB tables, build tags
- Admin Manual: update Take Payment from stub to live Square Terminal flow
- User Manual: add paying deposits online + leaving tips sections
- Future Work: mark E1-E4 (Square items) as complete
2026-05-23 11:44:39 +01:00
popertots
2e1ab9d745
feat: Square payment integration, booking flow redesign, and timezone/weekday fixes
...
- Add Square payment integration (mock + handlers + UI): terminal/online payments,
refunds, tips, saved cards, webhooks. Build-tagged dev/prod clients.
- Redesign booking flow: Step 4 conditional (deposit only), Step 5 confirmation
screen with booking ID, auto-submit on transition.
- Redesign schedule modal: 2x3 button grid with Pay Deposit/Pay Early logic.
- Add deposit warning banner at Step 1 for users with outstanding deposits.
- Fix weekday conversion bug: Go 0=Sunday vs DB 0=Monday mismatch in 6 locations.
- Fix timezone bug: UTC vs London time in closing hours validation.
- Fix frontend error parsing: plain text backend errors now displayed correctly.
- Fix crypto.randomUUID fallback for environments without Web Crypto.
- Add 7 new regression tests: closing hours, advance check, active booking limit,
weekday conversion, UTC/London, deposit snapshot, exceptional hours.
- Fix 3 flaky tests: dynamic dates instead of fixed, no-show timing.
2026-05-23 11:29:34 +01:00
popertots
bcd5ed2bd9
square mock plan
2026-05-17 11:03:05 +01:00
popertots
d0e82e7d79
style: fix indentation in notification preferences section and backlog table formatting
2026-05-17 00:37:21 +01:00
popertots
c91be086c1
fix: close unclosed div wrapping notification preferences section
2026-05-17 00:34:34 +01:00
popertots
5c84cd71b8
fix: hide notification preferences section from admin users
2026-05-17 00:28:55 +01:00
popertots
b08df624a8
feat: user notification preferences UI and API endpoints
...
GET/PUT /api/user/notification-preferences with partial update support.
Toggle section in /account Admin tab (Email, SMS, Browser push).
3 new tests: defaults, full update, partial update.
Fix pre-existing timezone bug in exceptional hours tests (Truncate vs time.Date).
Update README, Technical Manual, and gap backlog (#15 struck out).
2026-05-17 00:24:13 +01:00
popertots
7fc58f58d9
feat: admin notification system with priority ordering, bell icon, and /notifications page
...
Two-tier notification system: new_booking (all public bookings) + pending_booking (notes/today).
Priority-sorted queue, unread count polling, enriched responses with user_name/booking_start_time.
Fix critical bug: edit_requested cleanup was broken (wrong reason string in 3 handlers).
Add 15 new tests covering priority ordering, enrichment, and notification creation flows.
Update Admin Manual, Technical Manual, and gap backlog docs.
2026-05-16 23:41:18 +01:00
popertots
c3501ae89a
dependancies and docs
2026-05-16 19:06:33 +01:00
popertots
924bf487ed
docs: reorganise Obsidian docs from monolith into multi-page knowledge base
...
Split Crussell Nails.md (822 lines) into 5 focused documents:
- README.md: slimmed to 84 lines (elevator pitch + run instructions)
- Overview.md: expanded landing page with architecture diagram and quick links
- User Manual.md: 358 lines, customer-facing journeys in plain English
- Admin Manual.md: 493 lines, staff operations guide with zero technical jargon
- Technical Manual.md: 736 lines, full API reference, schema, key systems
All user/admin manuals rewritten for non-technical audiences — no API
endpoints, component names, or implementation details.
2026-05-16 19:05:47 +01:00
popertots
a4ea994c69
docs: update README, Obsidian docs, and gap backlog for booking edit modal
...
Reflect new PUT /api/admin/bookings/{id} services endpoint, EditBookingModal
component, and updated test count (306/308). Mark handleEdit() stub resolved
in gap backlog.
2026-05-16 17:32:32 +01:00
popertots
80621e0d77
feat: add booking edit modal for /today page with service management
...
Replace placeholder BookingModal on the Next Appointment edit button with a
dedicated EditBookingModal that allows admins to add, remove, and override
services on an active booking. Includes backend PUT endpoint with overlap
detection and full test suite (20 tests).
2026-05-16 17:23:00 +01:00
popertots
44259a32ab
ui: swap Cancel and Payment button layout in Next Appointment card
...
Cancel is now half-width (inline with Edit/Extend), Payment is full-width spanning bottom row
2026-05-10 20:02:18 +01:00
popertots
aa4a569a43
docs: update README, Obsidian docs, and gap backlog after test optimization
...
- Update test count: 286/288 passing (was 222/224)
- Document TestMain per-package architecture
- Document TruncateTables optimization (~60% faster)
- Add local-dev-2.sh tee streaming for real-time test output
- Fix flaky admin reserve walk-in tests (time.Now → noon tomorrow)
- Add gap backlog item #51 for completed test optimization work
2026-05-10 19:48:36 +01:00
popertots
e73c96b653
refactor: optimize test DB setup — TestMain per package, truncate-only between tests
...
- Add TestMain to all 10 test packages (schema DROP+CREATE runs once per package)
- Convert per-test setupTestDB to resetTestData (TRUNCATE only, ~60% faster)
- Add 3 missing tables to TruncateTables (booking_edit_requests, exceptional_group_applications, business_settings)
- Remove dead truncateDiscountTables helper
- Consolidate discount_test.go into package bookings (was external test package)
- Update testutils.SetupTestDB to truncate-only
- Fix unused imports across user, bookings, and handlers packages
- Verify: 286 passing, 2 skipped, 0 failures with -count=2 (no state leakage)
2026-05-10 17:27:51 +01:00
popertots
83c62ffb97
feat: edit request time blockers, today closing time, UI polish, and test fixes
...
- Add time blocker management for booking edit requests
- Add closing_time field to admin today/current-next endpoint
- Update UserBookingModal and CurrentAppointment UI components
- Fix fmt import in bookings_test.go (was missing)
- Fix created_by FK in TestAdminApproveEditRequest_TimeBlockerOverlap
- Update test coverage for edit request time blocker overlap
- Update gap backlog documentation
2026-05-10 16:53:17 +01:00
popertots and Sisyphus
f3fb44f401
fix: port slot grouping fixes across all booking journeys
...
UserBookingModal (reschedule): add lunch protection filtering, validation guard preventing invalid start>end unavailable blocks, composite each keys, and simplified available/unavailable rendering (lunch is invisible to users).
BookingCreateModal (admin): add validation guard for unavailable blocks and fix composite each keys. Admin lunch protection behavior (30min min + amber warning) preserved.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-10 14:26:28 +01:00
popertots
e1c815ed09
fix(loyalty): correct stamp accumulation, one-per-day guard, and test coverage
...
- Handler: apply existing redemption BEFORE incrementing stamps (was creating
and applying redemption to same booking)
- Handler: guard stamp increment behind bookingTotal > 0 (free bookings don't
earn stamps)
- Handler: fix global milestone off-by-one (globalCount already includes
current booking since status updated before discount logic)
- Schema: chk_milestone constraint only requires milestone_unit for anniversary
type, not per_user_booking_count or global_booking_count
- Tests: rewrite from scratch with 12 focused tests:
- FullCycle, ExistingRedemptionApplies, OneStampPerDay, ZeroTotalNoStamp,
CycleRepeats, TimeBasedCampaign, PerUserMilestone, GlobalMilestone,
AnniversaryMilestone, LoyaltyPriority, NoDiscountOnZeroTotal,
CampaignMaxRedemptions
- Tests: fix path parameter extraction in makeProgressRequest
- Vendor: go mod tidy + vendor for testify dependency
2026-05-10 13:17:08 +01:00
popertots
e7d3a83867
fix: refine unavailable slot grouping validation logic
2026-05-10 12:08:13 +01:00
popertots
f1a9d129e6
fix: unique keys for time slot each block to prevent duplicate key errors
...
- Use type+startTime+endTime composite key instead of startTime alone
- Prevents collisions when available and unavailable slots share start times
2026-05-10 11:57:05 +01:00
popertots
1c237cc97b
fix: merge lunch-blocked slots into single unavailable group
...
- generateGroupedTimeSlots now accepts lunchProtection map parameter
- Lunch-blocked slots treated as unavailable during grouping, not after
- Consecutive lunch-blocked slots merge into one unavailable button
- Admin BookingCreateModal already had this fix; BookingFlow now matches
2026-05-10 11:53:22 +01:00
popertots
41666b0739
fix: full reschedule implementation with real available slots
...
- Fetch /api/scheduling/working-hours and /api/scheduling/available-hours for reschedule month
- Generate grouped time slots using same logic as BookingFlow (available + unavailable with start-end times)
- DatePicker uses isDateUnavailable based on real availability (no slots = unavailable)
- Time slots show X - Y format (e.g. 9:30 AM - 10:00 AM) matching booking flow
- Unavailable slots shown as disabled buttons
- Today's slots respect 2-hour minimum notice buffer
- Hours fetched on first reschedule open or calendar month change
2026-05-08 22:44:18 +01:00
popertots
6d95eb6dcf
fix: match date/time picker style, fix two-row footer layout
...
- Replace Modal.Footer with plain div to avoid bits-ui class merging (sm:flex-row override)
- DatePicker wrapped in flex items-center justify-center matching BookingCreateModal
- Time picker uses Button elements with fuchsia selection (hover:bg-fuchsia-50, bg-fuchsia-100)
- Generate 30-min time slots from 08:00-18:00 matching salon hours
- Reschedule form container uses bg-gray-50 matching other sections
- Footer: two rows with flex-1 buttons for equal width
2026-05-08 22:27:40 +01:00
popertots
8b539afccc
fix: two-row footer layout, use DatePicker for reschedule
...
- Footer: row 1 has Cancel + Reschedule, row 2 has Add to Calendar + Close
- Replace native datetime-local input with DatePicker component from BookingFlow
- Add native time input for preferred time selection
- Buttons use flex-1 for equal width on mobile
2026-05-08 22:13:13 +01:00
popertots
fa10134d41
feat: user booking cancel/reschedule, estimated subtotal wording
...
- Add Cancel Booking button with confirmation dialog (future bookings only, pending/confirmed status)
- If payments exist, dialog shows warning: amount paid retained as credit towards future appointment
- Add Reschedule button with inline form (date/time picker + optional notes)
- Reschedule submits to POST /api/bookings/{id}/edit-request
- Change 'Amount Due' to 'Estimated Subtotal' for future bookings
- Footer: Cancel (left) | Reschedule, Add to Calendar, Close (right)
- Mobile-first: flex-wrap layout for footer buttons
2026-05-08 22:02:16 +01:00