-- Meshkee CMS — website static image slots (single or list, optional link per image) CREATE TABLE website_image_slots ( id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, business_id BIGINT NOT NULL, slot_key VARCHAR(100) NOT NULL, kind VARCHAR(20) NOT NULL, label VARCHAR(255) NOT NULL, aspect_ratio VARCHAR(20), recommended_width INTEGER, sort_order INTEGER NOT NULL DEFAULT 0, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), CONSTRAINT website_image_slots_business_id_fkey FOREIGN KEY (business_id) REFERENCES businesses (id) ON DELETE CASCADE, CONSTRAINT website_image_slots_kind_check CHECK (kind IN ('single', 'list')), CONSTRAINT website_image_slots_aspect_ratio_check CHECK (aspect_ratio IS NULL OR aspect_ratio ~ '^[0-9]{1,3}:[0-9]{1,3}$'), CONSTRAINT website_image_slots_recommended_width_check CHECK (recommended_width IS NULL OR recommended_width > 0) ); CREATE UNIQUE INDEX website_image_slots_business_id_slot_key_unique ON website_image_slots (business_id, slot_key); CREATE INDEX idx_website_image_slots_business_id ON website_image_slots (business_id); CREATE TRIGGER website_image_slots_set_updated_at BEFORE UPDATE ON website_image_slots FOR EACH ROW EXECUTE FUNCTION set_updated_at(); CREATE TABLE website_image_slot_items ( id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, slot_id BIGINT NOT NULL, image_media_id BIGINT NOT NULL, title VARCHAR(255), link_url VARCHAR(2048), sort_order INTEGER NOT NULL DEFAULT 0, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), CONSTRAINT website_image_slot_items_slot_id_fkey FOREIGN KEY (slot_id) REFERENCES website_image_slots (id) ON DELETE CASCADE, CONSTRAINT website_image_slot_items_image_media_id_fkey FOREIGN KEY (image_media_id) REFERENCES media (id) ON DELETE RESTRICT ); CREATE INDEX idx_website_image_slot_items_slot_id ON website_image_slot_items (slot_id); CREATE INDEX idx_website_image_slot_items_image_media_id ON website_image_slot_items (image_media_id); CREATE TRIGGER website_image_slot_items_set_updated_at BEFORE UPDATE ON website_image_slot_items FOR EACH ROW EXECUTE FUNCTION set_updated_at(); -- First test slot for live sanihome.ir (no-op if that domain is not in this database) INSERT INTO website_image_slots ( business_id, slot_key, kind, label, aspect_ratio, recommended_width, sort_order ) SELECT DISTINCT ON (d.business_id) d.business_id, 'home-hero', 'list', 'Home hero', '16:9', 1440, 0 FROM domains d WHERE lower(regexp_replace(d.host, '^www\.', '')) = 'sanihome.ir' ON CONFLICT (business_id, slot_key) DO NOTHING;