/** Shipping zones and methods. */ /** @param {import('node-pg-migrate').MigrationBuilder} pgm */ export const up = (pgm) => { pgm.sql(` CREATE TABLE shipping_zones ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), name text NOT NULL, country text NOT NULL, postal_code_prefix text, active boolean NOT NULL DEFAULT true, created_at timestamptz NOT NULL DEFAULT now(), updated_at timestamptz NOT NULL DEFAULT now() ) `); pgm.sql('CREATE INDEX shipping_zones_country_idx ON shipping_zones (country, active)'); pgm.sql(` CREATE TABLE shipping_methods ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), zone_id uuid NOT NULL REFERENCES shipping_zones(id) ON DELETE CASCADE, name text NOT NULL, base_cost_cents integer NOT NULL, free_shipping_threshold_cents integer, active boolean NOT NULL DEFAULT true, created_at timestamptz NOT NULL DEFAULT now(), updated_at timestamptz NOT NULL DEFAULT now(), CONSTRAINT shipping_methods_base_cost_non_negative CHECK (base_cost_cents >= 0), CONSTRAINT shipping_methods_threshold_non_negative CHECK (free_shipping_threshold_cents IS NULL OR free_shipping_threshold_cents >= 0) ) `); pgm.sql('CREATE INDEX shipping_methods_zone_id_idx ON shipping_methods (zone_id)'); }; /** @param {import('node-pg-migrate').MigrationBuilder} pgm */ export const down = (pgm) => { pgm.sql('DROP TABLE IF EXISTS shipping_methods'); pgm.sql('DROP TABLE IF EXISTS shipping_zones'); };