-- Positive prices, valid stock arithmetic and private-address defaults are -- enforced in PostgreSQL in addition to request validation. ALTER TABLE product_variants ADD CONSTRAINT variant_positive_price CHECK (price > 0); ALTER TABLE stock_items ADD CONSTRAINT stock_nonnegative CHECK (on_hand >= 0); ALTER TABLE stock_ledger ADD CONSTRAINT ledger_nonzero_delta CHECK (delta <> 0); ALTER TABLE stock_reservations ADD CONSTRAINT reservation_positive_quantity CHECK (quantity > 0); CREATE UNIQUE INDEX addresses_one_default ON addresses (user_id) WHERE is_default = true; CREATE FUNCTION reject_stock_ledger_mutation() RETURNS trigger LANGUAGE plpgsql AS $$ BEGIN RAISE EXCEPTION 'Stock ledger entries are append-only'; END; $$; CREATE TRIGGER stock_ledger_append_only BEFORE UPDATE OR DELETE ON stock_ledger FOR EACH ROW EXECUTE FUNCTION reject_stock_ledger_mutation(); -- Existing system-owner roles need the new permissions. Custom roles retain -- their explicit grants and must be updated through the authorized API. UPDATE roles SET permissions = ARRAY( SELECT DISTINCT permission FROM unnest(permissions || ARRAY[ 'catalog.read', 'catalog.manage', 'catalog.publish', 'inventory.read', 'inventory.manage', 'inventory.adjust', 'inventory.reserve', 'inventory.commit' ]::text[]) AS permission ORDER BY permission ) WHERE is_system = true;