feat(dashboard): browse every client system info report, per account and across accounts

The account page lists the account's reports as a table and the Client System Info page lists every report (or each account's newest), sortable and searchable by account name or video card; a row opens every field. Values that say little about the real system are marked, and every caveat is a tooltip on the value and column.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Aaron Kimbrell
2026-09-30 08:06:02 -05:00
parent bd13297947
commit d94d84b5cb
16 changed files with 363 additions and 40 deletions

View File

@@ -1485,6 +1485,33 @@ TEST_F(ParitySeeded, Moderation) {
}
return out;
});
Both("ListClientSysInfo", [](GameDatabase& db) {
json out = json::array();
const auto list = [&db, &out](const IClientSysInfo::SysInfoQuery& q) {
json rows = json::array();
for (const auto& r : db.ListClientSysInfo(q)) rows.push_back({ r.accountId, r.accountName, r.buildNumber, r.logins });
out.push_back({ rows, db.CountClientSysInfo(q) });
};
IClientSysInfo::SysInfoQuery q;
list(q);
q.latestOnly = true;
list(q);
q = {};
q.accountId = 1;
q.order = IClientSysInfo::eSysInfoOrder::OS_VERSION;
q.ascending = true;
list(q);
q = {};
q.search = "Card";
q.order = IClientSysInfo::eSysInfoOrder::ACCOUNT;
q.limit = 2;
q.offset = 1;
list(q);
q = {};
q.search = "no such card";
list(q);
return out;
});
Both("PruneLog client sysinfo", [](GameDatabase& db) { return db.PruneLog(IDashboardAdmin::eLog::CLIENT_SYSINFO, 1700000150); });
Both("InsertModerationDecision", [](GameDatabase& db) {
db.InsertModerationDecision("name", CHAR_ALICE2, "AliceRenamed", false, "Not allowed", 1700000000);