import { Module, Global } from '@nestjs/common'; import { PGlite } from '@electric-sql/pglite'; import { drizzle, PgliteDatabase } from 'drizzle-orm/pglite'; import * as schema from './schema'; import { join } from 'path'; import { existsSync, mkdirSync } from 'fs'; import { sql } from 'drizzle-orm'; export const DATABASE_CONNECTION = 'DATABASE_CONNECTION'; const databaseProvider = { provide: DATABASE_CONNECTION, useFactory: async (): Promise> => { const dbPath = process.env.DATABASE_PATH || './data/events.db'; // Убедимся, что директория существует const dbDir = dbPath.substring(0, dbPath.lastIndexOf('/')); if (dbDir && !existsSync(dbDir)) { mkdirSync(dbDir, { recursive: true }); } const client = new PGlite(dbPath); const db = drizzle(client, { schema }); // Создаем таблицы напрямую вместо использования миграций try { await client.exec(` CREATE TABLE IF NOT EXISTS events ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), title TEXT NOT NULL, emoji TEXT NOT NULL, month INTEGER NOT NULL, day INTEGER NOT NULL, start_year INTEGER, end_month INTEGER, end_day INTEGER, end_year INTEGER, description TEXT, color TEXT, is_active BOOLEAN NOT NULL DEFAULT true, tags TEXT[], created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(), updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW() ); CREATE TABLE IF NOT EXISTS wishlist_categories ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name TEXT NOT NULL UNIQUE, slug TEXT NOT NULL UNIQUE, min_price INTEGER NOT NULL DEFAULT 0, max_price INTEGER, color TEXT, icon TEXT, "order" INTEGER NOT NULL DEFAULT 0, created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(), updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW() ); CREATE TABLE IF NOT EXISTS wishlist_items ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), title TEXT NOT NULL, description TEXT, price INTEGER NOT NULL, currency TEXT NOT NULL DEFAULT 'RUB', link TEXT, images TEXT[] NOT NULL DEFAULT ARRAY[]::TEXT[], category_id UUID NOT NULL REFERENCES wishlist_categories(id) ON DELETE RESTRICT, created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(), updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW() ); `); console.log('✅ Database initialized successfully'); } catch (error) { console.error('❌ Error initializing database:', error); throw error; } return db; }, }; @Global() @Module({ providers: [databaseProvider], exports: [DATABASE_CONNECTION], }) export class DatabaseModule { }