KyrosDev commited on
Commit
218d422
·
1 Parent(s): a01709b

移除版本刪除外鍵約束限制

Browse files
Files changed (1) hide show
  1. 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
- ALTER TABLE versions ENABLE ROW LEVEL SECURITY;
68
- ALTER TABLE download_logs ENABLE ROW LEVEL SECURITY;
 
 
 
 
 
 
 
 
 
 
 
69
 
70
- -- 版本表 - 公開讀取,只有透過 service key 能寫入
71
- CREATE POLICY "Public read versions" ON versions
72
- FOR SELECT USING (true);
 
 
 
 
73
 
74
- CREATE POLICY "Service role insert versions" ON versions
75
- FOR INSERT WITH CHECK (auth.role() = 'service_role');
 
76
 
77
- CREATE POLICY "Service role update versions" ON versions
78
- FOR UPDATE USING (auth.role() = 'service_role');
 
79
 
80
- -- 下載記錄表 - 只有透過 service key 能操作
81
- CREATE POLICY "Service role all download_logs" ON download_logs
82
- FOR ALL USING (auth.role() = 'service_role');
 
 
83
 
84
  -- ================================
85
  -- Storage Bucket 設定
86
  -- ================================
87
 
88
- -- 建立 Storage Bucket 用於放插件發布檔案
89
- INSERT INTO storage.buckets (id, name, public) VALUES ('plugin-releases', 'plugin-releases', true);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90
 
91
- -- Storage RLS 政策設定
92
- -- 1. 允許公開讀取發布檔案
93
- CREATE POLICY "Public read plugin releases" ON storage.objects
94
- FOR SELECT USING (bucket_id = 'plugin-releases');
95
 
96
- -- 2. 允許 Service Role 管理檔案(上傳、更新、刪除
97
- CREATE POLICY "Service role manage plugin releases" ON storage.objects
98
- FOR ALL USING (auth.role() = 'service_role' AND bucket_id = 'plugin-releases');
 
 
 
 
 
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
- CREATE TRIGGER update_versions_updated_at
257
- BEFORE UPDATE ON versions
258
- FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
 
 
 
 
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,