···11+-- Track which PDS service has been provisioned for each user
22+-- This lets the dashboard fetch the correct service via GET /service/{id}
33+CREATE TABLE IF NOT EXISTS pds_services (
44+ user_id UUID PRIMARY KEY REFERENCES auth.users(id) ON DELETE CASCADE,
55+ pds_service_id BIGINT,
66+ hostname TEXT,
77+ status TEXT NOT NULL DEFAULT 'provisioning',
88+ created_at TIMESTAMPTZ DEFAULT NOW(),
99+ updated_at TIMESTAMPTZ DEFAULT NOW()
1010+);
1111+1212+ALTER TABLE pds_services ENABLE ROW LEVEL SECURITY;
1313+1414+-- Users can see only their own provisioned PDS
1515+DROP POLICY IF EXISTS "Users can view own pds services" ON pds_services;
1616+CREATE POLICY "Users can view own pds services"
1717+ ON pds_services
1818+ FOR SELECT
1919+ USING (auth.uid() = user_id);
2020+2121+-- Keep updated_at current
2222+CREATE OR REPLACE FUNCTION update_pds_services_updated_at_column()
2323+RETURNS TRIGGER AS $$
2424+BEGIN
2525+ NEW.updated_at = NOW();
2626+ RETURN NEW;
2727+END;
2828+$$ language 'plpgsql';
2929+3030+DROP TRIGGER IF EXISTS update_pds_services_updated_at ON pds_services;
3131+CREATE TRIGGER update_pds_services_updated_at
3232+ BEFORE UPDATE ON pds_services
3333+ FOR EACH ROW
3434+ EXECUTE FUNCTION update_pds_services_updated_at_column();
3535+