Files
infohliadka/lib/db/seed.ts
Lukas Davidovic 860070a302 migrate from SQLite to PostgreSQL with Drizzle ORM
- Updated all packages to latest versions (React 19, Next.js 14.2.32)
- Replaced sqlite3 with pg and drizzle-orm dependencies
- Created complete PostgreSQL schema with relationships and indexes
- Migrated all API endpoints from SQLite to Drizzle queries
- Added database seeding with sample data
- Updated authentication to use bcrypt instead of pbkdf2
- Configured connection pooling for PostgreSQL
- Updated app version to 1.0.0
- All endpoints tested and working correctly
2025-09-06 12:56:33 +02:00

98 lines
3.6 KiB
TypeScript

import { db } from './connection';
import { users, categories, sources, apiKeys, sourceCategories } from './schema';
import * as bcrypt from 'bcryptjs';
export async function seedDatabase() {
try {
console.log('🌱 Seeding database...');
// Insert categories one by one
const categoryData = [
{ name: 'Hoax', slug: 'hoax', description: 'Šírenie nepravdivých informácií a hoaxov', color: '#EF4444', priority: 5, icon: 'AlertTriangle' },
{ name: 'Hate Speech', slug: 'hate-speech', description: 'Nenávistné prejavy proti skupinám ľudí', color: '#DC2626', priority: 5, icon: 'MessageSquareX' },
{ name: 'Violence', slug: 'violence', description: 'Povzbudzovanie k násiliu', color: '#B91C1C', priority: 5, icon: 'Sword' },
{ name: 'Conspiracy', slug: 'conspiracy', description: 'Konšpiračné teórie', color: '#F59E0B', priority: 3, icon: 'Eye' },
{ name: 'Propaganda', slug: 'propaganda', description: 'Politická propaganda a manipulácia', color: '#D97706', priority: 2, icon: 'Megaphone' }
];
const insertedCategories = [];
for (const cat of categoryData) {
const result = await db.insert(categories).values(cat).returning();
insertedCategories.push(result[0]);
console.log(`✅ Inserted category: ${cat.name}`);
}
// Insert admin user
const hashedPassword = await bcrypt.hash('admin123', 12);
const insertedUsers = await db.insert(users).values({
email: 'admin@antihoax.sk',
passwordHash: hashedPassword,
name: 'System Admin',
role: 'admin'
}).returning();
console.log(`✅ Inserted user: ${insertedUsers[0].name}`);
// Insert example sources
const sourceData = [
{
url: 'https://example-hoax-site.com',
domain: 'example-hoax-site.com',
title: 'Example Hoax Site',
description: 'Príklad hoax stránky pre testovanie',
type: 'website' as const,
status: 'verified' as const,
riskLevel: 5,
language: 'sk' as const,
reportedBy: 'test@example.com',
verifiedBy: insertedUsers[0].id,
followerCount: 1500,
metadata: JSON.stringify({ tags: ['test', 'example'] })
},
{
url: 'https://example-conspiracy.com',
domain: 'example-conspiracy.com',
title: 'Conspiracy Theory Site',
description: 'Stránka šíriaca konšpiračné teórie',
type: 'blog' as const,
status: 'verified' as const,
riskLevel: 3,
language: 'sk' as const,
reportedBy: 'reporter@example.com',
verifiedBy: insertedUsers[0].id,
followerCount: 850,
metadata: JSON.stringify({ tags: ['conspiracy', 'politics'] })
}
];
const insertedSources = [];
for (const src of sourceData) {
const result = await db.insert(sources).values(src).returning();
insertedSources.push(result[0]);
console.log(`✅ Inserted source: ${src.title}`);
}
// Link sources with categories
await db.insert(sourceCategories).values({
sourceId: insertedSources[0].id,
categoryId: insertedCategories[0].id, // Hoax
confidenceScore: '1.0',
addedBy: insertedUsers[0].id
});
await db.insert(sourceCategories).values({
sourceId: insertedSources[1].id,
categoryId: insertedCategories[3].id, // Conspiracy
confidenceScore: '0.9',
addedBy: insertedUsers[0].id
});
console.log(`✅ Linked sources with categories`);
console.log('🎉 Database seeded successfully!');
console.log('📧 Admin login: admin@antihoax.sk / admin123');
} catch (error) {
console.error('❌ Error seeding database:', error);
throw error;
}
}