|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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() |
|
|
); |
|
|
|
|
|
|
|
|
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() |
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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); |
|
|
|
|
|
|
|
|
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); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 $$; |
|
|
|
|
|
|
|
|
DO $$ |
|
|
BEGIN |
|
|
|
|
|
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'); |
|
|
|
|
|
|
|
|
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 $$; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 $$; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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; |
|
|
|
|
|
|
|
|
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; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DO $$ |
|
|
BEGIN |
|
|
INSERT INTO storage.buckets (id, name, public) |
|
|
VALUES ('plugin-releases-autocad', 'plugin-releases-autocad', true); |
|
|
EXCEPTION |
|
|
WHEN unique_violation THEN NULL; |
|
|
END $$; |
|
|
|
|
|
|
|
|
DO $$ |
|
|
BEGIN |
|
|
|
|
|
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'); |
|
|
|
|
|
|
|
|
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'); |
|
|
|
|
|
|
|
|
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 $$; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 $$; |
|
|
|