88 lines
3.0 KiB
TypeScript
88 lines
3.0 KiB
TypeScript
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<PgliteDatabase<typeof schema>> => {
|
|
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 { }
|