47 lines
1.3 KiB
PL/PgSQL
47 lines
1.3 KiB
PL/PgSQL
BEGIN;
|
|
|
|
ALTER TABLE user_broker ADD COLUMN IF NOT EXISTS api_secret TEXT;
|
|
ALTER TABLE user_broker ADD COLUMN IF NOT EXISTS auth_state TEXT;
|
|
|
|
UPDATE user_broker
|
|
SET auth_state = 'UNKNOWN'
|
|
WHERE auth_state IS NULL;
|
|
|
|
DO $$
|
|
BEGIN
|
|
IF EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'chk_strategy_run_status') THEN
|
|
ALTER TABLE strategy_run DROP CONSTRAINT chk_strategy_run_status;
|
|
END IF;
|
|
ALTER TABLE strategy_run
|
|
ADD CONSTRAINT chk_strategy_run_status
|
|
CHECK (status IN ('RUNNING','STOPPED','ERROR','PAUSED_AUTH_EXPIRED'));
|
|
END $$;
|
|
|
|
CREATE OR REPLACE FUNCTION enforce_strategy_run_transition()
|
|
RETURNS trigger AS $$
|
|
BEGIN
|
|
IF TG_OP = 'UPDATE' THEN
|
|
IF OLD.status = NEW.status THEN
|
|
RETURN NEW;
|
|
END IF;
|
|
|
|
IF OLD.status = 'ERROR' THEN
|
|
RAISE EXCEPTION 'run status cannot transition from % to %', OLD.status, NEW.status;
|
|
END IF;
|
|
|
|
IF OLD.status IN ('STOPPED','PAUSED_AUTH_EXPIRED') AND NEW.status <> 'RUNNING' THEN
|
|
RAISE EXCEPTION 'run status cannot transition from % to %', OLD.status, NEW.status;
|
|
END IF;
|
|
|
|
IF OLD.status = 'RUNNING' AND NEW.status NOT IN ('STOPPED','ERROR','PAUSED_AUTH_EXPIRED') THEN
|
|
RAISE EXCEPTION 'run status cannot transition from % to %', OLD.status, NEW.status;
|
|
END IF;
|
|
END IF;
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
DROP INDEX IF EXISTS uq_one_running_run_per_user;
|
|
|
|
COMMIT;
|