mirror of
https://github.com/stackblitz-labs/bolt.diy
synced 2025-06-26 18:26:38 +00:00
170 lines
4.5 KiB
PL/PgSQL
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; |