Skip to content

Commit d0e1274

Browse files
committed
Add Supabase SQL schema for Registry
1 parent de165a4 commit d0e1274

1 file changed

Lines changed: 99 additions & 0 deletions

File tree

supabase_schema.sql

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
-- ProXPL Registry Database Schema
2+
3+
-- 1. Profiles table (linked to auth.users)
4+
CREATE TABLE IF NOT EXISTS public.profiles (
5+
id UUID REFERENCES auth.users ON DELETE CASCADE PRIMARY KEY,
6+
username TEXT UNIQUE NOT NULL,
7+
display_name TEXT,
8+
avatar_url TEXT,
9+
bio TEXT,
10+
created_at TIMESTAMP WITH TIME ZONE DEFAULT timezone('utc'::text, now()) NOT NULL,
11+
updated_at TIMESTAMP WITH TIME ZONE DEFAULT timezone('utc'::text, now()) NOT NULL
12+
);
13+
14+
-- Enable RLS
15+
ALTER TABLE public.profiles ENABLE ROW LEVEL SECURITY;
16+
17+
-- 2. Packages table
18+
CREATE TABLE IF NOT EXISTS public.packages (
19+
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
20+
name TEXT UNIQUE NOT NULL,
21+
description TEXT,
22+
author_id UUID REFERENCES public.profiles(id) ON DELETE SET NULL,
23+
repository_url TEXT,
24+
homepage_url TEXT,
25+
license TEXT DEFAULT 'MIT',
26+
category TEXT,
27+
total_downloads INTEGER DEFAULT 0,
28+
stars INTEGER DEFAULT 0,
29+
is_verified BOOLEAN DEFAULT false,
30+
created_at TIMESTAMP WITH TIME ZONE DEFAULT timezone('utc'::text, now()) NOT NULL,
31+
updated_at TIMESTAMP WITH TIME ZONE DEFAULT timezone('utc'::text, now()) NOT NULL
32+
);
33+
34+
-- Enable RLS
35+
ALTER TABLE public.packages ENABLE ROW LEVEL SECURITY;
36+
37+
-- 3. Package Versions table
38+
CREATE TABLE IF NOT EXISTS public.package_versions (
39+
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
40+
package_id UUID REFERENCES public.packages(id) ON DELETE CASCADE,
41+
version TEXT NOT NULL,
42+
entry_point TEXT,
43+
checksum TEXT,
44+
download_url TEXT NOT NULL,
45+
created_at TIMESTAMP WITH TIME ZONE DEFAULT timezone('utc'::text, now()) NOT NULL,
46+
UNIQUE(package_id, version)
47+
);
48+
49+
-- Enable RLS
50+
ALTER TABLE public.package_versions ENABLE ROW LEVEL SECURITY;
51+
52+
-- Policies
53+
54+
-- Profiles: Anyone can read, only owner can update
55+
CREATE POLICY "Public profiles are viewable by everyone." ON public.profiles
56+
FOR SELECT USING (true);
57+
58+
CREATE POLICY "Users can insert their own profile." ON public.profiles
59+
FOR INSERT WITH CHECK (auth.uid() = id);
60+
61+
CREATE POLICY "Users can update own profile." ON public.profiles
62+
FOR UPDATE USING (auth.uid() = id);
63+
64+
-- Packages: Anyone can read, only authenticated can create, owner can update
65+
CREATE POLICY "Packages are viewable by everyone." ON public.packages
66+
FOR SELECT USING (true);
67+
68+
CREATE POLICY "Authenticated users can create packages." ON public.packages
69+
FOR INSERT WITH CHECK (auth.role() = 'authenticated');
70+
71+
CREATE POLICY "Owners can update their own packages." ON public.packages
72+
FOR UPDATE USING (auth.uid() = author_id);
73+
74+
-- Versions: Anyone can read, only package owner can insert
75+
CREATE POLICY "Versions are viewable by everyone." ON public.package_versions
76+
FOR SELECT USING (true);
77+
78+
CREATE POLICY "Package owners can insert versions." ON public.package_versions
79+
FOR INSERT WITH CHECK (
80+
EXISTS (
81+
SELECT 1 FROM public.packages
82+
WHERE id = package_id AND author_id = auth.uid()
83+
)
84+
);
85+
86+
-- Functions
87+
CREATE OR REPLACE FUNCTION public.handle_new_user()
88+
RETURNS trigger AS $$
89+
BEGIN
90+
INSERT INTO public.profiles (id, username, display_name, avatar_url)
91+
VALUES (new.id, new.raw_user_meta_data->>'username', new.raw_user_meta_data->>'username', new.raw_user_meta_data->>'avatar_url');
92+
RETURN new;
93+
END;
94+
$$ LANGUAGE plpgsql SECURITY DEFINER;
95+
96+
-- Trigger for new user
97+
CREATE OR REPLACE TRIGGER on_auth_user_created
98+
AFTER INSERT ON auth.users
99+
FOR EACH ROW EXECUTE PROCEDURE public.handle_new_user();

0 commit comments

Comments
 (0)