145 lines
3.8 KiB
JavaScript
145 lines
3.8 KiB
JavaScript
const dealDB = require("../db/deal.db")
|
|
const dealReportDB = require("../db/dealReport.db")
|
|
const { queueDealReportStatusUpdate } = require("./redis/dbSync.service")
|
|
const { sanitizeOptionalPlainText } = require("../utils/inputSanitizer")
|
|
|
|
const PAGE_LIMIT = 20
|
|
const ALLOWED_REASONS = new Set([
|
|
"EXPIRED",
|
|
"WRONG_PRICE",
|
|
"MISLEADING",
|
|
"SPAM",
|
|
"OTHER",
|
|
])
|
|
const ALLOWED_STATUSES = new Set(["OPEN", "REVIEWED", "CLOSED"])
|
|
|
|
function assertPositiveInt(value, name) {
|
|
const num = Number(value)
|
|
if (!Number.isInteger(num) || num <= 0) throw new Error(`Gecersiz ${name}.`)
|
|
return num
|
|
}
|
|
|
|
function normalizePage(value) {
|
|
const num = Number(value)
|
|
if (!Number.isInteger(num) || num < 1) return 1
|
|
return num
|
|
}
|
|
|
|
function normalizeReason(value) {
|
|
const normalized = String(value || "").trim().toUpperCase()
|
|
return ALLOWED_REASONS.has(normalized) ? normalized : null
|
|
}
|
|
|
|
function normalizeStatus(value) {
|
|
if (!value) return null
|
|
const normalized = String(value || "").trim().toUpperCase()
|
|
return ALLOWED_STATUSES.has(normalized) ? normalized : null
|
|
}
|
|
|
|
async function createDealReport({ dealId, userId, reason, note }) {
|
|
const did = assertPositiveInt(dealId, "dealId")
|
|
const uid = assertPositiveInt(userId, "userId")
|
|
const normalizedReason = normalizeReason(reason)
|
|
if (!normalizedReason) {
|
|
const err = new Error("Gecersiz reason.")
|
|
err.statusCode = 400
|
|
throw err
|
|
}
|
|
|
|
const deal = await dealDB.findDeal({ id: did }, { select: { id: true } })
|
|
if (!deal) {
|
|
const err = new Error("Deal bulunamadi.")
|
|
err.statusCode = 404
|
|
throw err
|
|
}
|
|
|
|
await dealReportDB.upsertDealReport({
|
|
dealId: did,
|
|
userId: uid,
|
|
reason: normalizedReason,
|
|
note: sanitizeOptionalPlainText(note, { maxLength: 500 }),
|
|
})
|
|
|
|
return { reported: true }
|
|
}
|
|
|
|
async function listDealReports({ status = null, dealId = null, userId = null } = {}) {
|
|
const skip = 0
|
|
|
|
const where = {}
|
|
const normalizedStatus = normalizeStatus(status)
|
|
where.status = normalizedStatus || "OPEN"
|
|
|
|
if (Number.isInteger(Number(dealId))) where.dealId = Number(dealId)
|
|
if (Number.isInteger(Number(userId))) where.userId = Number(userId)
|
|
|
|
const [total, reports] = await Promise.all([
|
|
dealReportDB.countDealReports(where),
|
|
dealReportDB.listDealReports(where, {
|
|
skip,
|
|
orderBy: { createdAt: "asc" },
|
|
include: {
|
|
deal: { select: { id: true, title: true, status: true } },
|
|
user: { select: { id: true, username: true } },
|
|
},
|
|
}),
|
|
])
|
|
|
|
return {
|
|
total,
|
|
results: reports,
|
|
}
|
|
}
|
|
|
|
async function getPendingReports({ page = 1 } = {}) {
|
|
const safePage = normalizePage(page)
|
|
const skip = (safePage - 1) * PAGE_LIMIT
|
|
|
|
const where = { status: "OPEN" }
|
|
|
|
const [total, reports] = await Promise.all([
|
|
dealReportDB.countDealReports(where),
|
|
dealReportDB.listDealReports(where, {
|
|
skip,
|
|
take: PAGE_LIMIT,
|
|
orderBy: { createdAt: "asc" },
|
|
include: {
|
|
deal: { select: { id: true, title: true, status: true } },
|
|
user: { select: { id: true, username: true } },
|
|
},
|
|
}),
|
|
])
|
|
|
|
return {
|
|
page: safePage,
|
|
total,
|
|
totalPages: total ? Math.ceil(total / PAGE_LIMIT) : 0,
|
|
results: reports,
|
|
}
|
|
}
|
|
|
|
async function updateDealReportStatus({ reportId, status }) {
|
|
const rid = assertPositiveInt(reportId, "reportId")
|
|
const normalizedStatus = normalizeStatus(status)
|
|
if (!normalizedStatus) {
|
|
const err = new Error("Gecersiz status.")
|
|
err.statusCode = 400
|
|
throw err
|
|
}
|
|
|
|
queueDealReportStatusUpdate({
|
|
reportId: rid,
|
|
status: normalizedStatus,
|
|
updatedAt: new Date().toISOString(),
|
|
}).catch((err) => console.error("DB sync dealReport status failed:", err?.message || err))
|
|
|
|
return { reportId: rid, status: normalizedStatus }
|
|
}
|
|
|
|
module.exports = {
|
|
createDealReport,
|
|
listDealReports,
|
|
getPendingReports,
|
|
updateDealReportStatus,
|
|
}
|