eletrotupi / tcc/ api/src/services/export/table.descriptors.ts60e277a93c467e6f0fff6c664ec0aae0eb2c4535
8.0 KB | 232 lines Raw
1
import {
2
  Activity,
3
  Appointment,
4
  CareAction,
5
  Insight,
6
  MedicineLog,
7
  MedicineRegimen,
8
  Mood,
9
  MoodComponent,
10
  Notification,
11
  SleepRecord,
12
  Trigger,
13
  TriggerMoodLink,
14
  User,
15
} from "@prisma/client";
16

17
import {
18
  activityCategoryLabel,
19
  appointmentTypeLabel,
20
  baseMoodLabel,
21
  careActionTypeLabel,
22
  insightPeriodLabel,
23
  insightTypeLabel,
24
  intensityLabel,
25
  medicinePeriodicityLabel,
26
  moodComponentLabel,
27
  notificationKindLabel,
28
  triggerTypeLabel,
29
} from "@app/services/export/label.map";
30
import { CsvTable } from "@app/services/export/types";
31

32
const booleanLabel = (value: boolean): string => (value ? "Sim" : "Não");
33

34
const jsonValue = (value: Insight["metadata"]): string | null =>
35
  value === null ? null : JSON.stringify(value);
36

37
// Sleep records carry a day-granular date, so they drop the time and offset.
38
const dateOnly = (value: Date): string => value.toISOString().slice(0, 10);
39

40
export const profileTable: CsvTable<User> = {
41
  filename: "profile.csv",
42
  columns: [
43
    { header: "id", value: (user) => user.id },
44
    { header: "Nome", value: (user) => user.firstName },
45
    { header: "Sobrenome", value: (user) => user.lastName },
46
    { header: "Email", value: (user) => user.email },
47
    { header: "Ativo", value: (user) => booleanLabel(user.active) },
48
    {
49
      header: "Notificações por push",
50
      value: (user) => booleanLabel(user.pushEnabled),
51
    },
52
    { header: "Lembrete diário", value: (user) => user.dailyReminderTime },
53
    {
54
      header: "Resumo semanal",
55
      value: (user) => booleanLabel(user.weeklyResumeEnabled),
56
    },
57
    { header: "Criado em", value: (user) => user.createdAt },
58
    { header: "Atualizado em", value: (user) => user.updatedAt },
59
  ],
60
};
61

62
export const moodTable: CsvTable<Mood> = {
63
  filename: "moods.csv",
64
  columns: [
65
    { header: "id", value: (mood) => mood.id },
66
    { header: "Humor", value: (mood) => baseMoodLabel[mood.selectedMood] },
67
    { header: "Ansiedade", value: (mood) => mood.anxietyLevel },
68
    { header: "Estresse", value: (mood) => mood.stressLevel },
69
    { header: "Energia", value: (mood) => mood.energyLevel },
70
    { header: "Momento", value: (mood) => mood.moment },
71
    { header: "Anotação", value: (mood) => mood.annotation },
72
  ],
73
};
74

75
export const moodComponentTable: CsvTable<MoodComponent> = {
76
  filename: "mood_components.csv",
77
  columns: [
78
    { header: "id", value: (component) => component.id },
79
    { header: "mood_id", value: (component) => component.moodId },
80
    {
81
      header: "Sentimento",
82
      value: (component) => moodComponentLabel[component.component],
83
    },
84
    {
85
      header: "Intensidade",
86
      value: (component) => intensityLabel[component.intensity],
87
    },
88
  ],
89
};
90

91
export const sleepRecordTable: CsvTable<SleepRecord> = {
92
  filename: "sleep_records.csv",
93
  columns: [
94
    { header: "id", value: (record) => record.id },
95
    { header: "Data", value: (record) => dateOnly(record.date) },
96
    { header: "Média", value: (record) => record.average },
97
    { header: "Anotações", value: (record) => record.annotations },
98
    { header: "Criado em", value: (record) => record.createdAt },
99
    { header: "Atualizado em", value: (record) => record.updatedAt },
100
  ],
101
};
102

103
export const triggerTable: CsvTable<Trigger> = {
104
  filename: "triggers.csv",
105
  columns: [
106
    { header: "id", value: (trigger) => trigger.id },
107
    {
108
      header: "Categoria",
109
      value: (trigger) => triggerTypeLabel[trigger.category],
110
    },
111
    { header: "Momento", value: (trigger) => trigger.moment },
112
    { header: "Comentário", value: (trigger) => trigger.comment },
113
    { header: "Criado em", value: (trigger) => trigger.createdAt },
114
    { header: "Atualizado em", value: (trigger) => trigger.updatedAt },
115
  ],
116
};
117

118
export const triggerMoodLinkTable: CsvTable<TriggerMoodLink> = {
119
  filename: "trigger_mood_links.csv",
120
  columns: [
121
    { header: "id", value: (link) => link.id },
122
    { header: "trigger_id", value: (link) => link.triggerId },
123
    { header: "mood_id", value: (link) => link.moodId },
124
    { header: "Impacto percebido", value: (link) => link.perceivedImpact },
125
    { header: "Vinculado em", value: (link) => link.linkedAt },
126
  ],
127
};
128

129
export const careActionTable: CsvTable<CareAction> = {
130
  filename: "care_actions.csv",
131
  columns: [
132
    { header: "id", value: (action) => action.id },
133
    { header: "Tipo", value: (action) => careActionTypeLabel[action.type] },
134
    { header: "Momento", value: (action) => action.moment },
135
    { header: "trigger_id", value: (action) => action.triggerId },
136
    { header: "mood_id", value: (action) => action.moodId },
137
    { header: "Criado em", value: (action) => action.createdAt },
138
    { header: "Atualizado em", value: (action) => action.updatedAt },
139
  ],
140
};
141

142
export const medicineLogTable: CsvTable<MedicineLog> = {
143
  filename: "medicine_logs.csv",
144
  columns: [
145
    { header: "id", value: (log) => log.id },
146
    { header: "care_action_id", value: (log) => log.careActionId },
147
    { header: "regimen_id", value: (log) => log.regimenId },
148
    { header: "Tomado em", value: (log) => log.takenAt },
149
  ],
150
};
151

152
export const appointmentTable: CsvTable<Appointment> = {
153
  filename: "appointments.csv",
154
  columns: [
155
    { header: "id", value: (appointment) => appointment.id },
156
    {
157
      header: "care_action_id",
158
      value: (appointment) => appointment.careActionId,
159
    },
160
    {
161
      header: "Tipo",
162
      value: (appointment) => appointmentTypeLabel[appointment.type],
163
    },
164
    { header: "Duração", value: (appointment) => appointment.duration },
165
    { header: "Observação", value: (appointment) => appointment.note },
166
  ],
167
};
168

169
export const activityTable: CsvTable<Activity> = {
170
  filename: "activities.csv",
171
  columns: [
172
    { header: "id", value: (activity) => activity.id },
173
    { header: "care_action_id", value: (activity) => activity.careActionId },
174
    {
175
      header: "Tipo",
176
      value: (activity) => activityCategoryLabel[activity.type],
177
    },
178
    { header: "Duração", value: (activity) => activity.duration },
179
  ],
180
};
181

182
export const medicineRegimenTable: CsvTable<MedicineRegimen> = {
183
  filename: "medicine_regimens.csv",
184
  columns: [
185
    { header: "id", value: (regimen) => regimen.id },
186
    { header: "Nome", value: (regimen) => regimen.name },
187
    { header: "Dosagem", value: (regimen) => regimen.dosage },
188
    {
189
      header: "Periodicidade",
190
      value: (regimen) => medicinePeriodicityLabel[regimen.periodicity],
191
    },
192
    { header: "Horários", value: (regimen) => regimen.scheduledAt.join(" · ") },
193
    { header: "Ativo", value: (regimen) => booleanLabel(regimen.active) },
194
    { header: "Criado em", value: (regimen) => regimen.createdAt },
195
    { header: "Atualizado em", value: (regimen) => regimen.updatedAt },
196
  ],
197
};
198

199
export const insightTable: CsvTable<Insight> = {
200
  filename: "insights.csv",
201
  columns: [
202
    { header: "id", value: (insight) => insight.id },
203
    { header: "Tipo", value: (insight) => insightTypeLabel[insight.type] },
204
    { header: "Período", value: (insight) => insightPeriodLabel[insight.period] },
205
    { header: "Título", value: (insight) => insight.title },
206
    { header: "Corpo", value: (insight) => insight.body },
207
    { header: "Metadados", value: (insight) => jsonValue(insight.metadata) },
208
    { header: "Início do período", value: (insight) => insight.periodStart },
209
    { header: "Fim do período", value: (insight) => insight.periodEnd },
210
    { header: "Gerado em", value: (insight) => insight.generatedAt },
211
  ],
212
};
213

214
export const notificationTable: CsvTable<Notification> = {
215
  filename: "notifications.csv",
216
  columns: [
217
    { header: "id", value: (notification) => notification.id },
218
    {
219
      header: "Tipo",
220
      value: (notification) => notificationKindLabel[notification.kind],
221
    },
222
    { header: "Título", value: (notification) => notification.title },
223
    { header: "Corpo", value: (notification) => notification.body },
224
    {
225
      header: "Agendada para",
226
      value: (notification) => notification.scheduledFor,
227
    },
228
    { header: "Expira em", value: (notification) => notification.expiresAt },
229
    { header: "Enviada em", value: (notification) => notification.pushedAt },
230
    { header: "regimen_id", value: (notification) => notification.regimenId },
231
  ],
232
};