Refactor patch test system and add booking edit requests

- Replace patch_test_duration_hours on services with separate
  patch_tests table
- Add user_patch_tests table to track user patch test records
- Add booking edit request system: users can request time changes
- Add admin handlers to list, approve, and reject edit requests
- Add validation to prevent editing completed/cancelled bookings
- Add overlap and closed-day checks for booking edits
This commit is contained in:
2026-02-24 17:23:28 +00:00
parent 89d848ee72
commit f59595eeec
11 changed files with 906 additions and 255 deletions
+32 -11
View File
@@ -150,6 +150,38 @@ CREATE INDEX idx_verification_codes_code ON verification_codes (code);
CREATE INDEX idx_verification_codes_user_purpose ON verification_codes (user_id, purpose) WHERE used_at IS NULL;
CREATE INDEX idx_verification_codes_expires ON verification_codes (expires_at) WHERE used_at IS NULL;
-- =======================================
-- PATCH TESTS TABLE
-- =======================================
CREATE TABLE patch_tests (
id CHAR(12) PRIMARY KEY DEFAULT generate_service_id(),
name VARCHAR(100) NOT NULL,
description TEXT,
notice_duration_hours INT NOT NULL DEFAULT 24,
expiry_months INT NOT NULL DEFAULT 6,
service_ids CHAR(12)[] DEFAULT '{}',
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_patch_tests_name ON patch_tests(name);
-- =======================================
-- USER PATCH TESTS TABLE
-- =======================================
CREATE TABLE user_patch_tests (
id BIGSERIAL PRIMARY KEY,
user_id CHAR(12) NOT NULL REFERENCES users(id) ON DELETE CASCADE,
patch_test_id CHAR(12) NOT NULL REFERENCES patch_tests(id) ON DELETE CASCADE,
tested_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
notes TEXT,
UNIQUE (user_id, patch_test_id)
);
CREATE INDEX idx_user_patch_tests_user ON user_patch_tests(user_id);
CREATE INDEX idx_user_patch_tests_tested_at ON user_patch_tests(tested_at);
-- =======================================
-- SERVICES TABLE
-- =======================================
@@ -161,7 +193,6 @@ CREATE TABLE services (
price NUMERIC(10,2) NOT NULL,
duration_minutes INT NOT NULL,
is_active BOOLEAN NOT NULL DEFAULT TRUE,
patch_test_duration_hours INT NOT NULL DEFAULT 0,
minimum_age_required INT NOT NULL DEFAULT 16,
requires_manual_pricing BOOLEAN NOT NULL DEFAULT FALSE,
requires_manual_duration BOOLEAN NOT NULL DEFAULT FALSE,
@@ -171,16 +202,6 @@ CREATE TABLE services (
CREATE INDEX idx_services_name ON services(name);
CREATE TABLE user_service_patch_tests (
id BIGSERIAL PRIMARY KEY,
user_id CHAR(12) NOT NULL REFERENCES users(id) ON DELETE CASCADE,
service_id CHAR(12) NOT NULL REFERENCES services(id) ON DELETE CASCADE,
last_time TIMESTAMPTZ NOT NULL,
UNIQUE (user_id, service_id)
);
CREATE INDEX idx_service_patch_tests_userid ON user_service_patch_tests(user_id);
-- =======================================
-- BOOKINGS TABLE
-- =======================================