eletrotupi / tcc/ api/src/services/mood.service.ts729fa78803011f9075814181562b4f7ea4bb9974
3.0 KB | 145 lines Raw
1
import { prisma } from "@app/lib/prisma";
2
import { Mood } from "@prisma/client";
3
import { rollingPeriod } from "@app/lib/queue/processors/insights/utils";
4
import { InsightJobName } from "@app/lib/queue/types";
5
import { getQueue } from "@app/lib/queue";
6

7
import { CreateMoodInput } from "@app/schemas";
8

9
export const createMood = async (
10
  userId: number,
11
  input: CreateMoodInput,
12
): Promise<Mood> => {
13
  const { moodComponents, ...moodData } = input;
14

15
  const mood = prisma.mood.create({
16
    data: {
17
      ...moodData,
18
      userId,
19
      moodComponents: {
20
        create: moodComponents,
21
      },
22
    },
23
    include: { moodComponents: true },
24
  });
25

26
  void enqueueOnDemandInsights(userId);
27

28
  return mood;
29
};
30

31
export const getMoodsByUserId = async (
32
  userId: number,
33
  params?: {
34
    limit?: number;
35
    page?: number;
36
    from?: string;
37
    to?: string;
38
  },
39
): Promise<{
40
  entries: Mood[];
41
  total: number;
42
  page: number;
43
  nextPage: number | null;
44
}> => {
45
  const page = params?.page ?? 1;
46
  const limit = params?.limit ?? 20;
47
  const skip = (page - 1) * limit;
48

49
  const where = {
50
    userId,
51
    ...(params?.from || params?.to
52
      ? {
53
          moment: {
54
            ...(params.from && { gte: new Date(params.from) }),
55
            ...(params.to && { lte: new Date(params.to) }),
56
          },
57
        }
58
      : {}),
59
  };
60

61
  const [entries, total] = await Promise.all([
62
    prisma.mood.findMany({
63
      where,
64
      include: { moodComponents: true },
65
      orderBy: { moment: "desc" },
66
      take: limit,
67
      skip,
68
    }),
69
    prisma.mood.count({ where }),
70
  ]);
71

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

74
  return {
75
    entries,
76
    total,
77
    page,
78
    nextPage: page < totalPages ? page + 1 : null,
79
  };
80
};
81

82
export const getMoodById = async (id: number) => {
83
  return await prisma.mood.findUnique({
84
    where: {
85
      id,
86
    },
87
    include: {
88
      moodComponents: true,
89
      triggerLinks: {
90
        include: { trigger: true },
91
        orderBy: { linkedAt: 'desc' },
92
      },
93
    },
94
  });
95
};
96

97
export const destroyMoodById = async (
98
  userId: number,
99
  id: number,
100
): Promise<Mood> => {
101
  return await prisma.mood.delete({
102
    where: {
103
      id,
104
      userId,
105
    },
106
  });
107
};
108

109
export const enqueueOnDemandInsights = async (
110
  userId: number,
111
): Promise<void> => {
112
  const queue = getQueue("insights");
113
  const period = rollingPeriod(7);
114
  const payload = { userId, ...period };
115

116
  await queue.addBulk([
117
    {
118
      name: InsightJobName.MoodTrend,
119
      data: payload,
120
      opts: {
121
        jobId: `mood-trend-${userId}-${new Date().toDateString()}`,
122
        removeOnComplete: true,
123
        removeOnFail: true,
124
      },
125
    },
126
    {
127
      name: InsightJobName.EnergySleep,
128
      data: payload,
129
      opts: {
130
        jobId: `energy-sleep-${userId}-${new Date().toDateString()}`,
131
        removeOnComplete: true,
132
        removeOnFail: true,
133
      },
134
    },
135
    {
136
      name: InsightJobName.DailyEnergy,
137
      data: payload,
138
      opts: {
139
        jobId: `daily-energy-${userId}-${new Date().toDateString()}`,
140
        removeOnComplete: true,
141
        removeOnFail: true,
142
      },
143
    },
144
  ]);
145
};