Source: app/database.js

import { PrismaClient } from "@prisma/client";
import { logger } from "./logger.js";

/**
 * Instance PrismaClient yang dikonfigurasi untuk logging.
 *
 * Konfigurasi logging:
 * - query: Log untuk semua query yang dijalankan.
 * - error: Log untuk semua error yang terjadi.
 * - info: Log untuk informasi tambahan.
 * - warn: Log untuk peringatan.
 *
 * Event handler:
 * - `error`: Log error menggunakan logger.
 * - `info`: Log informasi menggunakan logger.
 * - `warn`: Log peringatan menggunakan logger.
 *
 * @type {PrismaClient<
 *   {log: [
 *     {emit: string, level: string},
 *     {emit: string, level: string},
 *     {emit: string, level: string},
 *     {emit: string, level: string}
 *   ]},
 *   "log" extends keyof {
 *     log: [
 *       {emit: string, level: string},
 *       {emit: string, level: string},
 *       {emit: string, level: string},
 *       {emit: string, level: string}
 *     ]
 *   } ? (
 *     [
 *       {emit: string, level: string},
 *       {emit: string, level: string},
 *       {emit: string, level: string},
 *       {emit: string, level: string}
 *     ] extends Array<Prisma.LogLevel | Prisma.LogDefinition>
 *       ? Prisma.GetEvents<
 *         [
 *           {emit: string, level: string},
 *           {emit: string, level: string},
 *           {emit: string, level: string},
 *           {emit: string, level: string}
 *         ]
 *       >
 *       : never
 *   ) : never,
 *   DefaultArgs
 * >}
 */
export const prismaClient = new PrismaClient({
  log: [
    {
      emit: "event",
      level: "query",
    },
    {
      emit: "event",
      level: "error",
    },
    {
      emit: "event",
      level: "info",
    },
    {
      emit: "event",
      level: "warn",
    },
  ],
});

/**
 * Event handler untuk error.
 * Mencatat error menggunakan logger.
 *
 * @event
 * @param {Prisma.LogEvent} e - Objek event log dari Prisma.
 */
prismaClient.$on("error", e => {
  logger.error(e);
});

/**
 * Event handler untuk informasi.
 * Mencatat informasi menggunakan logger.
 *
 * @event
 * @param {Prisma.LogEvent} e - Objek event log dari Prisma.
 */
prismaClient.$on("info", e => {
  logger.info(e);
});

/**
 * Event handler untuk peringatan.
 * Mencatat peringatan menggunakan logger.
 *
 * @event
 * @param {Prisma.LogEvent} e - Objek event log dari Prisma.
 */
prismaClient.$on("warn", e => {
  logger.warn(e);
});