ledger revanced
This commit is contained in:
@@ -8,6 +8,7 @@ import {
|
||||
type AdminDashboardTab,
|
||||
} from "@/lib/dashboard-search-url";
|
||||
import { createAdminSupabase } from "@/lib/supabase/admin";
|
||||
import { normalizeLedgerPageSize } from "@/lib/ledger-table-view";
|
||||
|
||||
function parseScoreField(raw: FormDataEntryValue | null): number | null {
|
||||
if (raw == null) return null;
|
||||
@@ -41,7 +42,42 @@ export async function updateUserCcRc(formData: FormData) {
|
||||
const participant =
|
||||
participantRaw === "" ? null : participantRaw;
|
||||
|
||||
const base = { tab, highlightId, participantRaw: participant };
|
||||
const ledgerFromRaw = String(formData.get("ledgerFrom") ?? "").trim();
|
||||
const ledgerToRaw = String(formData.get("ledgerTo") ?? "").trim();
|
||||
const ledgerPageRaw = String(formData.get("ledgerPage") ?? "").trim();
|
||||
const ledgerPageSizeRaw = String(
|
||||
formData.get("ledgerPageSize") ?? "",
|
||||
).trim();
|
||||
const ledgerSortRaw = String(formData.get("ledgerSort") ?? "").trim();
|
||||
const ledgerOrderRaw = String(formData.get("ledgerOrder") ?? "").trim();
|
||||
const ledgerPageNum =
|
||||
ledgerPageRaw === "" ? NaN : Number.parseInt(ledgerPageRaw, 10);
|
||||
|
||||
const base = {
|
||||
tab,
|
||||
highlightId,
|
||||
participantRaw: participant,
|
||||
...(tab === "ledger"
|
||||
? {
|
||||
ledgerFrom: ledgerFromRaw || null,
|
||||
ledgerTo: ledgerToRaw || null,
|
||||
ledgerPage:
|
||||
Number.isInteger(ledgerPageNum) && ledgerPageNum > 1
|
||||
? ledgerPageNum
|
||||
: null,
|
||||
ledgerSort: ledgerSortRaw || null,
|
||||
ledgerOrder:
|
||||
ledgerOrderRaw === "desc"
|
||||
? ("desc" as const)
|
||||
: ledgerOrderRaw === "asc"
|
||||
? ("asc" as const)
|
||||
: null,
|
||||
ledgerPageSize: normalizeLedgerPageSize(
|
||||
ledgerPageSizeRaw === "" ? null : ledgerPageSizeRaw,
|
||||
),
|
||||
}
|
||||
: {}),
|
||||
};
|
||||
|
||||
if (!Number.isInteger(userId) || userId < 1) {
|
||||
redirect(buildDashboardHref(base));
|
||||
|
||||
+105
-8
@@ -2,6 +2,15 @@ import { AdminDashboard } from "@/components/admin-dashboard";
|
||||
import { AdminHeader } from "@/components/admin-header";
|
||||
import { EditUserCcRcOverlay } from "@/components/edit-user-cc-rc-overlay";
|
||||
import { loadDashboardStatsBundle } from "@/lib/dashboard-stats";
|
||||
import {
|
||||
normalizeLedgerDateRange,
|
||||
utcLast30DaysDateRange,
|
||||
} from "@/lib/ledger-utc-date-range";
|
||||
import { fetchLedgerGlobalSummary } from "@/lib/ledger-global-summary-server";
|
||||
import {
|
||||
serializeLedgerGlobalSummary,
|
||||
type SerializedLedgerGlobalSummary,
|
||||
} from "@/lib/ledger-integrity";
|
||||
import { createAdminSupabase } from "@/lib/supabase/admin";
|
||||
import type { AdminDashboardTab } from "@/lib/dashboard-search-url";
|
||||
import {
|
||||
@@ -10,6 +19,16 @@ import {
|
||||
} from "@/lib/matchmaker-log-source";
|
||||
import { readMatchmakerLogFile } from "@/lib/matchmaker-logs-server";
|
||||
import type { DbMatch, DbTransaction, DbUser } from "@/types/database";
|
||||
import {
|
||||
normalizeLedgerPage,
|
||||
normalizeLedgerPageSize,
|
||||
normalizeLedgerSortKey,
|
||||
normalizeLedgerSortOrder,
|
||||
sliceLedgerPage,
|
||||
sortLedgerTransactions,
|
||||
type LedgerSortKey,
|
||||
type LedgerSortOrder,
|
||||
} from "@/lib/ledger-table-view";
|
||||
|
||||
export const dynamic = "force-dynamic";
|
||||
|
||||
@@ -31,6 +50,12 @@ export default async function Home({
|
||||
edit?: string | string[];
|
||||
saveError?: string | string[];
|
||||
mklog?: string | string[];
|
||||
lfrom?: string | string[];
|
||||
lto?: string | string[];
|
||||
lpage?: string | string[];
|
||||
lsize?: string | string[];
|
||||
lsort?: string | string[];
|
||||
lorder?: string | string[];
|
||||
}>;
|
||||
}) {
|
||||
const sp = await searchParams;
|
||||
@@ -58,8 +83,18 @@ export default async function Home({
|
||||
let configError: string | null = null;
|
||||
let usersError: string | null = null;
|
||||
let matchesError: string | null = null;
|
||||
let transactions: DbTransaction[] = [];
|
||||
let transactionsError: string | null = null;
|
||||
let ledgerGlobalSummary: SerializedLedgerGlobalSummary | null = null;
|
||||
let ledgerTransactionsFiltered: DbTransaction[] = [];
|
||||
let ledgerTableRows: DbTransaction[] = [];
|
||||
let ledgerTotalRowsInRange = 0;
|
||||
let ledgerPageView = 1;
|
||||
let ledgerPageSizeView = normalizeLedgerPageSize(null);
|
||||
let ledgerTotalPagesView = 1;
|
||||
let ledgerSortKeyView: LedgerSortKey = "created_at";
|
||||
let ledgerSortOrderView: LedgerSortOrder = "desc";
|
||||
let ledgerFrom = utcLast30DaysDateRange().from;
|
||||
let ledgerTo = utcLast30DaysDateRange().to;
|
||||
let statsBundle: Awaited<ReturnType<typeof loadDashboardStatsBundle>> | null =
|
||||
null;
|
||||
|
||||
@@ -108,15 +143,61 @@ export default async function Home({
|
||||
statsBundle = await loadDashboardStatsBundle(supabase);
|
||||
|
||||
if (tab === "ledger") {
|
||||
const txRes = await supabase
|
||||
const lfromRaw = firstSearchParam(sp.lfrom);
|
||||
const ltoRaw = firstSearchParam(sp.lto);
|
||||
const range = normalizeLedgerDateRange(lfromRaw, ltoRaw);
|
||||
ledgerFrom = range.from;
|
||||
ledgerTo = range.to;
|
||||
const rangeStartIso = `${ledgerFrom}T00:00:00.000Z`;
|
||||
const rangeEndIso = `${ledgerTo}T23:59:59.999Z`;
|
||||
|
||||
const filteredQuery = supabase
|
||||
.from("transactions")
|
||||
.select("id, created_at, from, to, amount, remarks, match_id")
|
||||
.order("id", { ascending: false })
|
||||
.limit(5000);
|
||||
if (txRes.error) {
|
||||
transactionsError = txRes.error.message;
|
||||
.gte("created_at", rangeStartIso)
|
||||
.lte("created_at", rangeEndIso)
|
||||
.order("created_at", { ascending: true })
|
||||
.order("id", { ascending: true })
|
||||
.limit(10000);
|
||||
|
||||
const [globalRes, filteredRes] = await Promise.all([
|
||||
fetchLedgerGlobalSummary(supabase),
|
||||
filteredQuery,
|
||||
]);
|
||||
|
||||
if (!globalRes.ok) {
|
||||
transactionsError = globalRes.message;
|
||||
} else {
|
||||
transactions = (txRes.data ?? []) as DbTransaction[];
|
||||
ledgerGlobalSummary = serializeLedgerGlobalSummary(globalRes.data);
|
||||
}
|
||||
if (filteredRes.error) {
|
||||
if (!transactionsError) {
|
||||
transactionsError = filteredRes.error.message;
|
||||
}
|
||||
} else {
|
||||
ledgerTransactionsFiltered = (filteredRes.data ??
|
||||
[]) as DbTransaction[];
|
||||
const pageRaw = normalizeLedgerPage(firstSearchParam(sp.lpage));
|
||||
ledgerPageSizeView = normalizeLedgerPageSize(
|
||||
firstSearchParam(sp.lsize),
|
||||
);
|
||||
ledgerSortKeyView = normalizeLedgerSortKey(
|
||||
firstSearchParam(sp.lsort),
|
||||
);
|
||||
ledgerSortOrderView = normalizeLedgerSortOrder(
|
||||
firstSearchParam(sp.lorder),
|
||||
ledgerSortKeyView,
|
||||
);
|
||||
const sorted = sortLedgerTransactions(
|
||||
ledgerTransactionsFiltered,
|
||||
ledgerSortKeyView,
|
||||
ledgerSortOrderView,
|
||||
);
|
||||
const slice = sliceLedgerPage(sorted, pageRaw, ledgerPageSizeView);
|
||||
ledgerTableRows = slice.rows;
|
||||
ledgerTotalRowsInRange = slice.totalRows;
|
||||
ledgerPageView = slice.page;
|
||||
ledgerTotalPagesView = slice.totalPages;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -145,7 +226,6 @@ export default async function Home({
|
||||
matches={matches}
|
||||
usersError={usersError}
|
||||
matchesError={matchesError}
|
||||
transactions={transactions}
|
||||
transactionsError={transactionsError}
|
||||
statsBundle={statsBundle}
|
||||
tab={tab}
|
||||
@@ -154,6 +234,17 @@ export default async function Home({
|
||||
matchmakerSource={matchmakerSource}
|
||||
matchmakerContent={matchmakerContent}
|
||||
matchmakerError={matchmakerError}
|
||||
ledgerGlobalSummary={ledgerGlobalSummary}
|
||||
ledgerTransactionsFiltered={ledgerTransactionsFiltered}
|
||||
ledgerTableRows={ledgerTableRows}
|
||||
ledgerTotalRowsInRange={ledgerTotalRowsInRange}
|
||||
ledgerPage={ledgerPageView}
|
||||
ledgerPageSize={ledgerPageSizeView}
|
||||
ledgerTotalPages={ledgerTotalPagesView}
|
||||
ledgerSort={ledgerSortKeyView}
|
||||
ledgerOrder={ledgerSortOrderView}
|
||||
ledgerFrom={ledgerFrom}
|
||||
ledgerTo={ledgerTo}
|
||||
/>
|
||||
{editUser ? (
|
||||
<EditUserCcRcOverlay
|
||||
@@ -162,6 +253,12 @@ export default async function Home({
|
||||
highlightId={highlightId}
|
||||
participantRaw={participantRaw}
|
||||
saveError={saveError}
|
||||
ledgerFrom={ledgerFrom}
|
||||
ledgerTo={ledgerTo}
|
||||
ledgerPage={ledgerPageView}
|
||||
ledgerPageSize={ledgerPageSizeView}
|
||||
ledgerSort={ledgerSortKeyView}
|
||||
ledgerOrder={ledgerSortOrderView}
|
||||
/>
|
||||
) : null}
|
||||
</>
|
||||
|
||||
Reference in New Issue
Block a user