58 lines
2.2 KiB
JavaScript
58 lines
2.2 KiB
JavaScript
const { Pool } = require('pg');
|
|
require('dotenv').config({ path: '.env.local' });
|
|
|
|
const SYSTEM_USER_ID = '00000000-0000-0000-0000-000000000000';
|
|
|
|
(async () => {
|
|
const pool = new Pool({ connectionString: process.env.LOCAL_DB_URL });
|
|
const client = await pool.connect();
|
|
try {
|
|
const summary = await client.query(`
|
|
SELECT
|
|
(SELECT COUNT(*)::int FROM profiles) AS profiles,
|
|
(SELECT COUNT(*)::int FROM auth.users) AS auth_users,
|
|
(SELECT COUNT(*)::int FROM auth.users WHERE password_hash IS NULL OR password_hash = '') AS auth_without_password_hash,
|
|
(SELECT COUNT(*)::int FROM works) AS works_total,
|
|
(SELECT COUNT(*)::int FROM works WHERE status = 'completed' AND is_public = true) AS public_works,
|
|
(SELECT COUNT(*)::int FROM works w LEFT JOIN profiles p ON p.id = w.user_id WHERE w.status = 'completed' AND w.is_public = true AND p.id IS NULL) AS public_missing_profile,
|
|
(SELECT COUNT(*)::int FROM works WHERE status = 'completed' AND is_public = true AND user_id = $1) AS public_system_user
|
|
`, [SYSTEM_USER_ID]);
|
|
|
|
const byUser = await client.query(`
|
|
SELECT
|
|
COALESCE(p.email, '[missing-profile]') AS email,
|
|
COALESCE(p.nickname, '') AS nickname,
|
|
w.user_id,
|
|
COUNT(*)::int AS works,
|
|
COUNT(*) FILTER (WHERE w.is_public = true AND w.status = 'completed')::int AS public_works,
|
|
COUNT(*) FILTER (WHERE w.is_public = false AND w.status = 'completed')::int AS history_works
|
|
FROM works w
|
|
LEFT JOIN profiles p ON p.id = w.user_id
|
|
WHERE w.status = 'completed'
|
|
GROUP BY w.user_id, p.email, p.nickname
|
|
ORDER BY works DESC
|
|
`);
|
|
|
|
const noHashUsers = await client.query(`
|
|
SELECT p.email, p.nickname, p.role, p.created_at
|
|
FROM auth.users u
|
|
JOIN profiles p ON p.id = u.id
|
|
WHERE u.password_hash IS NULL OR u.password_hash = ''
|
|
ORDER BY p.created_at DESC
|
|
LIMIT 20
|
|
`);
|
|
|
|
console.log(JSON.stringify({
|
|
summary: summary.rows[0],
|
|
byUser: byUser.rows,
|
|
noHashUsers: noHashUsers.rows,
|
|
}, null, 2));
|
|
} finally {
|
|
client.release();
|
|
await pool.end();
|
|
}
|
|
})().catch(error => {
|
|
console.error(error);
|
|
process.exit(1);
|
|
});
|