新增資料庫架構

This commit is contained in:
2025-07-19 02:12:37 +08:00
parent e3832acfa8
commit 924f03c3d7
45 changed files with 12858 additions and 324 deletions

View File

@@ -0,0 +1,137 @@
// 心願星河 - Supabase 連接測試腳本
// 使用方法: npm run test-supabase
const { createClient } = require("@supabase/supabase-js")
require("dotenv").config({ path: ".env.local" })
async function testSupabaseConnection() {
console.log("🔍 測試 Supabase 連接...\n")
// 檢查環境變數
const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL
const supabaseKey = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY
if (!supabaseUrl || !supabaseKey) {
console.error("❌ 環境變數未設置")
console.log("請確認 .env.local 檔案中包含:")
console.log("- NEXT_PUBLIC_SUPABASE_URL")
console.log("- NEXT_PUBLIC_SUPABASE_ANON_KEY")
process.exit(1)
}
console.log("✅ 環境變數已設置")
console.log(`📍 Supabase URL: ${supabaseUrl}`)
console.log(`🔑 API Key: ${supabaseKey.substring(0, 20)}...`)
// 創建 Supabase 客戶端
const supabase = createClient(supabaseUrl, supabaseKey)
try {
// 測試基本連接
console.log("\n🔗 測試基本連接...")
const { data, error } = await supabase.from("wishes").select("count").limit(1)
if (error) {
console.error("❌ 連接失敗:", error.message)
return false
}
console.log("✅ 基本連接成功")
// 測試表格存在性
console.log("\n📊 檢查表格結構...")
const tables = ["wishes", "wish_likes", "user_settings", "migration_log", "system_stats"]
for (const table of tables) {
try {
const { data, error } = await supabase.from(table).select("*").limit(1)
if (error) {
console.log(`❌ 表格 ${table}: ${error.message}`)
} else {
console.log(`✅ 表格 ${table}: 正常`)
}
} catch (err) {
console.log(`❌ 表格 ${table}: ${err.message}`)
}
}
// 測試視圖
console.log("\n👁 檢查視圖...")
const views = ["wishes_with_likes", "public_wishes", "popular_wishes"]
for (const view of views) {
try {
const { data, error } = await supabase.from(view).select("*").limit(1)
if (error) {
console.log(`❌ 視圖 ${view}: ${error.message}`)
} else {
console.log(`✅ 視圖 ${view}: 正常`)
}
} catch (err) {
console.log(`❌ 視圖 ${view}: ${err.message}`)
}
}
// 測試函數
console.log("\n⚙ 測試函數...")
try {
const { data, error } = await supabase.rpc("get_wishes_stats")
if (error) {
console.log(`❌ 函數 get_wishes_stats: ${error.message}`)
} else {
console.log("✅ 函數 get_wishes_stats: 正常")
console.log("📈 統計數據:", JSON.stringify(data, null, 2))
}
} catch (err) {
console.log(`❌ 函數測試失敗: ${err.message}`)
}
// 測試存儲
console.log("\n🗂 檢查存儲桶...")
try {
const { data: buckets, error } = await supabase.storage.listBuckets()
if (error) {
console.log(`❌ 存儲桶檢查失敗: ${error.message}`)
} else {
const wishBuckets = buckets.filter((bucket) => bucket.id === "wish-images" || bucket.id === "wish-thumbnails")
if (wishBuckets.length === 2) {
console.log("✅ 存儲桶設置完成")
wishBuckets.forEach((bucket) => {
console.log(` - ${bucket.id}: ${bucket.public ? "公開" : "私密"}`)
})
} else {
console.log(`⚠️ 存儲桶不完整,找到 ${wishBuckets.length}/2 個`)
}
}
} catch (err) {
console.log(`❌ 存儲桶檢查失敗: ${err.message}`)
}
console.log("\n🎉 Supabase 連接測試完成!")
return true
} catch (error) {
console.error("❌ 測試過程中發生錯誤:", error)
return false
}
}
// 執行測試
testSupabaseConnection()
.then((success) => {
if (success) {
console.log("\n✅ 所有測試通過,可以開始使用 Supabase")
process.exit(0)
} else {
console.log("\n❌ 測試失敗,請檢查配置")
process.exit(1)
}
})
.catch((error) => {
console.error("測試腳本執行失敗:", error)
process.exit(1)
})