- PostgreSQL schema: resources + resources_bookings tables with indexes - Server-side client with PG pool + in-memory fallback for dev - API routes: list, get, availability check, book, cancel - Resource store (Zustand) for client-side state - ResourcePicker component: type filter, search, availability dots - Integrated into event-modal: auto-book on save, auto-cancel on delete - Integrated into free-busy-view: resource availability rows
30 lines
1.1 KiB
SQL
30 lines
1.1 KiB
SQL
CREATE TABLE IF NOT EXISTS resources (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
tenant_id UUID NOT NULL,
|
|
name TEXT NOT NULL,
|
|
type TEXT NOT NULL CHECK (type IN ('room', 'vehicle', 'equipment', 'other')),
|
|
location TEXT,
|
|
capacity INTEGER,
|
|
description TEXT,
|
|
contact_email TEXT,
|
|
is_active BOOLEAN DEFAULT true,
|
|
metadata JSONB DEFAULT '{}',
|
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS resources_bookings (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
resource_id UUID NOT NULL REFERENCES resources(id) ON DELETE CASCADE,
|
|
event_id TEXT,
|
|
start_time TIMESTAMPTZ NOT NULL,
|
|
end_time TIMESTAMPTZ NOT NULL,
|
|
booked_by TEXT NOT NULL,
|
|
created_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_resources_tenant ON resources(tenant_id);
|
|
CREATE INDEX IF NOT EXISTS idx_resources_type ON resources(type);
|
|
CREATE INDEX IF NOT EXISTS idx_bookings_resource_time ON resources_bookings(resource_id, start_time, end_time);
|
|
CREATE INDEX IF NOT EXISTS idx_bookings_time ON resources_bookings(start_time, end_time);
|