74 lines
2.2 KiB
JavaScript
74 lines
2.2 KiB
JavaScript
const fs = require('fs');
|
|
const path = require('path');
|
|
const { Pool } = require('pg');
|
|
require('dotenv').config({ path: '.env.local' });
|
|
|
|
function collectLocalStorageKeys(value, keys = new Set()) {
|
|
if (typeof value === 'string') {
|
|
const marker = '/api/local-storage/';
|
|
const index = value.indexOf(marker);
|
|
if (index >= 0) {
|
|
keys.add(decodeURIComponent(value.slice(index + marker.length).split('?')[0]));
|
|
}
|
|
return keys;
|
|
}
|
|
if (Array.isArray(value)) {
|
|
value.forEach(item => collectLocalStorageKeys(item, keys));
|
|
return keys;
|
|
}
|
|
if (value && typeof value === 'object') {
|
|
Object.values(value).forEach(item => collectLocalStorageKeys(item, keys));
|
|
}
|
|
return keys;
|
|
}
|
|
|
|
(async () => {
|
|
const pool = new Pool({ connectionString: process.env.LOCAL_DB_URL });
|
|
const client = await pool.connect();
|
|
try {
|
|
const works = await client.query(
|
|
`SELECT id, result_url, thumbnail_url, params
|
|
FROM works
|
|
WHERE title LIKE 'codex-import-edge-%' OR prompt LIKE 'codex-import-edge-%'`,
|
|
);
|
|
const keys = new Set();
|
|
for (const row of works.rows) {
|
|
collectLocalStorageKeys(row.result_url, keys);
|
|
collectLocalStorageKeys(row.thumbnail_url, keys);
|
|
collectLocalStorageKeys(row.params, keys);
|
|
}
|
|
|
|
const deletedWorks = await client.query(
|
|
`DELETE FROM works
|
|
WHERE title LIKE 'codex-import-edge-%' OR prompt LIKE 'codex-import-edge-%'`,
|
|
);
|
|
const deletedAnnouncements = await client.query(
|
|
`DELETE FROM announcements
|
|
WHERE title LIKE 'codex-import-edge-%'`,
|
|
);
|
|
|
|
let deletedFiles = 0;
|
|
const base = path.join(process.cwd(), 'local-storage');
|
|
for (const key of keys) {
|
|
const filePath = path.normalize(path.join(base, key));
|
|
if (!filePath.startsWith(base)) continue;
|
|
if (fs.existsSync(filePath)) {
|
|
fs.unlinkSync(filePath);
|
|
deletedFiles += 1;
|
|
}
|
|
}
|
|
|
|
console.log(JSON.stringify({
|
|
deletedWorks: deletedWorks.rowCount || 0,
|
|
deletedAnnouncements: deletedAnnouncements.rowCount || 0,
|
|
deletedFiles,
|
|
}, null, 2));
|
|
} finally {
|
|
client.release();
|
|
await pool.end();
|
|
}
|
|
})().catch((error) => {
|
|
console.error(error);
|
|
process.exit(1);
|
|
});
|