-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathusers_table.sql
More file actions
97 lines (83 loc) · 3.25 KB
/
Copy pathusers_table.sql
File metadata and controls
97 lines (83 loc) · 3.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
-- Drop existing function if it exists
DROP FUNCTION IF EXISTS get_user_by_username(text);
-- Drop and recreate the users table with proper structure
DROP TABLE IF EXISTS public.users CASCADE;
-- Create extension if not exists
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE TABLE public.users (
user_id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
username VARCHAR(255) UNIQUE NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
full_name VARCHAR(255) NOT NULL,
role VARCHAR(50) CHECK (role IN ('donor', 'charity')),
created_at TIMESTAMPTZ DEFAULT NOW(),
last_login TIMESTAMPTZ,
CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES auth.users(id) ON DELETE CASCADE
);
-- Create login_logs table
CREATE TABLE IF NOT EXISTS public.login_logs (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID REFERENCES public.users(user_id),
timestamp TIMESTAMPTZ DEFAULT NOW(),
success BOOLEAN NOT NULL,
ip_address TEXT,
user_agent TEXT
);
-- Enable RLS
ALTER TABLE public.users ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.login_logs ENABLE ROW LEVEL SECURITY;
-- Drop existing policies
DROP POLICY IF EXISTS "users_select_policy" ON public.users;
DROP POLICY IF EXISTS "users_insert_policy" ON public.users;
DROP POLICY IF EXISTS "users_update_policy" ON public.users;
DROP POLICY IF EXISTS "login_logs_select_policy" ON public.login_logs;
DROP POLICY IF EXISTS "login_logs_insert_policy" ON public.login_logs;
-- Create policies for users table
CREATE POLICY "users_select_policy" ON public.users
FOR SELECT TO authenticated
USING (true);
CREATE POLICY "users_insert_policy" ON public.users
FOR INSERT TO authenticated
WITH CHECK (auth.uid() = user_id);
CREATE POLICY "users_update_policy" ON public.users
FOR UPDATE TO authenticated
USING (auth.uid() = user_id);
-- Create policies for login_logs table
CREATE POLICY "login_logs_select_policy" ON public.login_logs
FOR SELECT TO authenticated
USING (user_id = auth.uid());
CREATE POLICY "login_logs_insert_policy" ON public.login_logs
FOR INSERT TO authenticated
WITH CHECK (user_id = auth.uid());
-- Create indexes
CREATE INDEX IF NOT EXISTS idx_users_username ON public.users(username);
CREATE INDEX IF NOT EXISTS idx_users_email ON public.users(email);
CREATE INDEX IF NOT EXISTS idx_users_role ON public.users(role);
CREATE INDEX IF NOT EXISTS idx_login_logs_user_id ON public.login_logs(user_id);
CREATE INDEX IF NOT EXISTS idx_login_logs_timestamp ON public.login_logs(timestamp);
-- Create helper function
CREATE OR REPLACE FUNCTION get_user_by_username(username_param TEXT)
RETURNS TABLE (
user_id UUID,
username TEXT,
email TEXT,
full_name TEXT,
role TEXT,
created_at TIMESTAMPTZ,
last_login TIMESTAMPTZ
)
LANGUAGE plpgsql
SECURITY DEFINER
AS $$
BEGIN
RETURN QUERY
SELECT u.user_id, u.username, u.email, u.full_name, u.role, u.created_at, u.last_login
FROM public.users u
WHERE u.username = username_param;
END;
$$;
-- Grant necessary permissions
GRANT USAGE ON SCHEMA public TO anon, authenticated;
GRANT ALL ON ALL TABLES IN SCHEMA public TO anon, authenticated;
GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO anon, authenticated;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO anon, authenticated;