28 lines
1.3 KiB
PL/PgSQL
28 lines
1.3 KiB
PL/PgSQL
-- 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;
|
|
|