eletrotupi / tcc/ api/src/services/trigger.service.tsf60b3774625eda020e210c7afb6523aff963d385
2.9 KB | 128 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

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

19
  void enqueueTriggerPatternInsight(userId);
20

21
  return trigger
22
};
23

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

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

47
  const [entries, total] = await Promise.all([
48
    prisma.trigger.findMany({
49
      where,
50
      orderBy: { moment: 'desc' },
51
      take: limit,
52
      skip,
53
    }),
54
    prisma.trigger.count({ where }),
55
  ]);
56

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

59
  return {
60
    entries,
61
    total,
62
    page,
63
    nextPage: page < totalPages ? page + 1 : null,
64
  };
65
};
66

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

77
  void enqueueTriggerPatternInsight(userId);
78

79
  return trigger
80
}
81

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

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

113
  void enqueueTriggerPatternInsight(userId);
114

115
  return trigger;
116
}
117

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