-- Profit-control fields are part of the API-key auth snapshot and gate the -- scheduling admission filter; the profit threshold D additionally depends on -- group pricing and peak-window fields. Extend the durable invalidation -- trigger so out-of-band group edits (direct SQL, crash between update and -- app-level invalidation) cannot leave cached snapshots using stale -- profit-control inputs. Normal admin saves already invalidate via -- InvalidateAuthCacheByGroupID; this trigger is the durable backstop. Based on -- the latest function body from 186_group_auth_cache_image_generation.sql. CREATE OR REPLACE FUNCTION enqueue_group_auth_cache_invalidation() RETURNS TRIGGER LANGUAGE plpgsql AS $$ DECLARE target_group_id BIGINT; BEGIN target_group_id := OLD.id; IF TG_OP = 'UPDATE' AND OLD.status IS NOT DISTINCT FROM NEW.status AND OLD.is_exclusive IS NOT DISTINCT FROM NEW.is_exclusive AND OLD.allow_image_generation IS NOT DISTINCT FROM NEW.allow_image_generation AND OLD.platform IS NOT DISTINCT FROM NEW.platform AND OLD.subscription_type IS NOT DISTINCT FROM NEW.subscription_type AND OLD.rate_multiplier IS NOT DISTINCT FROM NEW.rate_multiplier AND OLD.peak_rate_enabled IS NOT DISTINCT FROM NEW.peak_rate_enabled AND OLD.peak_start IS NOT DISTINCT FROM NEW.peak_start AND OLD.peak_end IS NOT DISTINCT FROM NEW.peak_end AND OLD.peak_rate_multiplier IS NOT DISTINCT FROM NEW.peak_rate_multiplier AND OLD.profit_control_enabled IS NOT DISTINCT FROM NEW.profit_control_enabled AND OLD.profit_min_margin IS NOT DISTINCT FROM NEW.profit_min_margin AND OLD.profit_safety_buffer IS NOT DISTINCT FROM NEW.profit_safety_buffer AND OLD.deleted_at IS NOT DISTINCT FROM NEW.deleted_at THEN RETURN NEW; END IF; INSERT INTO auth_cache_invalidation_outbox (cache_key) SELECT encode(sha256(convert_to(k.key, 'UTF8')), 'hex') FROM api_keys AS k WHERE k.group_id = target_group_id AND k.deleted_at IS NULL AND k.key <> ''; IF TG_OP = 'DELETE' THEN RETURN OLD; END IF; RETURN NEW; END; $$;