Files
core2026/packages/infra/src/errorLogRepository.ts
T
2026-01-23 16:45:36 +00:00

69 lines
1.8 KiB
TypeScript

import type { GamePrisma, GamePrismaClient } from './gamePrisma.js';
export interface ErrorLogQueryOptions {
limit?: number;
beforeId?: number;
category?: string;
}
export interface ErrorLogCreateInput {
category: string;
message: string;
source?: string;
trace?: string;
context?: GamePrisma.InputJsonValue;
}
export interface ErrorLogView {
id: number;
category: string;
source: string | null;
message: string;
trace: string | null;
context: GamePrisma.JsonValue;
createdAt: Date;
}
const buildPaginationWhere = (
base: GamePrisma.ErrorLogWhereInput,
options: ErrorLogQueryOptions
): GamePrisma.ErrorLogWhereInput => {
if (options.beforeId) {
return {
...base,
id: { lt: options.beforeId },
};
}
return base;
};
const buildFindArgs = (
where: GamePrisma.ErrorLogWhereInput,
options: ErrorLogQueryOptions
): GamePrisma.ErrorLogFindManyArgs => ({
where: buildPaginationWhere(where, options),
orderBy: { id: 'desc' },
take: options.limit ?? 50,
});
export class ErrorLogRepository {
constructor(private readonly prisma: GamePrismaClient) {}
async createErrorLog(input: ErrorLogCreateInput): Promise<ErrorLogView> {
return this.prisma.errorLog.create({
data: {
category: input.category,
source: input.source ?? null,
message: input.message,
trace: input.trace ?? null,
context: input.context ?? {},
},
});
}
async listErrorLogs(options: ErrorLogQueryOptions = {}): Promise<ErrorLogView[]> {
const base: GamePrisma.ErrorLogWhereInput = options.category ? { category: options.category } : {};
return this.prisma.errorLog.findMany(buildFindArgs(base, options));
}
}