- Backend moderation module: GET /api/moderation/stats (per-status + failed rate) + GET /api/moderation/actions (filter by status/actionType, cursor paging), joins messages for target username + content - Message GET /api/messages/detail/:id now returns edit_count + edit_history (old_content snapshots from message_edits, newest first) - FE: new /moderation page — summary cards (total/executed/failed/pending + failed-rate), status+type filter chips, timeline rows with action icon, target user, reason, status badge, timestamps, error text - FE: message detail shows 'Riwayat edit' panel with previous versions
44 lines
1.4 KiB
TypeScript
44 lines
1.4 KiB
TypeScript
import type { Request, Response, Router } from "express";
|
|
import express from "express";
|
|
import { createChildLogger } from "../../shared/logger/index.js";
|
|
import { asyncHandler } from "../../shared/middlewares/index.js";
|
|
import { moderationService } from "./moderation.service.js";
|
|
|
|
const logger = createChildLogger("moderation.routes");
|
|
|
|
export function createModerationRouter(): Router {
|
|
const router = express.Router();
|
|
|
|
// GET /api/moderation/stats — moderation action summary
|
|
router.get(
|
|
"/moderation/stats",
|
|
asyncHandler(async (_req: Request, res: Response) => {
|
|
const stats = await moderationService.getStats();
|
|
res.json(stats);
|
|
}),
|
|
);
|
|
|
|
// GET /api/moderation/actions — paginated moderation action log
|
|
router.get(
|
|
"/moderation/actions",
|
|
asyncHandler(async (req: Request, res: Response) => {
|
|
const limit = Number(req.query.limit) || 50;
|
|
const status = req.query.status as string | undefined;
|
|
const actionType = req.query.actionType as string | undefined;
|
|
const cursor = req.query.cursor as string | undefined;
|
|
|
|
const result = await moderationService.listActions({
|
|
limit,
|
|
status,
|
|
actionType,
|
|
cursor: cursor ? Number(cursor) : undefined,
|
|
});
|
|
|
|
logger.debug({ count: result.data.length }, "Moderation actions listed");
|
|
res.json(result);
|
|
}),
|
|
);
|
|
|
|
return router;
|
|
}
|