eletrotupi / tcc/ api/src/services/sleepRecord.service.ts2bd9b6733f955a443d284beecfa664749fcb3900
3.1 KB | 130 lines Raw
1
import { prisma } from '@app/lib/prisma';
2
import { SleepRecord } from '@prisma/client';
3

4
import { CreateSleepRecordInput, UpdateSleepRecordInput } 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 { startOfDay } from "date-fns";
9

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

20
  void enqueueEnergySleepInsights(userId);
21

22
  return sleepRecord;
23
};
24

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

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

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

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

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

68
export const destroySleepRecordById = async (
69
  userId: number, id: number
70
): Promise<SleepRecord> => {
71
  return await prisma.sleepRecord.delete({
72
    where: {
73
      id,
74
      userId
75
    }
76
  })
77
}
78

79
export const getSleepRecordById = async (userId: number, id: number): Promise<SleepRecord | null> => {
80
  return await prisma.sleepRecord.findUnique({
81
    where: { userId, id }
82
  })
83
}
84

85
export const updateSleepRecordById = async (
86
  userId: number, id: number, input: UpdateSleepRecordInput
87
): Promise<SleepRecord> => {
88
  const sleepRecord = await prisma.sleepRecord.update({
89
    where: {
90
      id,
91
      userId
92
    },
93
    data: input
94
  });
95

96
  void enqueueEnergySleepInsights(userId);
97

98
  return sleepRecord;
99
}
100

101
async function enqueueEnergySleepInsights(userId: number): Promise<void> {
102
  const queue = getQueue("insights");
103
  const period = rollingPeriod(7);
104
  const payload = { userId, ...period };
105

106
  await getQueue('insights').addBulk([
107
    {
108
      name: InsightJobName.EnergySleep,
109
      data: payload,
110
      opts: {
111
        jobId: `energy-sleep-${userId}-${new Date().toDateString()}`,
112
        removeOnComplete: true,
113
        removeOnFail: true,
114
      }
115
    },
116
    {
117
      name: InsightJobName.DailySleep,
118
      data: {
119
        userId,
120
        periodStart: startOfDay(new Date()).toISOString(),
121
        periodEnd: new Date()
122
      },
123
      opts: {
124
        jobId: `daily-sleep-${userId}-${new Date().toDateString()}`,
125
        removeOnComplete: true,
126
        removeOnFail: true,
127
      },
128
    },
129
  ]);
130
}