23b117a3fa
- 配置 Next.js 14 + TypeScript + TailwindCSS - 集成 Supabase (Auth + Storage + Database) - 实现认证 API (login/logout/me) - 实现文件存储 API (upload/list/get/delete) - 实现数据库操作 API (tables/query) - 添加 Supabase 初始化 SQL 脚本 - 添加环境变量配置示例 - 添加项目文档
95 lines
2.5 KiB
PL/PgSQL
95 lines
2.5 KiB
PL/PgSQL
-- Enable UUID extension
|
|
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
|
|
|
-- Create files table
|
|
CREATE TABLE IF NOT EXISTS files (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
name TEXT NOT NULL,
|
|
path TEXT NOT NULL,
|
|
size BIGINT NOT NULL,
|
|
mime_type TEXT NOT NULL,
|
|
user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
|
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
-- Create index on user_id for faster queries
|
|
CREATE INDEX IF NOT EXISTS idx_files_user_id ON files(user_id);
|
|
|
|
-- Create index on created_at for sorting
|
|
CREATE INDEX IF NOT EXISTS idx_files_created_at ON files(created_at DESC);
|
|
|
|
-- Enable Row Level Security
|
|
ALTER TABLE files ENABLE ROW LEVEL SECURITY;
|
|
|
|
-- Create policy to allow users to see only their own files
|
|
CREATE POLICY "Users can view their own files"
|
|
ON files
|
|
FOR SELECT
|
|
USING (auth.uid() = user_id);
|
|
|
|
-- Create policy to allow users to insert their own files
|
|
CREATE POLICY "Users can insert their own files"
|
|
ON files
|
|
FOR INSERT
|
|
WITH CHECK (auth.uid() = user_id);
|
|
|
|
-- Create policy to allow users to update their own files
|
|
CREATE POLICY "Users can update their own files"
|
|
ON files
|
|
FOR UPDATE
|
|
USING (auth.uid() = user_id);
|
|
|
|
-- Create policy to allow users to delete their own files
|
|
CREATE POLICY "Users can delete their own files"
|
|
ON files
|
|
FOR DELETE
|
|
USING (auth.uid() = user_id);
|
|
|
|
-- Create storage bucket for files
|
|
INSERT INTO storage.buckets (id, name, public)
|
|
VALUES ('files', 'files', true)
|
|
ON CONFLICT (id) DO NOTHING;
|
|
|
|
-- Create policy to allow authenticated users to upload files
|
|
CREATE POLICY "Users can upload files"
|
|
ON storage.objects
|
|
FOR INSERT
|
|
WITH CHECK (
|
|
bucket_id = 'files' AND
|
|
auth.uid()::text = (storage.foldername(name))[1]
|
|
);
|
|
|
|
-- Create policy to allow users to view their own files
|
|
CREATE POLICY "Users can view their own files"
|
|
ON storage.objects
|
|
FOR SELECT
|
|
USING (
|
|
bucket_id = 'files' AND
|
|
auth.uid()::text = (storage.foldername(name))[1]
|
|
);
|
|
|
|
-- Create policy to allow users to delete their own files
|
|
CREATE POLICY "Users can delete their own files"
|
|
ON storage.objects
|
|
FOR DELETE
|
|
USING (
|
|
bucket_id = 'files' AND
|
|
auth.uid()::text = (storage.foldername(name))[1]
|
|
);
|
|
|
|
-- Create updated_at trigger function
|
|
CREATE OR REPLACE FUNCTION update_updated_at_column()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
NEW.updated_at = NOW();
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
-- Create trigger to auto-update updated_at
|
|
CREATE TRIGGER update_files_updated_at
|
|
BEFORE UPDATE ON files
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION update_updated_at_column();
|