kstools-license-manager / supabase-version-schema-autocad.sql
KyrosDev's picture
調整檔案命名格式
5d722a7
/*
KSTools AutoCAD 版本管理系統 - Supabase Schema Extension
Project 2: kstools-public (版本系統)
這個 schema 擴展現有的 Revit 版本系統以支援 AutoCAD
使用獨立表格但共用同一個 Storage bucket 的不同資料夾
*/
-- ================================
-- AutoCAD 版本管理表
-- ================================
-- AutoCAD 版本表
CREATE TABLE IF NOT EXISTS versions_autocad (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
version VARCHAR(20) NOT NULL UNIQUE,
title VARCHAR(255),
release_date TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
is_active BOOLEAN DEFAULT true,
download_url TEXT NOT NULL,
file_size BIGINT,
file_type VARCHAR(10) CHECK (file_type IN ('zip', 'exe', 'msi')) DEFAULT 'zip',
file_name TEXT NOT NULL,
changelog TEXT,
min_autocad_version VARCHAR(10),
released_by VARCHAR(255),
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- AutoCAD 下載記錄表
CREATE TABLE IF NOT EXISTS download_logs_autocad (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
version VARCHAR(20),
license_key VARCHAR(255),
action VARCHAR(20) CHECK (action IN ('download', 'update_check', 'install')),
user_agent TEXT,
ip_address INET,
downloaded_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- ================================
-- 索引優化
-- ================================
-- AutoCAD 版本表索引
CREATE INDEX IF NOT EXISTS idx_versions_autocad_version ON versions_autocad(version);
CREATE INDEX IF NOT EXISTS idx_versions_autocad_release_date ON versions_autocad(release_date DESC);
CREATE INDEX IF NOT EXISTS idx_versions_autocad_is_active ON versions_autocad(is_active);
-- AutoCAD 下載記錄表索引
CREATE INDEX IF NOT EXISTS idx_download_logs_autocad_version ON download_logs_autocad(version);
CREATE INDEX IF NOT EXISTS idx_download_logs_autocad_downloaded_at ON download_logs_autocad(downloaded_at DESC);
CREATE INDEX IF NOT EXISTS idx_download_logs_autocad_action ON download_logs_autocad(action);
-- ================================
-- Row Level Security (RLS) 政策
-- ================================
-- 啟用 RLS
DO $$
BEGIN
ALTER TABLE versions_autocad ENABLE ROW LEVEL SECURITY;
EXCEPTION
WHEN OTHERS THEN NULL;
END $$;
DO $$
BEGIN
ALTER TABLE download_logs_autocad ENABLE ROW LEVEL SECURITY;
EXCEPTION
WHEN OTHERS THEN NULL;
END $$;
-- 安全建立 RLS 政策
DO $$
BEGIN
-- AutoCAD 版本表政策
DROP POLICY IF EXISTS "Public read versions autocad" ON versions_autocad;
CREATE POLICY "Public read versions autocad" ON versions_autocad
FOR SELECT USING (true);
DROP POLICY IF EXISTS "Service role insert versions autocad" ON versions_autocad;
CREATE POLICY "Service role insert versions autocad" ON versions_autocad
FOR INSERT WITH CHECK (auth.role() = 'service_role');
DROP POLICY IF EXISTS "Service role update versions autocad" ON versions_autocad;
CREATE POLICY "Service role update versions autocad" ON versions_autocad
FOR UPDATE USING (auth.role() = 'service_role');
DROP POLICY IF EXISTS "Service role delete versions autocad" ON versions_autocad;
CREATE POLICY "Service role delete versions autocad" ON versions_autocad
FOR DELETE USING (auth.role() = 'service_role');
-- AutoCAD 下載記錄表政策
DROP POLICY IF EXISTS "Service role all download_logs autocad" ON download_logs_autocad;
CREATE POLICY "Service role all download_logs autocad" ON download_logs_autocad
FOR ALL USING (auth.role() = 'service_role');
END $$;
-- ================================
-- 觸發器:自動更新 updated_at
-- ================================
-- 使用現有的更新時間觸發器函數
DO $$
BEGIN
DROP TRIGGER IF EXISTS update_versions_autocad_updated_at ON versions_autocad;
CREATE TRIGGER update_versions_autocad_updated_at
BEFORE UPDATE ON versions_autocad
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
END $$;
-- ================================
-- 有用的查詢視圖
-- ================================
-- AutoCAD 最新版本視圖
DROP VIEW IF EXISTS latest_version_autocad;
CREATE VIEW latest_version_autocad AS
SELECT *
FROM versions_autocad
WHERE is_active = true
ORDER BY release_date DESC
LIMIT 1;
-- AutoCAD 版本統計視圖
DROP VIEW IF EXISTS version_stats_autocad;
CREATE VIEW version_stats_autocad AS
SELECT
v.version,
v.release_date,
COUNT(dl.id) as download_count,
COUNT(CASE WHEN dl.action = 'download' THEN 1 END) as actual_downloads,
COUNT(CASE WHEN dl.action = 'update_check' THEN 1 END) as update_checks
FROM versions_autocad v
LEFT JOIN download_logs_autocad dl ON v.version = dl.version
WHERE v.is_active = true
GROUP BY v.id, v.version, v.release_date
ORDER BY v.release_date DESC;
-- ================================
-- Storage Bucket 設定
-- ================================
-- 安全建立 AutoCAD Storage Bucket(如果不存在)
DO $$
BEGIN
INSERT INTO storage.buckets (id, name, public)
VALUES ('plugin-releases-autocad', 'plugin-releases-autocad', true);
EXCEPTION
WHEN unique_violation THEN NULL; -- Bucket 已存在
END $$;
-- Storage RLS 政策設定(安全建立)
DO $$
BEGIN
-- 1. 允許公開讀取 AutoCAD 發布檔案
DROP POLICY IF EXISTS "Public read autocad plugin releases" ON storage.objects;
CREATE POLICY "Public read autocad plugin releases" ON storage.objects
FOR SELECT USING (bucket_id = 'plugin-releases-autocad');
-- 2. 允許 Service Role 管理檔案(上傳、更新、刪除)
DROP POLICY IF EXISTS "Service role manage autocad plugin releases" ON storage.objects;
CREATE POLICY "Service role manage autocad plugin releases" ON storage.objects
FOR ALL USING (auth.role() = 'service_role' AND bucket_id = 'plugin-releases-autocad');
-- 3. 允許認證用戶上傳檔案(可選)
DROP POLICY IF EXISTS "Authenticated users upload autocad plugin releases" ON storage.objects;
CREATE POLICY "Authenticated users upload autocad plugin releases" ON storage.objects
FOR INSERT WITH CHECK (
bucket_id = 'plugin-releases-autocad' AND
auth.role() = 'authenticated'
);
END $$;
/*
Storage 結構說明:
Revit 插件:
- Bucket: plugin-releases
- 檔案命名:KSTools-v{version}-Revit.{ext}
- 範例:plugin-releases/KSTools-v1.0.0-Revit.zip
AutoCAD 插件:
- Bucket: plugin-releases-autocad
- 檔案命名:KSTools-AutoCAD-v{version}.{ext}
- 範例:plugin-releases-autocad/KSTools-AutoCAD-v1.0.0.zip
優點:
- 透過不同 bucket 完全隔離兩個產品
- 檔名加上產品類型後綴,易於識別
- 避免版本管理混淆
*/
-- ================================
-- 資料表註解
-- ================================
COMMENT ON TABLE versions_autocad IS 'AutoCAD 插件版本資訊表';
COMMENT ON COLUMN versions_autocad.version IS '版本號,格式:x.y.z';
COMMENT ON COLUMN versions_autocad.title IS '版本標題,簡短描述版本特色';
COMMENT ON COLUMN versions_autocad.download_url IS '下載連結URL';
COMMENT ON COLUMN versions_autocad.file_size IS '檔案大小(位元組)';
COMMENT ON COLUMN versions_autocad.file_type IS '檔案類型:zip, exe, msi';
COMMENT ON COLUMN versions_autocad.file_name IS '檔案名稱,格式:KSTools-AutoCAD-v{version}.{ext}';
COMMENT ON COLUMN versions_autocad.changelog IS '更新日誌(Markdown格式)';
COMMENT ON COLUMN versions_autocad.min_autocad_version IS '最小支援的 AutoCAD 版本';
COMMENT ON TABLE download_logs_autocad IS 'AutoCAD 下載記錄表';
COMMENT ON COLUMN download_logs_autocad.action IS '操作類型:download, update_check, install';
-- ================================
-- 執行完成提示
-- ================================
DO $$
BEGIN
RAISE NOTICE '✅ AutoCAD 版本管理 Schema 已成功建立或更新';
RAISE NOTICE '📦 Revit Storage bucket: plugin-releases';
RAISE NOTICE '📦 AutoCAD Storage bucket: plugin-releases-autocad';
RAISE NOTICE '📝 Revit 檔案命名:KSTools-Revit-v{version}.{ext}';
RAISE NOTICE '📝 AutoCAD 檔案命名:KSTools-AutoCAD-v{version}.{ext}';
RAISE NOTICE '';
RAISE NOTICE '⚠️ 重要:現有 Revit 檔案需要重新命名加上 -Revit 後綴';
RAISE NOTICE ' 或在 API 中加入相容邏輯以支援舊檔名';
END $$;