77 lines
3.0 KiB
SQL
77 lines
3.0 KiB
SQL
-- Location: supabase/migrations/20250126225029_taxi_module.sql
|
|
-- Schema Analysis: Existing transportation system with routes, stops, timetable
|
|
-- Integration Type: NEW_MODULE - Adding taxi directory functionality
|
|
-- Dependencies: No direct references to existing tables (standalone module)
|
|
|
|
-- Create tables for taxi directory functionality
|
|
CREATE TABLE public.taxis (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
name TEXT NOT NULL,
|
|
phone TEXT NOT NULL,
|
|
district TEXT NOT NULL,
|
|
is_active BOOLEAN DEFAULT true,
|
|
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Create favorites table (conditional user relationship)
|
|
CREATE TABLE public.favorite_taxis (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
user_id UUID NOT NULL,
|
|
taxi_id UUID REFERENCES public.taxis(id) ON DELETE CASCADE,
|
|
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Essential indexes for performance
|
|
CREATE INDEX idx_taxis_district ON public.taxis(district);
|
|
CREATE INDEX idx_taxis_is_active ON public.taxis(is_active);
|
|
CREATE INDEX idx_taxis_name ON public.taxis(name);
|
|
CREATE INDEX idx_favorite_taxis_user_id ON public.favorite_taxis(user_id);
|
|
CREATE INDEX idx_favorite_taxis_taxi_id ON public.favorite_taxis(taxi_id);
|
|
|
|
-- Unique constraint for user-taxi favorites
|
|
CREATE UNIQUE INDEX idx_favorite_taxis_unique ON public.favorite_taxis(user_id, taxi_id);
|
|
|
|
-- Enable RLS for security
|
|
ALTER TABLE public.taxis ENABLE ROW LEVEL SECURITY;
|
|
ALTER TABLE public.favorite_taxis ENABLE ROW LEVEL SECURITY;
|
|
|
|
-- RLS Policies using Pattern 4: Public Read, Private Write
|
|
CREATE POLICY "public_can_read_taxis"
|
|
ON public.taxis
|
|
FOR SELECT
|
|
TO public
|
|
USING (true);
|
|
|
|
-- Pattern 2: Simple User Ownership for favorites
|
|
CREATE POLICY "users_manage_own_favorite_taxis"
|
|
ON public.favorite_taxis
|
|
FOR ALL
|
|
TO authenticated
|
|
USING (user_id = auth.uid())
|
|
WITH CHECK (user_id = auth.uid());
|
|
|
|
-- Allow anonymous users to read favorites (for local storage fallback)
|
|
CREATE POLICY "public_can_read_favorite_taxis"
|
|
ON public.favorite_taxis
|
|
FOR SELECT
|
|
TO public
|
|
USING (true);
|
|
|
|
-- Sample taxi data for different districts
|
|
DO $$
|
|
BEGIN
|
|
INSERT INTO public.taxis (name, phone, district, is_active) VALUES
|
|
('Taxi Central Boquete', '+507 720-1234', 'Boquete', true),
|
|
('Taxi Flores David', '+507 775-5678', 'David', true),
|
|
('Taxi Montaña Verde', '+507 720-9101', 'Boquete', true),
|
|
('Taxi Ciudad David', '+507 775-1122', 'David', true),
|
|
('Taxi Volcán Express', '+507 771-3344', 'Volcán', true),
|
|
('Taxi Dolega Rápido', '+507 721-5566', 'Dolega', true),
|
|
('Taxi Bugaba Seguro', '+507 772-7788', 'Bugaba', true),
|
|
('Taxi Renacimiento', '+507 773-9900', 'Renacimiento', true),
|
|
('Taxi Alanje Centro', '+507 774-2233', 'Alanje', true),
|
|
('Taxi Boquerón', '+507 775-4455', 'Boquerón', true),
|
|
('Taxi Los Naranjos', '+507 720-6677', 'Boquete', true),
|
|
('Taxi San Lorenzo', '+507 775-8899', 'David', true);
|
|
END $$; |