75 lines
3.7 KiB
SQL
75 lines
3.7 KiB
SQL
-- Create products table
|
|
CREATE TABLE IF NOT EXISTS public.products (
|
|
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
|
|
name TEXT NOT NULL,
|
|
url TEXT NOT NULL,
|
|
store TEXT NOT NULL,
|
|
category TEXT NOT NULL, -- 'harddrive', 'ram', 'processor', 'graphics_card'
|
|
current_price DECIMAL(10,2) NOT NULL,
|
|
currency TEXT DEFAULT 'DKK',
|
|
specs JSONB NOT NULL, -- Store size, brand, speed, etc.
|
|
last_checked TIMESTAMP WITH TIME ZONE DEFAULT now(),
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT now()
|
|
);
|
|
|
|
-- Create alert profiles table (specification-based, not product-specific)
|
|
CREATE TABLE IF NOT EXISTS public.alert_profiles (
|
|
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
|
|
name TEXT NOT NULL,
|
|
category TEXT NOT NULL,
|
|
target_price DECIMAL(10,2) NOT NULL,
|
|
specs_filter JSONB NOT NULL, -- e.g., {"min_size": "6TB", "type": "SSD"}
|
|
discord_webhook_url TEXT,
|
|
enabled BOOLEAN DEFAULT true,
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT now()
|
|
);
|
|
|
|
-- Create price history table
|
|
CREATE TABLE IF NOT EXISTS public.price_history (
|
|
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
|
|
product_id UUID REFERENCES public.products(id) ON DELETE CASCADE,
|
|
price DECIMAL(10,2) NOT NULL,
|
|
checked_at TIMESTAMP WITH TIME ZONE DEFAULT now()
|
|
);
|
|
|
|
-- Create alerts log table
|
|
CREATE TABLE IF NOT EXISTS public.alerts_log (
|
|
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
|
|
alert_profile_id UUID REFERENCES public.alert_profiles(id) ON DELETE CASCADE,
|
|
product_id UUID REFERENCES public.products(id) ON DELETE CASCADE,
|
|
triggered_price DECIMAL(10,2) NOT NULL,
|
|
message TEXT,
|
|
sent_to_discord BOOLEAN DEFAULT false,
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT now()
|
|
);
|
|
|
|
-- Enable Row Level Security (but make everything public since no login)
|
|
ALTER TABLE public.products ENABLE ROW LEVEL SECURITY;
|
|
ALTER TABLE public.alert_profiles ENABLE ROW LEVEL SECURITY;
|
|
ALTER TABLE public.price_history ENABLE ROW LEVEL SECURITY;
|
|
ALTER TABLE public.alerts_log ENABLE ROW LEVEL SECURITY;
|
|
|
|
-- Create public access policies (no authentication required)
|
|
CREATE POLICY "Public read access for products" ON public.products FOR SELECT USING (true);
|
|
CREATE POLICY "Public insert access for products" ON public.products FOR INSERT WITH CHECK (true);
|
|
CREATE POLICY "Public update access for products" ON public.products FOR UPDATE USING (true);
|
|
CREATE POLICY "Public delete access for products" ON public.products FOR DELETE USING (true);
|
|
|
|
CREATE POLICY "Public read access for alert_profiles" ON public.alert_profiles FOR SELECT USING (true);
|
|
CREATE POLICY "Public insert access for alert_profiles" ON public.alert_profiles FOR INSERT WITH CHECK (true);
|
|
CREATE POLICY "Public update access for alert_profiles" ON public.alert_profiles FOR UPDATE USING (true);
|
|
CREATE POLICY "Public delete access for alert_profiles" ON public.alert_profiles FOR DELETE USING (true);
|
|
|
|
CREATE POLICY "Public read access for price_history" ON public.price_history FOR SELECT USING (true);
|
|
CREATE POLICY "Public insert access for price_history" ON public.price_history FOR INSERT WITH CHECK (true);
|
|
|
|
CREATE POLICY "Public read access for alerts_log" ON public.alerts_log FOR SELECT USING (true);
|
|
CREATE POLICY "Public insert access for alerts_log" ON public.alerts_log FOR INSERT WITH CHECK (true);
|
|
|
|
-- Create indexes for better performance
|
|
CREATE INDEX idx_products_category ON public.products(category);
|
|
CREATE INDEX idx_products_last_checked ON public.products(last_checked);
|
|
CREATE INDEX idx_alert_profiles_category ON public.alert_profiles(category);
|
|
CREATE INDEX idx_alert_profiles_enabled ON public.alert_profiles(enabled);
|
|
CREATE INDEX idx_price_history_product ON public.price_history(product_id);
|
|
CREATE INDEX idx_alerts_log_profile ON public.alerts_log(alert_profile_id); |