Spaces:
Sleeping
Sleeping
File size: 7,132 Bytes
4f3c35d |
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 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 |
-- Enable UUID extension (if not already enabled)
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
-- Services table
CREATE TABLE services (
service_id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
host_address TEXT NOT NULL,
port INT NOT NULL,
email_id TEXT NOT NULL,
password TEXT NOT NULL,
cors_origin TEXT DEFAULT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- Templates table
CREATE TABLE templates (
template_id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
name TEXT NOT NULL,
content TEXT NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- Create indexes for faster querying
CREATE INDEX idx_services_user_id ON services(user_id);
CREATE INDEX idx_templates_user_id ON templates(user_id);
-- Enable Row Level Security (RLS) on both tables
ALTER TABLE services ENABLE ROW LEVEL SECURITY;
ALTER TABLE templates ENABLE ROW LEVEL SECURITY;
-- Create policies for services table
CREATE POLICY "Users can view their own services"
ON services FOR SELECT
USING (auth.uid() = user_id);
CREATE POLICY "Users can insert their own services"
ON services FOR INSERT
WITH CHECK (auth.uid() = user_id);
CREATE POLICY "Users can update their own services"
ON services FOR UPDATE
USING (auth.uid() = user_id);
CREATE POLICY "Users can delete their own services"
ON services FOR DELETE
USING (auth.uid() = user_id);
-- Create policies for templates table
CREATE POLICY "Users can view their own templates"
ON templates FOR SELECT
USING (auth.uid() = user_id);
CREATE POLICY "Users can insert their own templates"
ON templates FOR INSERT
WITH CHECK (auth.uid() = user_id);
CREATE POLICY "Users can update their own templates"
ON templates FOR UPDATE
USING (auth.uid() = user_id);
CREATE POLICY "Users can delete their own templates"
ON templates FOR DELETE
USING (auth.uid() = user_id);
-- Create a function to automatically update the updated_at column
CREATE OR REPLACE FUNCTION update_modified_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = now();
RETURN NEW;
END;
$$ language 'plpgsql';
-- Create triggers to call the update_modified_column function
CREATE TRIGGER update_services_modtime
BEFORE UPDATE ON services
FOR EACH ROW
EXECUTE FUNCTION update_modified_column();
CREATE TRIGGER update_templates_modtime
BEFORE UPDATE ON templates
FOR EACH ROW
EXECUTE FUNCTION update_modified_column();
-- Add new fields to the templates table
ALTER TABLE templates
ADD COLUMN to_email TEXT DEFAULT NULL,
ADD COLUMN from_name TEXT NOT NULL,
ADD COLUMN reply_to TEXT DEFAULT NULL,
ADD COLUMN subject TEXT NOT NULL,
ADD COLUMN bcc TEXT DEFAULT NULL,
ADD COLUMN cc TEXT DEFAULT NULL;
-- Enable UUID extension
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
-- Logs table
CREATE TABLE logs (
log_id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
service_id UUID NOT NULL REFERENCES services(service_id) ON DELETE CASCADE,
template_id UUID NOT NULL REFERENCES templates(template_id) ON DELETE CASCADE,
status TEXT NOT NULL,
message TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- Emails table
CREATE TABLE emails (
email_id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
service_id UUID NOT NULL REFERENCES services(service_id) ON DELETE CASCADE,
template_id UUID NOT NULL REFERENCES templates(template_id) ON DELETE CASCADE,
email_address TEXT NOT NULL,
name TEXT DEFAULT NULL,
phone_number TEXT DEFAULT NULL,
sent_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- Create indexes
CREATE INDEX idx_logs_user_id ON logs(user_id);
CREATE INDEX idx_logs_service_id ON logs(service_id);
CREATE INDEX idx_logs_template_id ON logs(template_id);
CREATE INDEX idx_emails_user_id ON emails(user_id);
CREATE INDEX idx_emails_service_id ON emails(service_id);
CREATE INDEX idx_emails_template_id ON emails(template_id);
-- Enable RLS
ALTER TABLE logs ENABLE ROW LEVEL SECURITY;
ALTER TABLE emails ENABLE ROW LEVEL SECURITY;
-- RLS Policies for logs
CREATE POLICY "Users can view their own logs"
ON logs FOR SELECT
USING (auth.uid() = user_id);
CREATE POLICY "Users can insert their own logs"
ON logs FOR INSERT
WITH CHECK (auth.uid() = user_id);
-- RLS Policies for emails
CREATE POLICY "Users can view their own sent emails"
ON emails FOR SELECT
USING (auth.uid() = user_id);
CREATE POLICY "Users can insert their own sent emails"
ON emails FOR INSERT
WITH CHECK (auth.uid() = user_id);
-- Create the profile table
CREATE TABLE profile (
profile_id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), -- Unique ID for the profile
user_id UUID UNIQUE NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE, -- One-to-one relationship with users table
user_key TEXT UNIQUE NOT NULL, -- Unique key for the user
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, -- Timestamp for when the profile is created
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP -- Timestamp for when the profile is updated
);
-- Enable Row Level Security (RLS) for the profile table
ALTER TABLE profile ENABLE ROW LEVEL SECURITY;
-- Create policies for the profile table
CREATE POLICY "Users can view their own profile"
ON profile FOR SELECT
USING (auth.uid() = user_id);
CREATE POLICY "Users can insert their own profile"
ON profile FOR INSERT
WITH CHECK (auth.uid() = user_id);
CREATE POLICY "Users can update their own profile"
ON profile FOR UPDATE
USING (auth.uid() = user_id);
CREATE POLICY "Users can delete their own profile"
ON profile FOR DELETE
USING (auth.uid() = user_id);
-- Create a trigger to update the updated_at column on profile updates
CREATE TRIGGER update_profile_modtime
BEFORE UPDATE ON profile
FOR EACH ROW
EXECUTE FUNCTION update_modified_column();
ALTER TABLE profile
ADD COLUMN rate_limit INT DEFAULT 300;
CREATE OR REPLACE FUNCTION reset_rate_limit()
RETURNS VOID AS $$
BEGIN
UPDATE profile
SET rate_limit = 250
WHERE rate_limit < 250; -- Optional condition to reset only if rate_limit has been reduced
END;
$$ LANGUAGE plpgsql;
CREATE EXTENSION IF NOT EXISTS pg_cron;
-- Remove the existing cron job
-- SELECT cron.unschedule('daily_rate_limit_reset');
SELECT cron.schedule('daily_rate_limit_reset', '30 5 * * *', $$SELECT reset_rate_limit();$$);
SELECT * FROM cron.job; --Check if the cron job is correctly scheduled
--Manually trigger the cron job to verify functionality:
-- SELECT cron.schedule('test_reset_rate_limit', 'NOW()', $$SELECT reset_rate_limit();$$);
|