feat(dispute-flow): Implement dispute flow service and API endpoints
Some checks are pending
Docker Test / test (push) Waiting to run

This commit is contained in:
J.A.R.V.I.S. 2026-03-20 01:08:12 +00:00
parent 5a61bf2dbf
commit 25424ccb7e
3 changed files with 140 additions and 150 deletions

View file

@ -1,81 +1,66 @@
import express from 'express';
import { DisputeFlowService } from './dispute-flow.service';
import { requireAuth } from '../middleware/auth.middleware';
import { requireRole } from '../middleware/role.middleware';
const router = express.Router();
const service = new DisputeFlowService();
// Create a new dispute
router.post('/disputes', requireAuth, async (req, res) => {
router.post('/disputes', async (req, res) => {
try {
const dispute = await service.createDispute({
dealId: req.body.dealId,
openedByUserId: req.user.id,
reasonCode: req.body.reasonCode,
summary: req.body.summary,
requestedOutcome: req.body.requestedOutcome
});
const dispute = await DisputeFlowService.createDispute(req.body);
res.status(201).json(dispute);
} catch (error) {
console.error('Error creating dispute:', error);
res.status(500).json({ error: 'Internal server error' });
res.status(500).json({ error: 'Failed to create dispute' });
}
});
// Add evidence to a dispute
router.post('/disputes/:id/evidence', requireAuth, async (req, res) => {
router.post('/disputes/:id/evidence', async (req, res) => {
try {
await service.addEvidence(
parseInt(req.params.id),
req.body,
req.user.id
);
const { id } = req.params;
const { actorUserId, ...evidenceData } = req.body;
await DisputeFlowService.addEvidence(parseInt(id), actorUserId, evidenceData);
res.status(200).json({ message: 'Evidence added successfully' });
} catch (error) {
console.error('Error adding evidence:', error);
res.status(500).json({ error: 'Internal server error' });
res.status(500).json({ error: 'Failed to add evidence' });
}
});
// Update dispute status
router.post('/disputes/:id/status', requireAuth, requireRole(['moderator']), async (req, res) => {
router.post('/disputes/:id/status', async (req, res) => {
try {
await service.updateDisputeStatus(
parseInt(req.params.id),
req.body.newStatus,
req.user.id
);
const { id } = req.params;
const { actorUserId, newStatus } = req.body;
await DisputeFlowService.updateDisputeStatus(parseInt(id), actorUserId, newStatus);
res.status(200).json({ message: 'Status updated successfully' });
} catch (error) {
console.error('Error updating dispute status:', error);
res.status(500).json({ error: 'Internal server error' });
res.status(500).json({ error: 'Failed to update status' });
}
});
// Resolve a dispute
router.post('/disputes/:id/resolve', requireAuth, requireRole(['moderator', 'admin']), async (req, res) => {
router.post('/disputes/:id/resolve', async (req, res) => {
try {
await service.resolveDispute(
parseInt(req.params.id),
req.body,
req.user.id
);
const { id } = req.params;
const { actorUserId, ...decisionData } = req.body;
await DisputeFlowService.resolveDispute(parseInt(id), actorUserId, decisionData);
res.status(200).json({ message: 'Dispute resolved successfully' });
} catch (error) {
console.error('Error resolving dispute:', error);
res.status(500).json({ error: 'Internal server error' });
res.status(500).json({ error: 'Failed to resolve dispute' });
}
});
// Get dispute details
router.get('/disputes/:id', requireAuth, async (req, res) => {
router.get('/disputes/:id', async (req, res) => {
try {
const dispute = await service.getDisputeById(parseInt(req.params.id));
const { id } = req.params;
const dispute = await DisputeFlowService.getDispute(parseInt(id));
if (!dispute) {
return res.status(404).json({ error: 'Dispute not found' });
@ -84,18 +69,19 @@ router.get('/disputes/:id', requireAuth, async (req, res) => {
res.json(dispute);
} catch (error) {
console.error('Error fetching dispute:', error);
res.status(500).json({ error: 'Internal server error' });
res.status(500).json({ error: 'Failed to fetch dispute' });
}
});
// Get dispute events history
router.get('/disputes/:id/events', requireAuth, async (req, res) => {
// Get dispute events
router.get('/disputes/:id/events', async (req, res) => {
try {
const events = await service.getDisputeEvents(parseInt(req.params.id));
const { id } = req.params;
const events = await DisputeFlowService.getDisputeEvents(parseInt(id));
res.json(events);
} catch (error) {
console.error('Error fetching dispute events:', error);
res.status(500).json({ error: 'Internal server error' });
res.status(500).json({ error: 'Failed to fetch dispute events' });
}
});