eletrotupi / tcc / api/src/services/trigger.service.ts master
2.0 KB Raw
import { prisma } from '@app/lib/prisma';
import { Trigger } from '@prisma/client';

import { CreateTriggerInput } from '@app/schemas';
import { rollingPeriod } from "@app/lib/queue/processors/insights/utils";
import { InsightJobName } from "@app/lib/queue/types";
import { getQueue } from "@app/lib/queue";

export const createTrigger = async (
  userId: number, input: CreateTriggerInput
): Promise<Trigger> => {
  const trigger = await prisma.trigger.create({
    data: {
      ...input,
      userId
    }
  });

  void enqueueTriggerPatternInsight(userId);

  return trigger
};

export const getTriggersByUserId = async (
  userId: number,
  params?: {
    limit?: number;
    page?: number;
    from?: string;
    to?: string;
  }
): Promise<{ entries: Trigger[]; total: number; page: number; nextPage: number | null }> => {
  const page  = params?.page  ?? 1;
  const limit = params?.limit ?? 20;
  const skip  = (page - 1) * limit;

  const where = {
    userId,
    ...(params?.from || params?.to ? {
      moment: {
        ...(params.from && { gte: new Date(params.from) }),
        ...(params.to   && { lte: new Date(params.to)   }),
      }
    } : {}),
  };

  const [entries, total] = await Promise.all([
    prisma.trigger.findMany({
      where,
      orderBy: { moment: 'desc' },
      take: limit,
      skip,
    }),
    prisma.trigger.count({ where }),
  ]);

  const totalPages = Math.ceil(total / limit);

  return {
    entries,
    total,
    page,
    nextPage: page < totalPages ? page + 1 : null,
  };
};

export const destroyTriggerById = async (
  userId: number, id: number
): Promise<Trigger> => {
  return await prisma.trigger.delete({
    where: {
      id,
      userId
    }
  })
}

async function enqueueTriggerPatternInsight(userId: number): Promise<void> {
  await getQueue('insights').add(
    InsightJobName.TriggerPattern,
    { userId, ...rollingPeriod(7) },
    {
      jobId: `trigger-pattern-${userId}-${new Date().toDateString()}`,
      removeOnComplete: true,
    }
  );
}