index.ts•3.46 kB
/**
* Repository factory for accessing repositories
*/
import { PrismaClient } from '@prisma/client';
import { prisma } from '../utils/db';
import { logger } from '../utils/logger';
// Import repository classes
import { ArticleRepository } from './article.repository';
import { UserRepository } from './user.repository';
import { TopicRepository } from './topic.repository';
import { EntityRepository } from './entity.repository';
import { UserArticleRepository } from './user-article.repository';
import { SavedSearchRepository } from './saved-search.repository';
/**
* Repository factory for creating and accessing repositories
*/
export class RepositoryFactory {
private static instance: RepositoryFactory;
private repositories: Map<string, any> = new Map();
private constructor() {
// Initialize repositories
this.repositories.set('article', new ArticleRepository());
this.repositories.set('user', new UserRepository());
this.repositories.set('topic', new TopicRepository());
this.repositories.set('entity', new EntityRepository());
this.repositories.set('userArticle', new UserArticleRepository());
this.repositories.set('savedSearch', new SavedSearchRepository());
}
/**
* Get singleton instance of repository factory
* @returns Repository factory instance
*/
public static getInstance(): RepositoryFactory {
if (!RepositoryFactory.instance) {
RepositoryFactory.instance = new RepositoryFactory();
}
return RepositoryFactory.instance;
}
/**
* Get article repository
* @returns Article repository
*/
public getArticleRepository(): ArticleRepository {
return this.repositories.get('article');
}
/**
* Get user repository
* @returns User repository
*/
public getUserRepository(): UserRepository {
return this.repositories.get('user');
}
/**
* Get topic repository
* @returns Topic repository
*/
public getTopicRepository(): TopicRepository {
return this.repositories.get('topic');
}
/**
* Get entity repository
* @returns Entity repository
*/
public getEntityRepository(): EntityRepository {
return this.repositories.get('entity');
}
/**
* Get user article repository
* @returns User article repository
*/
public getUserArticleRepository(): UserArticleRepository {
return this.repositories.get('userArticle');
}
/**
* Get saved search repository
* @returns Saved search repository
*/
public getSavedSearchRepository(): SavedSearchRepository {
return this.repositories.get('savedSearch');
}
/**
* Execute a function within a transaction
* @param callback Function to execute within transaction
* @returns Result of callback function
*/
public async transaction<T>(callback: (tx: PrismaClient) => Promise<T>): Promise<T> {
try {
return await prisma.$transaction(async (tx: any) => {
return await callback(tx as PrismaClient);
});
} catch (error) {
logger.error('Transaction error:', error);
throw error;
}
}
}
// Export singleton instance
export const repositoryFactory = RepositoryFactory.getInstance();
// Export repository types
export * from './base.repository';
export * from './article.repository';
export * from './user.repository';
export * from './topic.repository';
export * from './entity.repository';
export * from './user-article.repository';
export * from './saved-search.repository';