Spaces:
Sleeping
Sleeping
File size: 8,496 Bytes
0db726e 5d722a7 0db726e 5d722a7 0db726e 5d722a7 0db726e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 | /*
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 $$;
|