Spaces:
Sleeping
Sleeping
Add initial project setup with environment configuration, Go modules, Dockerfile, and example code
4f3c35d
| -- 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();$$); | |