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

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

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

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

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

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

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

69
export const moodComponentTable: CsvTable<MoodComponent> = {
70
  filename: "mood_components.csv",
71
  columns: [
72
    { header: "id", value: (component) => component.id },
73
    { header: "mood_id", value: (component) => component.moodId },
74
    {
75
      header: "Sentimento",
76
      value: (component) => moodComponentLabel[component.component],
77
    },
78
    {
79
      header: "Intensidade",
80
      value: (component) => intensityLabel[component.intensity],
81
    },
82
  ],
83
};
84

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

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

112
export const triggerMoodLinkTable: CsvTable<TriggerMoodLink> = {
113
  filename: "trigger_mood_links.csv",
114
  columns: [
115
    { header: "id", value: (link) => link.id },
116
    { header: "trigger_id", value: (link) => link.triggerId },
117
    { header: "mood_id", value: (link) => link.moodId },
118
    { header: "Impacto percebido", value: (link) => link.perceivedImpact },
119
    { header: "Vinculado em", value: (link) => link.linkedAt },
120
  ],
121
};
122

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

136
export const medicineLogTable: CsvTable<MedicineLog> = {
137
  filename: "medicine_logs.csv",
138
  columns: [
139
    { header: "id", value: (log) => log.id },
140
    { header: "care_action_id", value: (log) => log.careActionId },
141
    { header: "regimen_id", value: (log) => log.regimenId },
142
    { header: "Tomado em", value: (log) => log.takenAt },
143
  ],
144
};
145

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

163
export const activityTable: CsvTable<Activity> = {
164
  filename: "activities.csv",
165
  columns: [
166
    { header: "id", value: (activity) => activity.id },
167
    { header: "care_action_id", value: (activity) => activity.careActionId },
168
    {
169
      header: "Tipo",
170
      value: (activity) => activityCategoryLabel[activity.type],
171
    },
172
    { header: "Duração", value: (activity) => activity.duration },
173
  ],
174
};
175

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

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