feat: Add stale process monitor, users route, landing page, archive old scripts

- Add backend stale process monitoring API (/api/stale-processes)
- Add users management route
- Add frontend landing page and stale process monitor UI on /scraper-tools
- Move old development scripts to backend/archive/
- Update frontend build with new features

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Kelly
2025-12-05 04:07:31 -07:00
parent d2d44d2aeb
commit d91c55a344
3115 changed files with 5755 additions and 719 deletions

View File

@@ -0,0 +1,52 @@
import { pool } from './src/db/migrate.js';
async function main() {
try {
// Count total products and unique brands
const stats = await pool.query(`
SELECT
COUNT(*) as total_products,
COUNT(DISTINCT brand) as unique_brands
FROM products
WHERE dispensary_id = 149
`);
console.log('Stats:', stats.rows[0]);
// Get sample products to verify brand extraction
const samples = await pool.query(`
SELECT brand, name, variant, dutchie_url
FROM products
WHERE dispensary_id = 149
ORDER BY RANDOM()
LIMIT 10
`);
console.log('\nSample products:');
samples.rows.forEach(row => {
console.log(`Brand: "${row.brand}" | Name: "${row.name}" | Variant: "${row.variant}"`);
});
// Get brand distribution
const brands = await pool.query(`
SELECT brand, COUNT(*) as count
FROM products
WHERE dispensary_id = 149
GROUP BY brand
ORDER BY count DESC
LIMIT 15
`);
console.log('\nTop brands:');
brands.rows.forEach(row => {
console.log(`${row.brand}: ${row.count} products`);
});
} catch (error: any) {
console.error('Error:', error.message);
} finally {
await pool.end();
}
}
main().catch(console.error);