Problem
trade-safety.ts lets a user open a dispute via recordTradeDispute (abuse.service.ts), rate-limited by disputeRateLimitMax. There is no corresponding endpoint in admin.ts (or anywhere) for an admin to list open disputes and resolve them. Today, once a dispute is opened, there is no operational path to close it out — funds can sit stuck indefinitely.
Scope (backend only, no new UI in this issue)
GET /admin/disputes — list open disputes with trade context (amounts, parties, trade-scoped messages/evidence).
POST /admin/disputes/:id/resolve — admin action to refund buyer, release to seller, or ban a party; closes the dispute and updates trade status accordingly.
- Audit log entry for every resolution (reuse
audit.service.ts).
Out of scope
- Admin dashboard UI (separate issue if wanted later).
- Automated/algorithmic dispute resolution.
Why this matters
Funds can currently get stuck in an open dispute with no way to close it — direct user-funds risk.
Problem
trade-safety.tslets a user open a dispute viarecordTradeDispute(abuse.service.ts), rate-limited bydisputeRateLimitMax. There is no corresponding endpoint inadmin.ts(or anywhere) for an admin to list open disputes and resolve them. Today, once a dispute is opened, there is no operational path to close it out — funds can sit stuck indefinitely.Scope (backend only, no new UI in this issue)
GET /admin/disputes— list open disputes with trade context (amounts, parties, trade-scoped messages/evidence).POST /admin/disputes/:id/resolve— admin action to refund buyer, release to seller, or ban a party; closes the dispute and updates trade status accordingly.audit.service.ts).Out of scope
Why this matters
Funds can currently get stuck in an open dispute with no way to close it — direct user-funds risk.