mirror of
http://forgejo-oa09toasww4dgii9cj3gpzda.187.127.164.61.sslip.io/iamcoolvivek007/bharath.git
synced 2026-06-11 00:06:51 +00:00
- Govt-app styled freight marketplace - Role-based auth (driver/shipper/broker/admin) - Load board with bidding system - Trip tracking with status flow - In-app messaging - Admin panel - Mobile bottom nav + PWA - Docker + Coolify ready
72 lines
2.7 KiB
PL/PgSQL
72 lines
2.7 KiB
PL/PgSQL
-- ============================================================
|
|
-- BharathTrucks — Loads & Bids Migration
|
|
-- Run in Supabase SQL Editor AFTER app_users migration
|
|
-- ============================================================
|
|
|
|
CREATE TABLE IF NOT EXISTS loads (
|
|
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
|
|
posted_by UUID NOT NULL REFERENCES app_users(id) ON DELETE CASCADE,
|
|
origin_city TEXT NOT NULL,
|
|
destination_city TEXT NOT NULL,
|
|
weight_tons NUMERIC(5,1) NOT NULL,
|
|
truck_type TEXT NOT NULL,
|
|
material_type TEXT,
|
|
budget NUMERIC(10,2),
|
|
pickup_date DATE NOT NULL,
|
|
description TEXT,
|
|
is_urgent BOOLEAN DEFAULT FALSE,
|
|
status TEXT DEFAULT 'open' CHECK (status IN ('open', 'booked', 'in_transit', 'delivered', 'cancelled')),
|
|
bid_count INTEGER DEFAULT 0,
|
|
accepted_bid_id UUID,
|
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_loads_status ON loads(status);
|
|
CREATE INDEX IF NOT EXISTS idx_loads_origin ON loads(origin_city);
|
|
CREATE INDEX IF NOT EXISTS idx_loads_destination ON loads(destination_city);
|
|
CREATE INDEX IF NOT EXISTS idx_loads_posted_by ON loads(posted_by);
|
|
CREATE INDEX IF NOT EXISTS idx_loads_pickup_date ON loads(pickup_date);
|
|
|
|
CREATE TABLE IF NOT EXISTS bids (
|
|
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
|
|
load_id UUID NOT NULL REFERENCES loads(id) ON DELETE CASCADE,
|
|
driver_id UUID NOT NULL REFERENCES app_users(id) ON DELETE CASCADE,
|
|
amount NUMERIC(10,2) NOT NULL,
|
|
note TEXT,
|
|
status TEXT DEFAULT 'pending' CHECK (status IN ('pending', 'accepted', 'rejected', 'withdrawn')),
|
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
UNIQUE(load_id, driver_id)
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_bids_load ON bids(load_id);
|
|
CREATE INDEX IF NOT EXISTS idx_bids_driver ON bids(driver_id);
|
|
|
|
-- Auto increment bid_count
|
|
CREATE OR REPLACE FUNCTION increment_bid_count()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
UPDATE loads SET bid_count = bid_count + 1 WHERE id = NEW.load_id;
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
DROP TRIGGER IF EXISTS bid_count_trigger ON bids;
|
|
CREATE TRIGGER bid_count_trigger AFTER INSERT ON bids
|
|
FOR EACH ROW EXECUTE FUNCTION increment_bid_count();
|
|
|
|
-- updated_at trigger
|
|
CREATE OR REPLACE FUNCTION update_updated_at()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN NEW.updated_at = NOW(); RETURN NEW; END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
DROP TRIGGER IF EXISTS loads_updated_at ON loads;
|
|
CREATE TRIGGER loads_updated_at BEFORE UPDATE ON loads
|
|
FOR EACH ROW EXECUTE FUNCTION update_updated_at();
|
|
|
|
-- RLS
|
|
ALTER TABLE loads ENABLE ROW LEVEL SECURITY;
|
|
ALTER TABLE bids ENABLE ROW LEVEL SECURITY;
|
|
CREATE POLICY "Allow all on loads" ON loads FOR ALL USING (true) WITH CHECK (true);
|
|
CREATE POLICY "Allow all on bids" ON bids FOR ALL USING (true) WITH CHECK (true);
|