112 lines
3.6 KiB
JavaScript
112 lines
3.6 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 byModelOwner = await client.query(`
|
|
SELECT
|
|
COALESCE(w.params->>'model', '') AS model,
|
|
COALESCE(p.email, '[missing-profile]') AS email,
|
|
COALESCE(p.nickname, '') AS nickname,
|
|
w.user_id,
|
|
COUNT(*)::int AS count,
|
|
COUNT(*) FILTER (WHERE w.is_public = true)::int AS public_count,
|
|
COUNT(*) FILTER (WHERE w.is_public = false)::int AS private_count,
|
|
MIN(w.created_at) AS first_at,
|
|
MAX(w.created_at) AS last_at
|
|
FROM works w
|
|
LEFT JOIN profiles p ON p.id = w.user_id
|
|
WHERE w.status = 'completed'
|
|
GROUP BY model, w.user_id, p.email, p.nickname
|
|
ORDER BY model, count DESC
|
|
`);
|
|
|
|
const orphanModelTotals = await client.query(`
|
|
SELECT params->>'model' AS model, COUNT(*)::int AS count
|
|
FROM works
|
|
WHERE status = 'completed'
|
|
AND is_public = true
|
|
AND user_id = $1
|
|
GROUP BY params->>'model'
|
|
ORDER BY count DESC
|
|
`, [SYSTEM_USER_ID]);
|
|
|
|
const ownersByPrompt = await client.query(`
|
|
WITH orphan AS (
|
|
SELECT id, prompt, created_at
|
|
FROM works
|
|
WHERE status = 'completed'
|
|
AND is_public = true
|
|
AND user_id = $1
|
|
AND COALESCE(prompt, '') <> ''
|
|
),
|
|
owned AS (
|
|
SELECT w.id, w.user_id, p.email, p.nickname, w.prompt, w.created_at
|
|
FROM works w
|
|
JOIN profiles p ON p.id = w.user_id
|
|
WHERE w.status = 'completed'
|
|
AND w.user_id <> $1
|
|
AND COALESCE(w.prompt, '') <> ''
|
|
)
|
|
SELECT
|
|
orphan.id AS orphan_id,
|
|
owned.user_id,
|
|
owned.email,
|
|
owned.nickname,
|
|
COUNT(*)::int AS matches,
|
|
MIN(ABS(EXTRACT(EPOCH FROM (owned.created_at - orphan.created_at))))::int AS best_seconds_apart
|
|
FROM orphan
|
|
JOIN owned ON owned.prompt = orphan.prompt
|
|
GROUP BY orphan.id, owned.user_id, owned.email, owned.nickname
|
|
ORDER BY matches DESC, best_seconds_apart
|
|
LIMIT 120
|
|
`, [SYSTEM_USER_ID]);
|
|
|
|
const maybeAdminByDates = await client.query(`
|
|
SELECT
|
|
w.id,
|
|
w.created_at,
|
|
w.params->>'model' AS model,
|
|
LEFT(w.prompt, 100) AS prompt,
|
|
(
|
|
SELECT json_agg(json_build_object(
|
|
'user_id', nearby.user_id,
|
|
'email', p.email,
|
|
'nickname', p.nickname,
|
|
'seconds_apart', ABS(EXTRACT(EPOCH FROM (nearby.created_at - w.created_at)))::int,
|
|
'prompt', LEFT(nearby.prompt, 80)
|
|
) ORDER BY ABS(EXTRACT(EPOCH FROM (nearby.created_at - w.created_at))))
|
|
FROM works nearby
|
|
JOIN profiles p ON p.id = nearby.user_id
|
|
WHERE nearby.user_id <> $1
|
|
AND nearby.status = 'completed'
|
|
AND nearby.created_at BETWEEN w.created_at - INTERVAL '1 hour' AND w.created_at + INTERVAL '1 hour'
|
|
LIMIT 8
|
|
) AS nearby_owned
|
|
FROM works w
|
|
WHERE w.status = 'completed'
|
|
AND w.is_public = true
|
|
AND w.user_id = $1
|
|
ORDER BY w.created_at DESC
|
|
LIMIT 80
|
|
`, [SYSTEM_USER_ID]);
|
|
|
|
console.log(JSON.stringify({
|
|
orphanModelTotals: orphanModelTotals.rows,
|
|
byModelOwner: byModelOwner.rows,
|
|
ownersByPrompt: ownersByPrompt.rows,
|
|
nearbyOwnedByTime: maybeAdminByDates.rows,
|
|
}, null, 2));
|
|
} finally {
|
|
client.release();
|
|
await pool.end();
|
|
}
|
|
})().catch(error => {
|
|
console.error(error);
|
|
process.exit(1);
|
|
});
|