ci: probe permission page database reads
This commit is contained in:
1 parent
a11575bae3
commit
75b85dcdd9
2 files changed
+107
No files matched your search
@@ -23,6 +23,10 @@ jobs:
|
||||
| grep -Ei 'error|permissions|permission_ranks|permission_definitions|unknown column|doesn.t exist|digest' \
|
||||
| tail -120 \
|
||||
|| true
|
||||
echo "--- Permission page database probe ---"
|
||||
cd /var/www/atom-nexst
|
||||
pnpm tsx scripts/diagnose-permission-page.ts
|
||||
|
||||
|
||||
check:
|
||||
if: startsWith(gitea.ref_name, 'v') == false
|
||||
|
||||
@@ -0,0 +1,103 @@
|
||||
import "./load-env";
|
||||
import mysql, { type RowDataPacket } from "mysql2/promise";
|
||||
import { mysqlConnectionUrl } from "./db-url";
|
||||
|
||||
type DbError = Error & { code?: string };
|
||||
|
||||
const databaseUrl = process.env.DATABASE_URL;
|
||||
if (!databaseUrl) throw new Error("DATABASE_URL is required");
|
||||
|
||||
const connection = await mysql.createConnection(
|
||||
mysqlConnectionUrl(databaseUrl),
|
||||
);
|
||||
let failed = false;
|
||||
|
||||
async function probe(
|
||||
name: string,
|
||||
statement: string,
|
||||
values: Array<string | number> = [],
|
||||
): Promise<RowDataPacket[] | null> {
|
||||
try {
|
||||
const [rows] = await connection.execute<RowDataPacket[]>(statement, values);
|
||||
console.log(`[permissions-diag] ${name}: ok (${rows.length} rows)`);
|
||||
return rows;
|
||||
} catch (error) {
|
||||
failed = true;
|
||||
const dbError = error as DbError;
|
||||
console.error(
|
||||
`[permissions-diag] ${name}: failed code=${dbError.code ?? "unknown"} message=${dbError.message}`,
|
||||
);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
const rankRows = await probe(
|
||||
"select rank id",
|
||||
"SELECT id FROM permission_ranks ORDER BY id DESC LIMIT 1",
|
||||
);
|
||||
const rankId = Number(rankRows?.[0]?.id ?? 11);
|
||||
console.log(`[permissions-diag] probing rank id ${rankId}`);
|
||||
|
||||
await probe(
|
||||
"rank detail",
|
||||
`SELECT id, rank_name, badge, level, prefix, prefix_color, hidden_rank,
|
||||
log_commands, room_effect, auto_credits_amount, auto_pixels_amount,
|
||||
auto_gotw_amount, auto_points_amount
|
||||
FROM permission_ranks WHERE id = ?`,
|
||||
[rankId],
|
||||
);
|
||||
|
||||
const definitionColumns = await probe(
|
||||
"permission_definitions columns",
|
||||
`SELECT column_name FROM information_schema.columns
|
||||
WHERE table_schema = DATABASE() AND table_name = 'permission_definitions'`,
|
||||
);
|
||||
const rankColumn = `rank_${rankId}`;
|
||||
if (definitionColumns?.some((row) => row.column_name === rankColumn)) {
|
||||
await probe(
|
||||
"normalized permissions",
|
||||
`SELECT permission_key, max_value, \`${rankColumn}\` AS value
|
||||
FROM permission_definitions ORDER BY permission_key ASC`,
|
||||
);
|
||||
} else {
|
||||
await probe(
|
||||
"legacy permissions",
|
||||
"SELECT * FROM permissions WHERE id = ? LIMIT 1",
|
||||
[rankId],
|
||||
);
|
||||
}
|
||||
|
||||
await probe(
|
||||
"rank users",
|
||||
"SELECT id, username, look FROM users WHERE rank = ? ORDER BY username LIMIT 200",
|
||||
[rankId],
|
||||
);
|
||||
await probe(
|
||||
"rank user count",
|
||||
"SELECT COUNT(*) AS total FROM users WHERE rank = ?",
|
||||
[rankId],
|
||||
);
|
||||
await probe(
|
||||
"CMS permissions",
|
||||
"SELECT id, slug, title FROM acl_permissions ORDER BY slug",
|
||||
);
|
||||
const roles = await probe(
|
||||
"CMS role",
|
||||
"SELECT id FROM acl_roles WHERE slug = ? LIMIT 1",
|
||||
[`rank_${rankId}`],
|
||||
);
|
||||
if (roles?.[0]?.id) {
|
||||
await probe(
|
||||
"CMS role permissions",
|
||||
`SELECT p.slug FROM acl_model_permissions mp
|
||||
INNER JOIN acl_permissions p ON mp.permission_id = p.id
|
||||
WHERE mp.model_id = ?`,
|
||||
[roles[0].id],
|
||||
);
|
||||
}
|
||||
} finally {
|
||||
await connection.end();
|
||||
}
|
||||
|
||||
if (failed) process.exitCode = 1;
|
||||
Reference in new issue
Block a user