Files
clientflow_backend/scripts/ignore_manually_cleaned_outbox.py
2026-06-09 22:55:58 +01:00

61 lines
2.0 KiB
Python
Executable File

#!/usr/bin/env python3
"""Mark manually cleaned outbox failures as ignored.
Use when old Jasmin/Packlink test or duplicate failures were already handled
outside the worker and should no longer pollute /operations.
"""
from __future__ import annotations
import argparse
from sqlalchemy import text
from app.db import engine
MATCH_SQL = """
status = 'failed'
AND (
COALESCE(last_error, '') ILIKE '%limpo manualmente%'
OR COALESCE(last_error, '') ILIKE '%resolvido manualmente%'
)
"""
def main() -> int:
parser = argparse.ArgumentParser(description="Ignore outbox failures already resolved manually.")
parser.add_argument("--dry-run", action="store_true", help="Only show matching rows; do not update.")
parser.add_argument("--limit", type=int, default=200, help="Maximum rows to inspect/update.")
args = parser.parse_args()
with engine.begin() as conn:
rows = conn.execute(text(f"""
SELECT id::text, target_system, action_type, status, last_error, created_at
FROM integration_outbox
WHERE {MATCH_SQL}
ORDER BY created_at DESC
LIMIT :limit
"""), {"limit": args.limit}).mappings().all()
print(f"Matched {len(rows)} manually cleaned failed outbox item(s).")
for row in rows:
print(f"- {row['id']} {row['target_system']}.{row['action_type']} :: {row['last_error']}")
if args.dry_run or not rows:
print("Dry-run/no-op; no rows updated.")
return 0
ids = [row["id"] for row in rows]
conn.execute(text("""
UPDATE integration_outbox
SET status = 'ignored',
last_error = COALESCE(NULLIF(last_error, ''), 'Ignorado por limpeza operacional manual.'),
updated_at = now()
WHERE id::text = ANY(:ids)
"""), {"ids": ids})
print(f"Updated {len(ids)} item(s) to ignored.")
return 0
if __name__ == "__main__":
raise SystemExit(main())