Files
backend/database/migrations/059_videos.sql
T
Alireza HassaniandCursor d5e502cf77 Add Mellat e-payment, videos/instructions CMS, and legacy domain lookup.
Store gateway credentials per business, initiate/verify Mellat at checkout, and resolve old CMS ids from domains in the migrate modal.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-13 09:51:17 +03:30

74 lines
2.7 KiB
SQL

-- 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;