Files
bolt.diy/supabase/migrations/20240326000000_create_problems.sql
Jason Laster 58f2cb0f58 add supabase
2025-03-13 07:09:36 -07:00

170 lines
4.5 KiB
PL/PgSQL

-- Create problems table
CREATE TABLE IF NOT EXISTS problems (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
title TEXT NOT NULL,
description TEXT NOT NULL,
status TEXT NOT NULL CHECK (status IN ('pending', 'solved', 'unsolved')),
keywords TEXT[] NOT NULL DEFAULT '{}',
repository_contents JSONB NOT NULL DEFAULT '{}',
user_id UUID REFERENCES auth.users(id)
);
-- Create problem_comments table
CREATE TABLE IF NOT EXISTS problem_comments (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
problem_id UUID NOT NULL REFERENCES problems(id) ON DELETE CASCADE,
content TEXT NOT NULL,
username TEXT NOT NULL
);
-- Create updated_at trigger for problems table
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = now();
RETURN NEW;
END;
$$ language 'plpgsql';
CREATE TRIGGER update_problems_updated_at
BEFORE UPDATE ON problems
FOR EACH ROW
EXECUTE FUNCTION update_updated_at_column();
-- Create RLS policies
ALTER TABLE problems ENABLE ROW LEVEL SECURITY;
ALTER TABLE problem_comments ENABLE ROW LEVEL SECURITY;
-- Allow public read access to problems and comments
CREATE POLICY "Allow public read access to problems"
ON problems FOR SELECT
TO public
USING (true);
CREATE POLICY "Allow public read access to problem comments"
ON problem_comments FOR SELECT
TO public
USING (true);
-- Allow anyone to create problems (including anonymous users)
DROP POLICY IF EXISTS "Allow authenticated users to create problems" ON problems;
DROP POLICY IF EXISTS "Allow anyone to create problems" ON problems;
CREATE POLICY "Allow anyone to create problems"
ON problems FOR INSERT
TO public
WITH CHECK (true);
-- Allow anyone to update problems
DROP POLICY IF EXISTS "Allow authenticated users to update problems" ON problems;
DROP POLICY IF EXISTS "Allow anyone to update problems" ON problems;
CREATE POLICY "Allow anyone to update problems"
ON problems FOR UPDATE
TO public
USING (true)
WITH CHECK (true);
-- Allow anyone to create comments
DROP POLICY IF EXISTS "Allow authenticated users to create comments" ON problem_comments;
DROP POLICY IF EXISTS "Allow anyone to create comments" ON problem_comments;
CREATE POLICY "Allow anyone to create comments"
ON problem_comments FOR INSERT
TO public
WITH CHECK (true);
-- Create function to get problem with comments
CREATE OR REPLACE FUNCTION get_problem_with_comments(problem_id UUID)
RETURNS TABLE (
id UUID,
created_at TIMESTAMPTZ,
updated_at TIMESTAMPTZ,
title TEXT,
description TEXT,
status TEXT,
keywords TEXT[],
repository_contents JSONB,
user_id UUID,
problem_comments JSON
) AS $$
BEGIN
RETURN QUERY
SELECT
p.id,
p.created_at,
p.updated_at,
p.title,
p.description,
p.status,
p.keywords,
p.repository_contents,
p.user_id,
COALESCE(
json_agg(
json_build_object(
'id', c.id,
'created_at', c.created_at,
'problem_id', c.problem_id,
'content', c.content,
'username', c.username
)
) FILTER (WHERE c.id IS NOT NULL),
'[]'::json
) as problem_comments
FROM problems p
LEFT JOIN problem_comments c ON c.problem_id = p.id
WHERE p.id = problem_id
GROUP BY p.id;
END;
$$ LANGUAGE plpgsql;
-- Create profiles for existing users who don't have one
DO $$
DECLARE
user_record RECORD;
BEGIN
-- Loop through all users in auth.users who don't have a profile
FOR user_record IN
SELECT au.id, au.email
FROM auth.users au
LEFT JOIN public.profiles p ON p.id = au.id
WHERE p.id IS NULL
LOOP
-- Insert a new profile for each user
INSERT INTO public.profiles (
id,
username,
full_name,
avatar_url,
is_admin
) VALUES (
user_record.id,
user_record.email,
NULL,
NULL,
FALSE
);
RAISE NOTICE 'Created profile for user %', user_record.email;
END LOOP;
END;
$$ LANGUAGE plpgsql;
-- Output the number of profiles created
SELECT 'Profiles created for existing users: ' || COUNT(*)::text as result
FROM (
SELECT au.id
FROM auth.users au
LEFT JOIN public.profiles p ON p.id = au.id
WHERE p.id IS NULL
) as missing_profiles;
-- List all profiles
SELECT
p.id,
p.username,
p.is_admin,
p.created_at
FROM public.profiles p
ORDER BY p.created_at DESC;