-- Videos module (embedded YouTube / Aparat) ALTER TYPE media_entity_type ADD VALUE IF NOT EXISTS 'video'; CREATE TYPE video_provider AS ENUM ('youtube', 'aparat'); CREATE TABLE videos ( id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, business_id BIGINT NOT NULL, author_id BIGINT, title VARCHAR(255) NOT NULL, title_fa VARCHAR(255), title_en VARCHAR(255), slug VARCHAR(255) NOT NULL, excerpt TEXT, content JSONB NOT NULL DEFAULT '{}', video_provider video_provider NOT NULL, embed_code TEXT NOT NULL, status content_status NOT NULL DEFAULT 'draft', featured_media_id BIGINT, published_at TIMESTAMPTZ, metadata JSONB NOT NULL DEFAULT '{}', created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), CONSTRAINT videos_business_slug_unique UNIQUE (business_id, slug), CONSTRAINT videos_business_id_fkey FOREIGN KEY (business_id) REFERENCES businesses (id) ON DELETE CASCADE, CONSTRAINT videos_author_id_fkey FOREIGN KEY (author_id) REFERENCES users (id) ON DELETE SET NULL, CONSTRAINT videos_featured_media_id_fkey FOREIGN KEY (featured_media_id) REFERENCES media (id) ON DELETE SET NULL ); CREATE INDEX idx_videos_business_id ON videos (business_id); CREATE INDEX idx_videos_business_status ON videos (business_id, status); CREATE INDEX idx_videos_business_published ON videos (business_id, published_at DESC); CREATE INDEX idx_videos_author_id ON videos (author_id); CREATE TRIGGER videos_set_updated_at BEFORE UPDATE ON videos FOR EACH ROW EXECUTE FUNCTION set_updated_at(); -- Permissions INSERT INTO permissions (name, slug, group_name, description) VALUES ('View videos', 'videos.read', 'videos', 'View videos'), ('Create videos', 'videos.create', 'videos', 'Create videos'), ('Update videos', 'videos.update', 'videos', 'Edit videos'), ('Delete videos', 'videos.delete', 'videos', 'Delete videos'), ('Publish videos', 'videos.publish', 'videos', 'Publish and unpublish videos') ON CONFLICT (slug) DO NOTHING; INSERT INTO role_permissions (role_id, permission_id) SELECT r.id, p.id FROM roles r JOIN permissions p ON p.slug LIKE 'videos.%' WHERE r.slug IN ('business_owner', 'owner', 'admin') ON CONFLICT DO NOTHING; INSERT INTO role_permissions (role_id, permission_id) SELECT r.id, p.id FROM roles r JOIN permissions p ON p.slug IN ('videos.read', 'videos.create', 'videos.update', 'videos.publish') WHERE r.slug = 'editor' ON CONFLICT DO NOTHING; INSERT INTO role_permissions (role_id, permission_id) SELECT r.id, p.id FROM roles r JOIN permissions p ON p.slug = 'videos.read' WHERE r.slug = 'viewer' ON CONFLICT DO NOTHING;