diff --git a/src/lib/prisma.ts b/src/lib/prisma.ts new file mode 100644 index 0000000..6d8cdaa --- /dev/null +++ b/src/lib/prisma.ts @@ -0,0 +1,102 @@ +import { PrismaClient, Prisma } from '../generated/prisma'; + +// Global variable to store the Prisma client instance +const globalForPrisma = globalThis as unknown as { + prisma: PrismaClient | undefined; +}; + +// Create Prisma client with logging +export const prisma = globalForPrisma.prisma ?? new PrismaClient({ + log: process.env.NODE_ENV === 'development' + ? ['query', 'error', 'warn'] + : ['error'], +}); + +// Prevent multiple instances in development +if (process.env.NODE_ENV !== 'production') { + globalForPrisma.prisma = prisma; +} + +// Database initialization function +export async function initializeDatabase() { + try { + console.log('[DB] Initializing database connection...'); + + // Test connection + await prisma.$connect(); + console.log('[DB] Database connection established'); + + // Ensure core properties exist (name, description) + await prisma.property.upsert({ + where: { name: 'name' }, + update: {}, + create: { name: 'name', globalUsageCount: 0 } + }); + + await prisma.property.upsert({ + where: { name: 'description' }, + update: {}, + create: { name: 'description', globalUsageCount: 0 } + }); + + console.log('[DB] Core properties initialized'); + return true; + } catch (error) { + console.error('[DB] Failed to initialize database:', error); + return false; + } +} + +// Graceful shutdown +export async function disconnectDatabase() { + try { + await prisma.$disconnect(); + console.log('[DB] Database connection closed'); + } catch (error) { + console.error('[DB] Error closing database connection:', error); + } +} + +// Helper function for transactions +export async function withTransaction( + callback: (tx: Prisma.TransactionClient) => Promise +): Promise { + return await prisma.$transaction(async (tx) => { + console.log('[DB] Transaction started'); + try { + const result = await callback(tx); + console.log('[DB] Transaction completed successfully'); + return result; + } catch (error) { + console.log('[DB] Transaction failed:', error); + throw error; + } + }); +} + +// Debug function +export async function debugDump() { + if (process.env.NODE_ENV !== 'development') return; + + console.log('[DATABASE DEBUG] URLs:'); + const urls = await prisma.url.findMany(); + urls.forEach(url => { + console.log(`[DATABASE DEBUG] ID: ${url.id}, URL: ${url.url}`); + }); + + console.log('[DATABASE DEBUG] Items:'); + const items = await prisma.item.findMany({ + include: { + itemProperties: { + include: { property: true } + } + } + }); + + items.forEach(item => { + const nameProperty = item.itemProperties.find(ip => ip.property.name === 'name'); + console.log(`[DATABASE DEBUG] ID: ${item.id}, Name: '${nameProperty?.value || 'Unknown'}'`); + }); +} + +export default prisma; \ No newline at end of file