移除版本刪除外鍵約束限制
Browse files- supabase-version-schema.sql +98 -183
supabase-version-schema.sql
CHANGED
|
@@ -10,11 +10,27 @@ Project 2: kstools-public (版本系統)
|
|
| 10 |
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
| 11 |
|
| 12 |
-- ================================
|
| 13 |
-
--
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 14 |
-- ================================
|
| 15 |
|
| 16 |
-- 版本表
|
| 17 |
-
CREATE TABLE versions (
|
| 18 |
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
| 19 |
version VARCHAR(20) NOT NULL UNIQUE,
|
| 20 |
title VARCHAR(255),
|
|
@@ -32,17 +48,14 @@ CREATE TABLE versions (
|
|
| 32 |
);
|
| 33 |
|
| 34 |
-- 下載記錄表
|
| 35 |
-
CREATE TABLE download_logs (
|
| 36 |
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
| 37 |
version VARCHAR(20),
|
| 38 |
license_key VARCHAR(255),
|
| 39 |
action VARCHAR(20) CHECK (action IN ('download', 'update_check', 'install')),
|
| 40 |
user_agent TEXT,
|
| 41 |
ip_address INET,
|
| 42 |
-
downloaded_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
| 43 |
-
|
| 44 |
-
-- 建立外鍵關聯
|
| 45 |
-
CONSTRAINT fk_version FOREIGN KEY (version) REFERENCES versions(version)
|
| 46 |
);
|
| 47 |
|
| 48 |
-- ================================
|
|
@@ -50,194 +63,91 @@ CREATE TABLE download_logs (
|
|
| 50 |
-- ================================
|
| 51 |
|
| 52 |
-- 版本表索引
|
| 53 |
-
CREATE INDEX idx_versions_version ON versions(version);
|
| 54 |
-
CREATE INDEX idx_versions_release_date ON versions(release_date DESC);
|
| 55 |
-
CREATE INDEX idx_versions_is_active ON versions(is_active);
|
| 56 |
|
| 57 |
-- 下載記錄表索引
|
| 58 |
-
CREATE INDEX idx_download_logs_version ON download_logs(version);
|
| 59 |
-
CREATE INDEX idx_download_logs_downloaded_at ON download_logs(downloaded_at DESC);
|
| 60 |
-
CREATE INDEX idx_download_logs_action ON download_logs(action);
|
| 61 |
|
| 62 |
-- ================================
|
| 63 |
-- Row Level Security (RLS) 政策
|
| 64 |
-- ================================
|
| 65 |
|
| 66 |
-
-- 啟用 RLS
|
| 67 |
-
|
| 68 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 69 |
|
| 70 |
-
--
|
| 71 |
-
|
| 72 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 73 |
|
| 74 |
-
|
| 75 |
-
|
|
|
|
| 76 |
|
| 77 |
-
|
| 78 |
-
|
|
|
|
| 79 |
|
| 80 |
-
-- 下載記錄表
|
| 81 |
-
|
| 82 |
-
|
|
|
|
|
|
|
| 83 |
|
| 84 |
-- ================================
|
| 85 |
-- Storage Bucket 設定
|
| 86 |
-- ================================
|
| 87 |
|
| 88 |
-
-- 建立 Storage Bucket
|
| 89 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 90 |
|
| 91 |
-
--
|
| 92 |
-
|
| 93 |
-
CREATE POLICY "
|
| 94 |
-
|
| 95 |
|
| 96 |
-
--
|
| 97 |
-
|
| 98 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 99 |
|
| 100 |
-
-- 3. 允許認證用戶上傳檔案(可選,如果需要讓登入用戶上傳)
|
| 101 |
-
CREATE POLICY "Authenticated users upload plugin releases" ON storage.objects
|
| 102 |
-
FOR INSERT WITH CHECK (
|
| 103 |
-
bucket_id = 'plugin-releases' AND
|
| 104 |
-
auth.role() = 'authenticated'
|
| 105 |
-
);
|
| 106 |
-
|
| 107 |
-
-- ================================
|
| 108 |
-
-- 初始資料
|
| 109 |
-
-- ================================
|
| 110 |
-
|
| 111 |
-
-- 插入測試版本資料(支援多種檔案格式)
|
| 112 |
-
INSERT INTO versions (
|
| 113 |
-
version,
|
| 114 |
-
title,
|
| 115 |
-
release_date,
|
| 116 |
-
is_active,
|
| 117 |
-
download_url,
|
| 118 |
-
file_size,
|
| 119 |
-
file_type,
|
| 120 |
-
file_name,
|
| 121 |
-
changelog,
|
| 122 |
-
min_revit_version,
|
| 123 |
-
released_by
|
| 124 |
-
) VALUES
|
| 125 |
-
(
|
| 126 |
-
'1.2.0',
|
| 127 |
-
'重大功能更新',
|
| 128 |
-
'2024-09-15 10:00:00+00',
|
| 129 |
-
true,
|
| 130 |
-
'https://github.com/your-repo/releases/download/v1.2.0/KSTools-v1.2.0.msi',
|
| 131 |
-
25600000,
|
| 132 |
-
'msi',
|
| 133 |
-
'KSTools-v1.2.0.msi',
|
| 134 |
-
'- 新增版本自動更新功能\n- 修復授權驗證問題\n- 優化UI介面',
|
| 135 |
-
'2020',
|
| 136 |
-
'KyrosDev'
|
| 137 |
-
),
|
| 138 |
-
(
|
| 139 |
-
'1.1.5',
|
| 140 |
-
'效能優化版本',
|
| 141 |
-
'2024-08-20 14:30:00+00',
|
| 142 |
-
true,
|
| 143 |
-
'https://github.com/your-repo/releases/download/v1.1.5/KSTools-v1.1.5.exe',
|
| 144 |
-
24800000,
|
| 145 |
-
'exe',
|
| 146 |
-
'KSTools-v1.1.5.exe',
|
| 147 |
-
'- 修復記憶體洩漏問題\n- 改善效能表現\n- 新增快捷鍵支援',
|
| 148 |
-
'2019',
|
| 149 |
-
'KyrosDev'
|
| 150 |
-
),
|
| 151 |
-
(
|
| 152 |
-
'1.1.0',
|
| 153 |
-
'功能增強版本',
|
| 154 |
-
'2024-07-10 09:00:00+00',
|
| 155 |
-
true,
|
| 156 |
-
'https://github.com/your-repo/releases/download/v1.1.0/KSTools-v1.1.0.zip',
|
| 157 |
-
23500000,
|
| 158 |
-
'zip',
|
| 159 |
-
'KSTools-v1.1.0.zip',
|
| 160 |
-
'- 重大功能更新\n- 新增批量處理功能\n- 改善使用者介面',
|
| 161 |
-
'2019',
|
| 162 |
-
'KyrosDev'
|
| 163 |
-
),
|
| 164 |
-
(
|
| 165 |
-
'1.0.5',
|
| 166 |
-
'緊急修復版本',
|
| 167 |
-
'2024-06-05 16:00:00+00',
|
| 168 |
-
false,
|
| 169 |
-
'https://github.com/your-repo/releases/download/v1.0.5/KSTools-v1.0.5.zip',
|
| 170 |
-
22000000,
|
| 171 |
-
'zip',
|
| 172 |
-
'KSTools-v1.0.5.zip',
|
| 173 |
-
'- 緊急錯誤修復\n- 修復崩潰問題',
|
| 174 |
-
'2019',
|
| 175 |
-
'KyrosDev'
|
| 176 |
-
),
|
| 177 |
-
(
|
| 178 |
-
'1.0.0',
|
| 179 |
-
'首次發布版本',
|
| 180 |
-
'2024-05-01 08:00:00+00',
|
| 181 |
-
false,
|
| 182 |
-
'https://github.com/your-repo/releases/download/v1.0.0/KSTools-v1.0.0.zip',
|
| 183 |
-
20000000,
|
| 184 |
-
'zip',
|
| 185 |
-
'KSTools-v1.0.0.zip',
|
| 186 |
-
'- 首次發布版本\n- 基本功能實現',
|
| 187 |
-
'2019',
|
| 188 |
-
'KyrosDev'
|
| 189 |
-
);
|
| 190 |
-
|
| 191 |
-
-- 插入測試下載記錄
|
| 192 |
-
INSERT INTO download_logs (version, license_key, action, user_agent, ip_address, downloaded_at) VALUES
|
| 193 |
-
-- 2024年9月的下載記錄
|
| 194 |
-
('1.2.0', 'TEST-LICENSE-001', 'download', 'Mozilla/5.0 Windows', '192.168.1.100', '2024-09-16 10:30:00+00'),
|
| 195 |
-
('1.2.0', 'TEST-LICENSE-002', 'download', 'Mozilla/5.0 Windows', '192.168.1.101', '2024-09-16 11:00:00+00'),
|
| 196 |
-
('1.2.0', 'TEST-LICENSE-003', 'update_check', 'Mozilla/5.0 Windows', '192.168.1.102', '2024-09-16 14:00:00+00'),
|
| 197 |
-
('1.2.0', 'TEST-LICENSE-004', 'download', 'Mozilla/5.0 Windows', '192.168.1.103', '2024-09-17 09:00:00+00'),
|
| 198 |
-
('1.2.0', 'TEST-LICENSE-005', 'download', 'Mozilla/5.0 Mac', '192.168.1.104', '2024-09-17 15:30:00+00'),
|
| 199 |
-
('1.2.0', 'TEST-LICENSE-006', 'download', 'Mozilla/5.0 Mac', '192.168.1.105', '2024-09-18 10:00:00+00'),
|
| 200 |
-
('1.1.5', 'TEST-LICENSE-007', 'download', 'Mozilla/5.0 Windows', '192.168.1.106', '2024-09-18 11:30:00+00'),
|
| 201 |
-
('1.2.0', 'TEST-LICENSE-008', 'download', 'Mozilla/5.0 Windows', '192.168.1.107', '2024-09-19 09:15:00+00'),
|
| 202 |
-
('1.2.0', 'TEST-LICENSE-009', 'install', 'Mozilla/5.0 Windows', '192.168.1.108', '2024-09-19 14:00:00+00'),
|
| 203 |
-
('1.2.0', 'TEST-LICENSE-010', 'download', 'Mozilla/5.0 Windows', '192.168.1.109', '2024-09-20 10:00:00+00'),
|
| 204 |
-
|
| 205 |
-
-- 2024年8月的下載記錄
|
| 206 |
-
('1.1.5', 'TEST-LICENSE-011', 'download', 'Mozilla/5.0 Windows', '192.168.1.110', '2024-08-21 10:00:00+00'),
|
| 207 |
-
('1.1.5', 'TEST-LICENSE-012', 'download', 'Mozilla/5.0 Windows', '192.168.1.111', '2024-08-22 11:00:00+00'),
|
| 208 |
-
('1.1.5', 'TEST-LICENSE-013', 'download', 'Mozilla/5.0 Mac', '192.168.1.112', '2024-08-23 14:00:00+00'),
|
| 209 |
-
('1.1.5', 'TEST-LICENSE-014', 'download', 'Mozilla/5.0 Windows', '192.168.1.113', '2024-08-24 09:00:00+00'),
|
| 210 |
-
('1.1.5', 'TEST-LICENSE-015', 'update_check', 'Mozilla/5.0 Windows', '192.168.1.114', '2024-08-25 15:00:00+00'),
|
| 211 |
-
('1.1.5', 'TEST-LICENSE-016', 'download', 'Mozilla/5.0 Windows', '192.168.1.115', '2024-08-26 10:00:00+00'),
|
| 212 |
-
('1.1.0', 'TEST-LICENSE-017', 'download', 'Mozilla/5.0 Windows', '192.168.1.116', '2024-08-27 11:00:00+00'),
|
| 213 |
-
('1.1.5', 'TEST-LICENSE-018', 'download', 'Mozilla/5.0 Mac', '192.168.1.117', '2024-08-28 14:00:00+00'),
|
| 214 |
-
|
| 215 |
-
-- 2024年7月的下載記錄
|
| 216 |
-
('1.1.0', 'TEST-LICENSE-019', 'download', 'Mozilla/5.0 Windows', '192.168.1.118', '2024-07-11 10:00:00+00'),
|
| 217 |
-
('1.1.0', 'TEST-LICENSE-020', 'download', 'Mozilla/5.0 Windows', '192.168.1.119', '2024-07-12 11:00:00+00'),
|
| 218 |
-
('1.1.0', 'TEST-LICENSE-021', 'download', 'Mozilla/5.0 Mac', '192.168.1.120', '2024-07-13 14:00:00+00'),
|
| 219 |
-
('1.1.0', 'TEST-LICENSE-022', 'download', 'Mozilla/5.0 Windows', '192.168.1.121', '2024-07-15 09:00:00+00'),
|
| 220 |
-
('1.1.0', 'TEST-LICENSE-023', 'install', 'Mozilla/5.0 Windows', '192.168.1.122', '2024-07-16 15:00:00+00'),
|
| 221 |
-
('1.1.0', 'TEST-LICENSE-024', 'download', 'Mozilla/5.0 Windows', '192.168.1.123', '2024-07-18 10:00:00+00'),
|
| 222 |
-
('1.1.0', 'TEST-LICENSE-025', 'download', 'Mozilla/5.0 Windows', '192.168.1.124', '2024-07-20 11:00:00+00'),
|
| 223 |
-
|
| 224 |
-
-- 2024年6月的下載記錄
|
| 225 |
-
('1.0.5', 'TEST-LICENSE-026', 'download', 'Mozilla/5.0 Windows', '192.168.1.125', '2024-06-06 10:00:00+00'),
|
| 226 |
-
('1.0.5', 'TEST-LICENSE-027', 'download', 'Mozilla/5.0 Windows', '192.168.1.126', '2024-06-07 11:00:00+00'),
|
| 227 |
-
('1.0.5', 'TEST-LICENSE-028', 'download', 'Mozilla/5.0 Mac', '192.168.1.127', '2024-06-08 14:00:00+00'),
|
| 228 |
-
('1.0.5', 'TEST-LICENSE-029', 'download', 'Mozilla/5.0 Windows', '192.168.1.128', '2024-06-10 09:00:00+00'),
|
| 229 |
-
('1.0.5', 'TEST-LICENSE-030', 'download', 'Mozilla/5.0 Windows', '192.168.1.129', '2024-06-12 15:00:00+00'),
|
| 230 |
-
|
| 231 |
-
-- 2024年5月的下載記錄
|
| 232 |
-
('1.0.0', 'TEST-LICENSE-031', 'download', 'Mozilla/5.0 Windows', '192.168.1.130', '2024-05-02 10:00:00+00'),
|
| 233 |
-
('1.0.0', 'TEST-LICENSE-032', 'download', 'Mozilla/5.0 Windows', '192.168.1.131', '2024-05-03 11:00:00+00'),
|
| 234 |
-
('1.0.0', 'TEST-LICENSE-033', 'download', 'Mozilla/5.0 Mac', '192.168.1.132', '2024-05-05 14:00:00+00'),
|
| 235 |
-
('1.0.0', 'TEST-LICENSE-034', 'download', 'Mozilla/5.0 Windows', '192.168.1.133', '2024-05-08 09:00:00+00'),
|
| 236 |
-
|
| 237 |
-
-- 2024年4月的下載記錄(較早期的數據)
|
| 238 |
-
('1.0.0', 'TEST-LICENSE-035', 'download', 'Mozilla/5.0 Windows', '192.168.1.134', '2024-04-10 10:00:00+00'),
|
| 239 |
-
('1.0.0', 'TEST-LICENSE-036', 'download', 'Mozilla/5.0 Windows', '192.168.1.135', '2024-04-15 11:00:00+00'),
|
| 240 |
-
('1.0.0', 'TEST-LICENSE-037', 'download', 'Mozilla/5.0 Mac', '192.168.1.136', '2024-04-20 14:00:00+00');
|
| 241 |
|
| 242 |
-- ================================
|
| 243 |
-- 觸發器:自動更新 updated_at
|
|
@@ -252,16 +162,21 @@ BEGIN
|
|
| 252 |
END;
|
| 253 |
$$ language 'plpgsql';
|
| 254 |
|
| 255 |
-
--
|
| 256 |
-
|
| 257 |
-
|
| 258 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 259 |
|
| 260 |
-- ================================
|
| 261 |
-- 有用的查詢視圖
|
| 262 |
-- ================================
|
| 263 |
|
| 264 |
-
-- 建立
|
|
|
|
| 265 |
CREATE VIEW latest_version AS
|
| 266 |
SELECT *
|
| 267 |
FROM versions
|
|
@@ -269,9 +184,9 @@ WHERE is_active = true
|
|
| 269 |
ORDER BY release_date DESC
|
| 270 |
LIMIT 1;
|
| 271 |
|
| 272 |
-
|
| 273 |
CREATE VIEW version_stats AS
|
| 274 |
-
SELECT
|
| 275 |
v.version,
|
| 276 |
v.release_date,
|
| 277 |
COUNT(dl.id) as download_count,
|
|
|
|
| 10 |
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
| 11 |
|
| 12 |
-- ================================
|
| 13 |
+
-- 移除現有外鍵約束(如果存在)
|
| 14 |
+
-- ================================
|
| 15 |
+
|
| 16 |
+
-- 安全移除外鍵約束,不影響現有資料
|
| 17 |
+
DO $$
|
| 18 |
+
BEGIN
|
| 19 |
+
IF EXISTS (
|
| 20 |
+
SELECT 1 FROM information_schema.table_constraints
|
| 21 |
+
WHERE constraint_name = 'fk_version'
|
| 22 |
+
AND table_name = 'download_logs'
|
| 23 |
+
) THEN
|
| 24 |
+
ALTER TABLE download_logs DROP CONSTRAINT fk_version;
|
| 25 |
+
END IF;
|
| 26 |
+
END $$;
|
| 27 |
+
|
| 28 |
+
-- ================================
|
| 29 |
+
-- 版本管理表(安全建立,如果不存在)
|
| 30 |
-- ================================
|
| 31 |
|
| 32 |
-- 版本表
|
| 33 |
+
CREATE TABLE IF NOT EXISTS versions (
|
| 34 |
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
| 35 |
version VARCHAR(20) NOT NULL UNIQUE,
|
| 36 |
title VARCHAR(255),
|
|
|
|
| 48 |
);
|
| 49 |
|
| 50 |
-- 下載記錄表
|
| 51 |
+
CREATE TABLE IF NOT EXISTS download_logs (
|
| 52 |
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
| 53 |
version VARCHAR(20),
|
| 54 |
license_key VARCHAR(255),
|
| 55 |
action VARCHAR(20) CHECK (action IN ('download', 'update_check', 'install')),
|
| 56 |
user_agent TEXT,
|
| 57 |
ip_address INET,
|
| 58 |
+
downloaded_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
|
|
|
|
|
|
|
|
|
| 59 |
);
|
| 60 |
|
| 61 |
-- ================================
|
|
|
|
| 63 |
-- ================================
|
| 64 |
|
| 65 |
-- 版本表索引
|
| 66 |
+
CREATE INDEX IF NOT EXISTS idx_versions_version ON versions(version);
|
| 67 |
+
CREATE INDEX IF NOT EXISTS idx_versions_release_date ON versions(release_date DESC);
|
| 68 |
+
CREATE INDEX IF NOT EXISTS idx_versions_is_active ON versions(is_active);
|
| 69 |
|
| 70 |
-- 下載記錄表索引
|
| 71 |
+
CREATE INDEX IF NOT EXISTS idx_download_logs_version ON download_logs(version);
|
| 72 |
+
CREATE INDEX IF NOT EXISTS idx_download_logs_downloaded_at ON download_logs(downloaded_at DESC);
|
| 73 |
+
CREATE INDEX IF NOT EXISTS idx_download_logs_action ON download_logs(action);
|
| 74 |
|
| 75 |
-- ================================
|
| 76 |
-- Row Level Security (RLS) 政策
|
| 77 |
-- ================================
|
| 78 |
|
| 79 |
+
-- 啟用 RLS(如果尚未啟用)
|
| 80 |
+
DO $$
|
| 81 |
+
BEGIN
|
| 82 |
+
ALTER TABLE versions ENABLE ROW LEVEL SECURITY;
|
| 83 |
+
EXCEPTION
|
| 84 |
+
WHEN OTHERS THEN NULL;
|
| 85 |
+
END $$;
|
| 86 |
+
|
| 87 |
+
DO $$
|
| 88 |
+
BEGIN
|
| 89 |
+
ALTER TABLE download_logs ENABLE ROW LEVEL SECURITY;
|
| 90 |
+
EXCEPTION
|
| 91 |
+
WHEN OTHERS THEN NULL;
|
| 92 |
+
END $$;
|
| 93 |
|
| 94 |
+
-- 安全建立 RLS 政策(先刪除再建立)
|
| 95 |
+
DO $$
|
| 96 |
+
BEGIN
|
| 97 |
+
-- 版本表政策
|
| 98 |
+
DROP POLICY IF EXISTS "Public read versions" ON versions;
|
| 99 |
+
CREATE POLICY "Public read versions" ON versions
|
| 100 |
+
FOR SELECT USING (true);
|
| 101 |
|
| 102 |
+
DROP POLICY IF EXISTS "Service role insert versions" ON versions;
|
| 103 |
+
CREATE POLICY "Service role insert versions" ON versions
|
| 104 |
+
FOR INSERT WITH CHECK (auth.role() = 'service_role');
|
| 105 |
|
| 106 |
+
DROP POLICY IF EXISTS "Service role update versions" ON versions;
|
| 107 |
+
CREATE POLICY "Service role update versions" ON versions
|
| 108 |
+
FOR UPDATE USING (auth.role() = 'service_role');
|
| 109 |
|
| 110 |
+
-- 下載記錄表政策
|
| 111 |
+
DROP POLICY IF EXISTS "Service role all download_logs" ON download_logs;
|
| 112 |
+
CREATE POLICY "Service role all download_logs" ON download_logs
|
| 113 |
+
FOR ALL USING (auth.role() = 'service_role');
|
| 114 |
+
END $$;
|
| 115 |
|
| 116 |
-- ================================
|
| 117 |
-- Storage Bucket 設定
|
| 118 |
-- ================================
|
| 119 |
|
| 120 |
+
-- 安全建立 Storage Bucket(如果不存在)
|
| 121 |
+
DO $$
|
| 122 |
+
BEGIN
|
| 123 |
+
INSERT INTO storage.buckets (id, name, public)
|
| 124 |
+
VALUES ('plugin-releases', 'plugin-releases', true);
|
| 125 |
+
EXCEPTION
|
| 126 |
+
WHEN unique_violation THEN NULL; -- Bucket 已存在
|
| 127 |
+
END $$;
|
| 128 |
+
|
| 129 |
+
-- Storage RLS 政策設定(安全建立)
|
| 130 |
+
DO $$
|
| 131 |
+
BEGIN
|
| 132 |
+
-- 1. 允許公開讀取發布檔案
|
| 133 |
+
DROP POLICY IF EXISTS "Public read plugin releases" ON storage.objects;
|
| 134 |
+
CREATE POLICY "Public read plugin releases" ON storage.objects
|
| 135 |
+
FOR SELECT USING (bucket_id = 'plugin-releases');
|
| 136 |
|
| 137 |
+
-- 2. 允許 Service Role 管理檔案(上傳、更新、刪除)
|
| 138 |
+
DROP POLICY IF EXISTS "Service role manage plugin releases" ON storage.objects;
|
| 139 |
+
CREATE POLICY "Service role manage plugin releases" ON storage.objects
|
| 140 |
+
FOR ALL USING (auth.role() = 'service_role' AND bucket_id = 'plugin-releases');
|
| 141 |
|
| 142 |
+
-- 3. 允許認證用戶上傳檔案(可選,如果需要讓登入用戶上傳)
|
| 143 |
+
DROP POLICY IF EXISTS "Authenticated users upload plugin releases" ON storage.objects;
|
| 144 |
+
CREATE POLICY "Authenticated users upload plugin releases" ON storage.objects
|
| 145 |
+
FOR INSERT WITH CHECK (
|
| 146 |
+
bucket_id = 'plugin-releases' AND
|
| 147 |
+
auth.role() = 'authenticated'
|
| 148 |
+
);
|
| 149 |
+
END $$;
|
| 150 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 151 |
|
| 152 |
-- ================================
|
| 153 |
-- 觸發器:自動更新 updated_at
|
|
|
|
| 162 |
END;
|
| 163 |
$$ language 'plpgsql';
|
| 164 |
|
| 165 |
+
-- 安全建立觸發器(先刪除再建立)
|
| 166 |
+
DO $$
|
| 167 |
+
BEGIN
|
| 168 |
+
DROP TRIGGER IF EXISTS update_versions_updated_at ON versions;
|
| 169 |
+
CREATE TRIGGER update_versions_updated_at
|
| 170 |
+
BEFORE UPDATE ON versions
|
| 171 |
+
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
| 172 |
+
END $$;
|
| 173 |
|
| 174 |
-- ================================
|
| 175 |
-- 有用的查詢視圖
|
| 176 |
-- ================================
|
| 177 |
|
| 178 |
+
-- 安全建立視圖(先刪除再建立)
|
| 179 |
+
DROP VIEW IF EXISTS latest_version;
|
| 180 |
CREATE VIEW latest_version AS
|
| 181 |
SELECT *
|
| 182 |
FROM versions
|
|
|
|
| 184 |
ORDER BY release_date DESC
|
| 185 |
LIMIT 1;
|
| 186 |
|
| 187 |
+
DROP VIEW IF EXISTS version_stats;
|
| 188 |
CREATE VIEW version_stats AS
|
| 189 |
+
SELECT
|
| 190 |
v.version,
|
| 191 |
v.release_date,
|
| 192 |
COUNT(dl.id) as download_count,
|