| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- -- 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;
- $$;
|