eletrotupi / tcc/ api/src/services/trigger.service.tsfe4f9989edbeafd44d768c2cccbaa35c1af09360
2.8 KB | 125 lines Raw
1
import { prisma } from '@app/lib/prisma';
2
import { Trigger } from '@prisma/client';
3

4
import { CreateTriggerInput, UpdateTriggerInput } from '@app/schemas';
5
import { rollingPeriod } from "@app/lib/queue/processors/insights/utils";
6
import { InsightJobName } from "@app/lib/queue/types";
7
import { getQueue } from "@app/lib/queue";
8
import { paginate } from '@app/utils/calc';
9

10
export const createTrigger = async (
11
  userId: number, input: CreateTriggerInput
12
): Promise<Trigger> => {
13
  const trigger = await prisma.trigger.create({
14
    data: {
15
      ...input,
16
      userId
17
    }
18
  });
19

20
  void enqueueTriggerPatternInsight(userId);
21

22
  return trigger
23
};
24

25
export const getTriggersByUserId = async (
26
  userId: number,
27
  params?: {
28
    limit?: number;
29
    page?: number;
30
    from?: string;
31
    to?: string;
32
  }
33
): Promise<{ entries: Trigger[]; total: number; page: number; nextPage: number | null }> => {
34
  const limit = params?.limit ?? 20;
35

36
  const where = {
37
    userId,
38
    ...(params?.from || params?.to ? {
39
      moment: {
40
        ...(params.from && { gte: new Date(params.from) }),
41
        ...(params.to   && { lte: new Date(params.to)   }),
42
      }
43
    } : {}),
44
  };
45

46
  const total = await prisma.trigger.count({ where });
47
  const { page, skip, nextPage } = paginate(params?.page ?? 1, limit, total);
48

49
  const entries = await prisma.trigger.findMany({
50
    where,
51
    orderBy: { moment: 'desc' },
52
    take: limit,
53
    skip,
54
  });
55

56
  return {
57
    entries,
58
    total,
59
    page,
60
    nextPage,
61
  };
62
};
63

64
export const destroyTriggerById = async (
65
  userId: number, id: number
66
): Promise<Trigger> => {
67
  const trigger = await prisma.trigger.delete({
68
    where: {
69
      id,
70
      userId
71
    }
72
  })
73

74
  void enqueueTriggerPatternInsight(userId);
75

76
  return trigger
77
}
78

79
export const getTriggerById = async (userId: number, id: number) => {
80
  return await prisma.trigger.findUnique({
81
    where: { userId, id },
82
    include: {
83
      moodLinks: {
84
        include: { mood: { include: { moodComponents: true } } },
85
        orderBy: { linkedAt: 'desc' },
86
      },
87
      careActions: {
88
        include: {
89
          medicineLog: { include: { regimen: true } },
90
          appointment: true,
91
          activity: true,
92
        },
93
        orderBy: { moment: 'desc' },
94
      },
95
    },
96
  });
97
}
98

99
export const updateTriggerById = async (
100
  userId: number, id: number, input: UpdateTriggerInput
101
): Promise<Trigger> => {
102
  const trigger = await prisma.trigger.update({
103
    where: {
104
      id,
105
      userId
106
    },
107
    data: input
108
  });
109

110
  void enqueueTriggerPatternInsight(userId);
111

112
  return trigger;
113
}
114

115
async function enqueueTriggerPatternInsight(userId: number): Promise<void> {
116
  await getQueue('insights').add(
117
    InsightJobName.TriggerPattern,
118
    { userId, ...rollingPeriod(7) },
119
    {
120
      jobId: `trigger-pattern-${userId}-${new Date().toDateString()}`,
121
      removeOnComplete: true,
122
      removeOnFail: true,
123
    }
124
  );
125
}