eletrotupi / tcc/ api/src/services/export/table.descriptors.ts6b62f4dcf96987b8b2e55bd210139a3ac9f0d976
7.2 KB | 210 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
    {
52
      header: "Resumo semanal",
53
      value: (user) => booleanLabel(user.weeklyResumeEnabled),
54
    },
55
    { header: "Criado em", value: (user) => user.createdAt },
56
    { header: "Atualizado em", value: (user) => user.updatedAt },
57
  ],
58
};
59

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

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

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

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

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

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

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

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

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

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

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