Fix admin trade logs: wrong Prisma model and missing relations.
Load room_trade_log via SQL with user joins; status is always completed (no column in DB). Co-authored-by: Cursor <[email protected]>
This commit is contained in:
1 parent
afeabdad1b
commit
3dcd100c9f
2 files changed
+73
-24
No files matched your search
@@ -158,3 +158,74 @@ export async function loadCommandLogList({
|
|||||||
|
|
||||||
return { rows, ...pagination };
|
return { rows, ...pagination };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export type TradeLogListRow = {
|
||||||
|
id: number;
|
||||||
|
userOneName: string;
|
||||||
|
userTwoName: string;
|
||||||
|
status: string;
|
||||||
|
timestamp: number;
|
||||||
|
};
|
||||||
|
|
||||||
|
export async function loadTradeLogList({
|
||||||
|
searchParams,
|
||||||
|
defaultPerPage = 50,
|
||||||
|
}: ListParamsInput) {
|
||||||
|
await requireLogsView();
|
||||||
|
|
||||||
|
const rawParams = await searchParams;
|
||||||
|
const { search, page, perPage } = parsePageParams(rawParams, defaultPerPage);
|
||||||
|
const offset = (page - 1) * perPage;
|
||||||
|
const like = `%${search}%`;
|
||||||
|
|
||||||
|
type RawRow = {
|
||||||
|
id: number;
|
||||||
|
timestamp: number;
|
||||||
|
userOneName: string | null;
|
||||||
|
userTwoName: string | null;
|
||||||
|
};
|
||||||
|
|
||||||
|
const [rawRows, countRows] = search
|
||||||
|
? await Promise.all([
|
||||||
|
prisma.$queryRaw<RawRow[]>`
|
||||||
|
SELECT t.id, t.timestamp,
|
||||||
|
u1.username AS userOneName, u2.username AS userTwoName
|
||||||
|
FROM room_trade_log t
|
||||||
|
LEFT JOIN users u1 ON u1.id = t.user_one_id
|
||||||
|
LEFT JOIN users u2 ON u2.id = t.user_two_id
|
||||||
|
WHERE u1.username LIKE ${like} OR u2.username LIKE ${like}
|
||||||
|
ORDER BY t.timestamp DESC
|
||||||
|
LIMIT ${perPage} OFFSET ${offset}`,
|
||||||
|
prisma.$queryRaw<{ count: bigint }[]>`
|
||||||
|
SELECT COUNT(*) AS count
|
||||||
|
FROM room_trade_log t
|
||||||
|
LEFT JOIN users u1 ON u1.id = t.user_one_id
|
||||||
|
LEFT JOIN users u2 ON u2.id = t.user_two_id
|
||||||
|
WHERE u1.username LIKE ${like} OR u2.username LIKE ${like}`,
|
||||||
|
])
|
||||||
|
: await Promise.all([
|
||||||
|
prisma.$queryRaw<RawRow[]>`
|
||||||
|
SELECT t.id, t.timestamp,
|
||||||
|
u1.username AS userOneName, u2.username AS userTwoName
|
||||||
|
FROM room_trade_log t
|
||||||
|
LEFT JOIN users u1 ON u1.id = t.user_one_id
|
||||||
|
LEFT JOIN users u2 ON u2.id = t.user_two_id
|
||||||
|
ORDER BY t.timestamp DESC
|
||||||
|
LIMIT ${perPage} OFFSET ${offset}`,
|
||||||
|
prisma.$queryRaw<{ count: bigint }[]>`
|
||||||
|
SELECT COUNT(*) AS count FROM room_trade_log`,
|
||||||
|
]);
|
||||||
|
|
||||||
|
const total = Number(countRows[0]?.count ?? 0);
|
||||||
|
const pagination = calcPagination(total, page, perPage);
|
||||||
|
const rows: TradeLogListRow[] = rawRows.map((row) => ({
|
||||||
|
id: row.id,
|
||||||
|
userOneName: row.userOneName ?? "-",
|
||||||
|
userTwoName: row.userTwoName ?? "-",
|
||||||
|
// room_trade_log only stores completed trades; no status column exists
|
||||||
|
status: "completed",
|
||||||
|
timestamp: row.timestamp,
|
||||||
|
}));
|
||||||
|
|
||||||
|
return { rows, ...pagination };
|
||||||
|
}
|
||||||
@@ -1,35 +1,13 @@
|
|||||||
import { fetchAdminList } from "@/lib/admin-list";
|
import { loadTradeLogList } from "../_lib/load-ignored-logs";
|
||||||
import { PERMS } from "@/lib/permissions";
|
|
||||||
import { TradesTable } from "./trades-table";
|
import { TradesTable } from "./trades-table";
|
||||||
|
|
||||||
export default async function TradeLogsPage({
|
export default async function TradeLogsPage({
|
||||||
params: paramsPromise,
|
|
||||||
searchParams,
|
searchParams,
|
||||||
}: {
|
}: {
|
||||||
params: Promise<{ locale: string }>;
|
params: Promise<{ locale: string }>;
|
||||||
searchParams: Promise<Record<string, string>>;
|
searchParams: Promise<Record<string, string>>;
|
||||||
}) {
|
}) {
|
||||||
const result = await fetchAdminList(
|
const result = await loadTradeLogList({ searchParams, defaultPerPage: 50 });
|
||||||
{
|
|
||||||
permission: PERMS.LOGS_VIEW,
|
|
||||||
model: "trade",
|
|
||||||
searchFields: ["userOne.username", "userTwo.username"],
|
|
||||||
defaultPerPage: 50,
|
|
||||||
include: {
|
|
||||||
userOne: { select: { username: true } },
|
|
||||||
userTwo: { select: { username: true } },
|
|
||||||
},
|
|
||||||
mapRow: (t) => ({
|
|
||||||
id: t.id,
|
|
||||||
userOneName: t.userOne.username,
|
|
||||||
userTwoName: t.userTwo.username,
|
|
||||||
status: t.status,
|
|
||||||
timestamp: t.timestamp,
|
|
||||||
}),
|
|
||||||
},
|
|
||||||
paramsPromise,
|
|
||||||
searchParams,
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="space-y-6">
|
<div className="space-y-6">
|
||||||
|
|||||||
Reference in new issue
Block a user