Files
home-service/backend/src/database/database.module.ts

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 { }