- 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
98 lines
3.6 KiB
TypeScript
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;
|
|
}
|
|
} |