saved-search.repository.ts•3.39 kB
/**
* SavedSearch repository implementation
*/
import {
SavedSearch,
SavedSearchCreateInput
} from '../models/prisma.types';
import { prisma } from '../utils/db';
import {
IRepository
} from './base.repository';
import { logger } from '../utils/logger';
/**
* Repository for saved search data access
*/
export class SavedSearchRepository implements IRepository<SavedSearch, number> {
/**
* Find saved search by ID
* @param id SavedSearch ID
* @returns SavedSearch or null if not found
*/
async findById(id: number): Promise<SavedSearch | null> {
try {
return await prisma.savedSearch.findUnique({
where: { id }
});
} catch (error) {
logger.error('Error finding saved search by ID:', error);
throw error;
}
}
/**
* Find all saved searches
* @returns Array of saved searches
*/
async findAll(): Promise<SavedSearch[]> {
try {
return await prisma.savedSearch.findMany();
} catch (error) {
logger.error('Error finding all saved searches:', error);
throw error;
}
}
/**
* Create a new saved search
* @param data SavedSearch data
* @returns Created saved search
*/
async create(data: Omit<SavedSearch, 'id' | 'createdAt' | 'updatedAt'>): Promise<SavedSearch> {
try {
// Convert data to proper input format with proper relation connections
const { userId, ...rest } = data;
return await prisma.savedSearch.create({
data: {
...rest,
user: { connect: { id: userId } }
}
});
} catch (error) {
logger.error('Error creating saved search:', error);
throw error;
}
}
/**
* Update a saved search
* @param id SavedSearch ID
* @param data Updated saved search data
* @returns Updated saved search
*/
async update(id: number, data: Partial<SavedSearch>): Promise<SavedSearch> {
try {
return await prisma.savedSearch.update({
where: { id },
data
});
} catch (error) {
logger.error('Error updating saved search:', error);
throw error;
}
}
/**
* Delete a saved search
* @param id SavedSearch ID
* @returns True if deleted, false otherwise
*/
async delete(id: number): Promise<boolean> {
try {
await prisma.savedSearch.delete({
where: { id }
});
return true;
} catch (error) {
logger.error('Error deleting saved search:', error);
return false;
}
}
/**
* Find saved searches by user ID
* @param userId User ID
* @returns Array of saved searches
*/
async findByUserId(userId: number): Promise<SavedSearch[]> {
try {
return await prisma.savedSearch.findMany({
where: { userId },
orderBy: { updatedAt: 'desc' }
});
} catch (error) {
logger.error('Error finding saved searches by user ID:', error);
throw error;
}
}
/**
* Update last run time for saved search
* @param id SavedSearch ID
* @returns Updated saved search
*/
async updateLastRunTime(id: number): Promise<SavedSearch> {
try {
return await prisma.savedSearch.update({
where: { id },
data: {
lastRunAt: new Date()
}
});
} catch (error) {
logger.error('Error updating saved search last run time:', error);
throw error;
}
}
}