17 lines
1.6 KiB
JavaScript
17 lines
1.6 KiB
JavaScript
const { Client } = require('pg');
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
require('dotenv').config({ path: '/root/miaojingAI/.env.local' });
|
|
const root='/root/miaojingAI';
|
|
const c = new Client({ connectionString: process.env.LOCAL_DB_URL });
|
|
function walk(dir){ if(!fs.existsSync(dir)) return 0; let n=0; for(const e of fs.readdirSync(dir,{withFileTypes:true})){ const p=path.join(dir,e.name); n += e.isDirectory()?walk(p):1; } return n; }
|
|
(async()=>{ await c.connect(); const checks={};
|
|
checks.admin=(await c.query(`select p.id,p.email,p.role,p.membership_tier,p.is_active,u.password_hash is not null as has_password_hash from profiles p join auth.users u on u.id=p.id where p.email='admin@example.com'`)).rows;
|
|
checks.orphanWorks=(await c.query(`select count(*)::int as n from works w left join profiles p on p.id=w.user_id where p.id is null`)).rows[0].n;
|
|
checks.orphanCredits=(await c.query(`select count(*)::int as n from credit_transactions ct left join profiles p on p.id=ct.user_id where p.id is null`)).rows[0].n;
|
|
checks.orphanApiKeys=(await c.query(`select count(*)::int as n from user_api_keys k left join profiles p on p.id=k.user_id where p.id is null`)).rows[0].n;
|
|
checks.publicWorks=(await c.query(`select count(*)::int as n, count(*) filter (where result_url like '/api/local-storage/gallery/%')::int as gallery_url_count from works where is_public=true`)).rows[0];
|
|
checks.galleryFiles=walk(path.join(root,'local-storage','gallery'));
|
|
checks.localFiles=walk(path.join(root,'local-storage'));
|
|
console.log(JSON.stringify(checks,null,2)); await c.end(); })().catch(e=>{console.error(e);process.exit(1)});
|