mirror of
https://github.com/Dvorinka/Bookra.git
synced 2026-10-28 23:51:17 +00:00
class_schedules rules generate concrete session rows for a rolling 28-day horizon — no cron; materialize runs idempotently on dashboard and public reads via a partial unique index on (schedule_id, starts_at). Rule delete stops future sessions; existing sessions keep bookings and overrides. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
28 lines
1.2 KiB
SQL
28 lines
1.2 KiB
SQL
-- +goose Up
|
|
-- Weekly recurring rules for class sessions. Rules materialize concrete
|
|
-- session rows for a rolling horizon (the service writes them); sessions
|
|
-- keep a nullable schedule_id link so regeneration is idempotent via the
|
|
-- partial unique index and deleting a rule stops future sessions without
|
|
-- touching existing ones.
|
|
CREATE TABLE class_schedules (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
tenant_id uuid NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
|
|
template_id uuid NOT NULL REFERENCES class_templates(id) ON DELETE CASCADE,
|
|
location_id uuid REFERENCES locations(id) ON DELETE SET NULL,
|
|
day_of_week integer NOT NULL CHECK (day_of_week BETWEEN 0 AND 6),
|
|
starts_local time NOT NULL,
|
|
active boolean NOT NULL DEFAULT true,
|
|
created_at timestamptz NOT NULL DEFAULT now()
|
|
);
|
|
CREATE INDEX class_schedules_tenant_idx ON class_schedules (tenant_id);
|
|
|
|
ALTER TABLE class_sessions
|
|
ADD COLUMN schedule_id uuid REFERENCES class_schedules(id) ON DELETE SET NULL;
|
|
CREATE UNIQUE INDEX class_sessions_schedule_start_idx
|
|
ON class_sessions (schedule_id, starts_at)
|
|
WHERE schedule_id IS NOT NULL;
|
|
|
|
-- +goose Down
|
|
ALTER TABLE class_sessions DROP COLUMN IF EXISTS schedule_id;
|
|
DROP TABLE IF EXISTS class_schedules;
|