task-managment / src / server / eventLogs / infrastructure / repositories-impl.ts
repositories-impl.ts
Raw
import { db } from "@/database/db";
import { eventsLog } from "@/database/schema";
import { and, asc, gt, gte, lte } from "drizzle-orm";
import { EventLogQuery, EventsLog, FilterEvents } from "../domain/models";

const removeHourToDate = (date: Date | string) => {
  const formattedDate = new Date(date);
  formattedDate.setHours(0, 0, 0);
  return formattedDate;
};

class EventLogsRepositoryImpl {
  async getAll(filter:FilterEvents):Promise<EventLogQuery> {
    const limit = filter?.limit || 20
      const data = await db.query.eventsLog.findMany({
        limit, 
        where: and(
          filter?.startDate
            ? gte(eventsLog.createdAt, removeHourToDate(filter?.startDate))
            : undefined,
          filter?.endDate
            ? lte(eventsLog.createdAt, removeHourToDate(filter?.endDate))
            : undefined,
          filter?.cursor ? gt(eventsLog.id, filter?.cursor as any) : undefined
        ),
        columns: {
          id: true,
          eventType: true,
          modifiedItem: true,
          createdAt: true,
          description:true
        },
        with: {
          user: {
            columns: {
              id: true,
              firstName: true,
            },
          },
        },
        orderBy: asc(eventsLog.createdAt),
      });

      const nextCursor = data?.length >= limit ? data?.pop()?.id : undefined;

      return {
        data: data as EventsLog[],
        cursor: nextCursor,
      };
    
  }
}

export const defaultEventLogRepository= new EventLogsRepositoryImpl()