nextinbox / db /supabase-schema.sql
ranjan-shettigar's picture
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();$$);