eletrotupi / tcc/ monografia/chapters/architecture.texbb31fc84a30face6fb284d7f0c7785eab1b7ec23
16.1 KB | 341 lines Raw
1
\chapter{Arquitetura e Elementos do Sistema}
2

3
Como delineado as tecnologias no capítulo anterior, aqui se apresenta a
4
arquitetura, demonstrando como todas as tecnologias apresentadas acima se
5
conectam e conversam entre si.
6

7
\begin{figure}[h]
8
\centering
9
\caption{Arquitetura e elementos do Sistema}
10
\label{fig:arch}
11
\includegraphics[width=0.9\linewidth]{arch-v2.png}
12
\source{Elaborado pelo autor (2026)}
13
\end{figure}
14

15

16
Este capítulo detalha o funcionamento de algumas funcionalidades
17
desenvolvidas durante o projeto. Apenas algumas funcionalidades mais
18
chaves são abordadas neste capítulo, como o registro de humor, vinculo
19
de um gatilho, indicadores, e o registro de atividades.
20

21
\section{Processo de Login}
22

23
Logo ao abrir o aplicativo, o usuário é redirecionado para a tela de
24
login. A tela em si é relativamente simples, e contém os campos de
25
email e senha. Existe aqui um elemento proposital: uma forma de
26
garantir um certo nível de anonimato, em que o usuário não precisa se
27
identificar com um nome ou número de telefone, tampouco ativar a conta
28
através de uma plataforma de terceiro, como Google ou Facebook.
29

30
Isso se dá, em especial, por dois motivos. Primeiro, o uso de uma tecnologia de
31
autenticação, como por exemplo, \textit{OAuth} \cite{Hardt:2012} exigiria uma
32
conexão com plataformas de terceiro, que poderiam então rastrear quais usuários
33
têm acesso a qual aplicativo --- algo que é fartamente documentado na literatura
34
sobre os mecanismos usados por tais plataformas para rastrear e monitorar o
35
acesso a dados de usuários, com o fim de vender e monetizar essas informações.
36

37
Essa preocupação não é hipotética: um estudo que interceptou o tráfego de rede
38
de 36 dos aplicativos mais populares de saúde mental (depressão e cessação de
39
tabagismo) encontrou transmissão de dados a pelo menos um terceiro em 92\%
40
deles, sendo que 81\% enviavam dados especificamente a serviços operados por
41
Google ou Facebook --- e apenas 59\% desses casos declaravam esse
42
compartilhamento em política de privacidade \cite{Huckvale2019}.
43

44
Um estudo posterior, focado exclusivamente em 27 aplicativos de saúde
45
mental mais populares da Google Play Store, confirmou o mesmo padrão e
46
o caracterizou formalmente como uma ameaça:
47

48
\begin{quote}
49
  A maioria dos aplicativos representa ameaças relacionadas à rastreabilidade,
50
  à identificação e à detecção. Isso constitui um risco, pois  alguns terceiros
51
  podem rastrear, reidentificar e detectar as ações e os dados dos usuários. A
52
  falta de conscientização também está relacionada a essas ameaças, uma vez que
53
  os aplicativos não explicam (por exemplo, na política de privacidade) os
54
  riscos que a publicidade direcionada representa para pessoas com problemas
55
  mentais, bem como o risco de reidentificação e divulgação de condições de
56
  saúde mental (por exemplo, ansiedade, depressão).
57
  \cite[p.~3, tradução nossa]{Iwaya:22}
58
\end{quote}
59

60
Como os próprios autores resumem, a mera vinculação de um usuário a um
61
aplicativo de saúde mental já pode revelar que essa pessoa possui uma condição
62
psicológica --- seja ansiedade, depressão, ou, no caso de um aplicativo como o
63
Nexo, Transtorno Afetivo Bipolar ---, tornando usuários desses aplicativos
64
particularmente vulneráveis a esse tipo de exposição \cite{Iwaya:22}.
65

66
No caso do Nexo, essa cadeia de inferência é especialmente
67
sensível: a presença do aplicativo na lista de apps instalados de um usuário,
68
associada ao seu identificador publicitário, permitiria a uma plataforma como a
69
Meta inferir uma possível condição de saúde mental do usuário para fins de
70
segmentação de anúncios, sem que este tenha conhecimento ou consentimento
71
explícito disso.
72

73
Segundo, e retomando a proposta de oferecer ao usuário a possibilidade
74
de \textit{self-service}, aquele que decidisse manter uma instância
75
própria do aplicativo não precisaria de uma conta em uma plataforma de
76
terceiro, nem se cadastrar nelas.
77

78
\begin{figure}[H]
79
\centering
80
\caption{Tela de login}
81
\label{fig:screenshot-login}
82
\includegraphics[width=0.70\textwidth,height=0.60\textheight,keepaspectratio]{screenshot-login.jpeg}
83
\source{Elaborado pelo autor (2026)}
84
\end{figure}
85

86
Por fim, destaca-se aqui que, conforme mencionado anteriormente na
87
modelagem de casos de uso (figura \ref{fig:use-cases}), ao realizar o
88
login pela primeira vez é enviado um email com um código de
89
verificação, seguindo a lógica dos \textit{magic links}. Isso adiciona
90
uma camada extra de segurança, garantindo que apenas o usuário que
91
solicitou o login possa acessar a conta.
92

93
\section{Página de Consulta de Registros}
94

95
A tela inicial é a tela nomeada apenas como ``Novo''. A proposta aqui
96
é ser a tela de cadastro rápido de um humor, e também é a tela que
97
visualmente mais destoa das demais. O usuário é apresentado com três
98
seções distintas:
99

100
\begin{itemize}
101
    \item Cadastro rápido de um humor
102
    \item Entre ontem e hoje
103
    \item Registros recentes
104
\end{itemize}
105

106
Respectivamente: uma seção em que o usuário é convidado a ``escolher
107
um humor'' e iniciar o processo de registro de uma nova entrada; a
108
seção em que são apresentados os indicadores de nível de energia
109
acumulado entre o dia anterior e o dia atual, além da média de sono do
110
dia comparada com a do dia anterior; e, por fim, a listagem dos dez
111
últimos registros de humor cadastrados pelo usuário.
112

113
\begin{figure}[H]
114
\centering
115
\caption{Tela de Consulta de Registros}
116
\label{fig:screenshot-consulta-registros}
117
\includegraphics[width=0.70\textwidth,height=0.60\textheight,keepaspectratio]{screenshot-initial-page.jpeg}
118
\source{Elaborado pelo autor (2026)}
119
\end{figure}
120

121
Aqui já é introduzido ao usuário um padrão de organização e hierarquia:
122
todos os elementos centrais são organizados em \textit{cards}, exibidos
123
em no máximo duas colunas. Também é introduzido, caso o usuário já
124
possua registros de humor cadastrados, o padrão pelo qual esses
125
registros são resumidos em todas as seções do aplicativo: geralmente
126
um ícone, um título e alguma informação adicional em destaque.
127

128
\section{Criação de Registros de Humor}
129

130
Nesta seção, o usuário pode criar novos registros de humor, escolhendo
131
entre uma lista de opções pré-definidas. O humor selecionado na tela
132
anterior é mostrado aqui, e o usuário é convidado a julgar, em uma
133
escala de 1 a 10, como se sente em relação aos níveis de energia,
134
estresse e ansiedade, respectivamente.
135

136
\begin{figure}[H]
137
\centering
138
\caption{Criação de Registros de Humor}
139
\label{fig:screenshot-consulta-humor}
140
\includegraphics[width=0.70\textwidth,height=0.60\textheight,keepaspectratio]{screenshot-create-mood.jpeg}
141
\source{Elaborado pelo autor (2026)}
142
\end{figure}
143

144
Naturalmente, é uma questão difícil de responder --- e, como o próprio
145
aplicativo procura deixar claro, é importante que seja um momento
146
reflexivo, não necessariamente preciso.
147

148
O usuário pode adicionar uma anotação sobre aquele registro em
149
específico, padrão que se repete em outras telas do aplicativo.
150

151
Por fim, o usuário pode escolher o que compõe aquele registro, ou
152
seja, selecionar emoções e estados/sentimentos que sente naquele
153
momento. É apresentada uma listagem mista desses elementos, na qual o
154
usuário seleciona os que mais se aplicam a ele e atribui um nível de
155
intensidade para cada um. Aqui a escala é menor e mais simples, visando
156
facilitar a escolha e o julgamento do usuário, entre ``Leve'',
157
``Moderado'' e ``Intenso'', conforme a figura
158
\ref{fig:screenshot-add-components}.
159

160
\begin{figure}[H]
161
\centering
162
\caption{Adicionando sentimentos/emoções}
163
\label{fig:screenshot-add-components}
164
\includegraphics[width=0.70\textwidth,height=0.60\textheight,keepaspectratio]{screenshot-add-components.jpeg}
165
\source{Elaborado pelo autor (2026)}
166
\end{figure}
167

168
Ao concluir esse processo e salvar, é apresentada ao usuário uma tela
169
de confirmação, na qual ele pode, opcionalmente, vincular o registro a
170
um gatilho específico --- que pode ter ocorrido antes de ele salvar o
171
registro --- ou criar um novo gatilho. O projeto novamente se ancora no
172
EMA, enriquecendo o registro de humor com mais contexto sobre o que
173
aconteceu.
174

175
\begin{figure}[H]
176
\centering
177
\caption{Vinculando um humor com um gatilho}
178
\label{fig:screenshot-link-mood-trigger}
179
\includegraphics[width=0.70\textwidth,height=0.60\textheight,keepaspectratio]{screenshot-link-mood-with-trigger.jpeg}
180
\source{Elaborado pelo autor (2026)}
181
\end{figure}
182

183
Em seguida, o usuário pode indicar o impacto que aquele gatilho
184
exerceu sobre o registro de humor em questão. Novamente, trata-se de
185
uma estimativa subjetiva, sem pretensão de precisão.
186

187
\begin{figure}[H]
188
\centering
189
\caption{Avaliando o impacto de um gatilho no humor}
190
\label{fig:screenshot-assess-trigger-mood-impact}
191
\includegraphics[width=0.70\textwidth,height=0.60\textheight,keepaspectratio]{screenshot-link-mood-assess-impact.jpeg}
192
\source{Elaborado pelo autor (2026)}
193
\end{figure}
194

195
Por fim, vale mencionar que, após esse processo, é enfileirado
196
internamente um \textit{background job} que recalcula, sob demanda, o
197
indicador de energia daquele dia, apresentado na figura
198
\ref{fig:screenshot-consulta-registros}. Diferentemente deste, os
199
indicadores semanais --- como a correlação entre sono e energia,
200
descrita na seção \ref{sec:insights} --- não são recalculados a cada
201
registro individual, sendo processados apenas pelo job semanal
202
agendado (seção \ref{sec:insights}).
203

204
\section{Indicadores}\label{sec:insights}
205

206
Nessa tela é apresentado um conjunto de indicadores construídos a partir
207
dos registros de humor, sono e gatilho do usuário. Diferente das demais
208
telas do aplicativo, que operam sobre dados em tempo real, os indicadores
209
são artefatos pré-computados: um \textit{worker} assíncrono (\textit{BullMQ})
210
percorre semanalmente todos os usuários ativos e enfileira, para cada
211
um, um conjunto de \textit{jobs} --- um por tipo de indicador --- que
212
processam a janela dos últimos sete dias e persistem o resultado em uma
213
tabela dedicada. Vale notar que nem todos os indicadores seguem esse
214
fluxo agendado: os indicadores diários (energia e sono) são recalculados
215
sob demanda, no momento em que o usuário registra um novo humor ou
216
sessão de sono, enquanto os indicadores semanais dependem
217
exclusivamente do \textit{job} de \textit{fan-out} de segunda-feira.
218

219
O aplicativo móvel apenas consulta esse resultado já
220
calculado, o que evita repetir cálculos custosos a cada abertura da tela
221
e desacopla a lógica analítica do restante da API.
222

223
\begin{figure}[H]
224
\centering
225
\caption{Tela de indicadores}
226
\label{fig:screenshot-insights}
227
\includegraphics[width=0.70\textwidth,height=0.60\textheight,keepaspectratio]{screenshot-insights.jpeg}
228
\source{Elaborado pelo autor (2026)}
229
\end{figure}
230

231
% TODO: referenciar EMA / momentary assessment como justificativa da janela de 7 dias
232

233
São três os indicadores semanais exibidos: tendência de humor, correlação
234
entre sono e energia, e padrão de gatilhos.
235

236
\begin{itemize}
237
    \item \textbf{Tendência de humor}: compara a média de humor da
238
    primeira metade da semana com a da segunda metade, expressando a
239
    diferença como uma variação percentual. O resultado é classificado
240
    como melhora, piora ou estabilidade a partir de uma margem de $\pm10\%$.
241

242
    \item \textbf{Correlação entre sono e energia}: relaciona a duração
243
    do sono de uma noite com o nível de energia relatado na manhã
244
    seguinte, através do coeficiente de correlação de Pearson. Exige um
245
    mínimo de observações pareadas para ser calculado --- caso contrário,
246
    o indicador simplesmente não é exibido.
247

248
    \item \textbf{Padrão de gatilhos}: identifica a categoria de gatilho
249
    mais frequente na semana e expressa sua predominância como percentual
250
    do total de registros.
251
\end{itemize}
252

253
É intencional, na figura \ref{fig:screenshot-insights}, que o bloco de
254
``Energia'' apareça vazio: o cálculo da correlação depende da existência
255
simultânea de registros de sono \emph{e} de humor em quantidade mínima,
256
e no período retratado o usuário ainda não havia acumulado dados
257
suficientes de ambos os tipos. Optou-se por não exibir uma correlação
258
calculada com poucos pontos, preferindo comunicar a ausência de dado a
259
apresentar um número pouco confiável.
260

261
O bloco maior no topo da tela, o ``Resumo Semanal'', condensa os
262
indicadores mais centrais --- média de sono do período e um rótulo de
263
humor (``Estável'', no exemplo). Esse rótulo, no entanto, é o elemento
264
mais delicado de toda a funcionalidade. Embora exista uma fórmula capaz
265
de produzir uma classificação de estabilidade a partir da variância dos
266
registros de humor, atribuir esse tipo de afirmação a um usuário ---
267
especialmente em um aplicativo que é utilizado por pessoas com
268
Transtorno Afetivo Bipolar, para quem uma leitura equivocada de
269
``estabilidade'' pode mascarar justamente o início de um episódio ---
270
exige um embasamento mais cuidadoso do que uma regra estatística
271
simples. Por esse motivo, o rótulo apresentado nesta versão do
272
aplicativo é estático (não deriva de fato do cálculo de estabilidade) e
273
a funcionalidade pode ser inteiramente desabilitada pelo usuário nas
274
configurações. A decisão de manter ou não uma afirmação automatizada
275
desse tipo, e sob quais critérios, permanece um ponto em aberto que
276
mereceria revisão de literatura específica antes de ser tratado como
277
funcionalidade definitiva.
278

279
% TODO: literatura sobre riscos de auto-monitoramento automatizado de humor / mood-tracking apps e TAB
280

281
\section{Histórico}\label{sec:history-analysis}
282

283
Nessa tela é apresentado o histórico consolidado de registros de humor,
284
sono, gatilho e ações de cuidado (como sessões de terapia), organizados
285
cronologicamente e agrupados por dia, conforme a figura
286
\ref{fig:screenshot-history}. O usuário pode ainda filtrar a listagem por
287
categoria (``Humor'', ``Sono'', ``Gatilho'' e ``Ações de Cuidado''),
288
reduzindo o volume de informação exibida.
289

290
\begin{figure}[H]
291
\centering
292
\caption{Tela de Histórico}
293
\label{fig:screenshot-history}
294
\includegraphics[width=0.70\textwidth,height=0.60\textheight,keepaspectratio]{screenshot-history.jpeg}
295
\source{Elaborado pelo autor (2026)}
296
\end{figure}
297

298
Como os quatro tipos de dado residem em recursos distintos da API, a
299
tela consulta os respectivos \textit{endpoints} em paralelo e, em
300
seguida, processa o resultado no próprio aplicativo. Para isso, é
301
utilizado um pequeno serviço que atua como \textit{mapper}, transformando
302
os dados de cada \textit{endpoint} em um formato comum, apresentado no
303
código \ref{lst:history-card}.
304

305
\newpage
306

307
\begin{lstlisting}[caption={Formato comum da tela de histórico}, label={lst:history-card}]
308
export type HistoryCard = {
309
  id: string; // "<category>-<id>" to avoid collisions
310
  category: HistoryCategory;
311
  subtype?: CareActionSubtype; // only set when category === "care_action"
312
  timestamp: string; // ISO string -- used for sorting and display
313
  title: string;
314
  summary: string;
315
  badge?: HistoryBadge;
316
  raw: MoodEntry | SleepRecord | Trigger | CareAction;
317
};
318
\end{lstlisting}
319

320
Após a normalização, os quatro conjuntos de dados são combinados em uma
321
única lista ordenada pelo campo \texttt{timestamp} e reagrupados por dia
322
para exibição, conforme visto na figura \ref{fig:screenshot-history}, nos
323
cabeçalhos ``terça-feira, 14 de julho'' e ``segunda-feira, 13 de julho''.
324
Essa unificação é proposital: ao invés de apresentar quatro telas
325
separadas por tipo de dado, o histórico busca reconstruir uma narrativa
326
única do dia do usuário, aproximando-se do princípio de \textit{Ecological
327
Momentary Assessment} já mencionado anteriormente --- o contexto de um
328
registro de humor (por exemplo, o gatilho ``Interno'' registrado três
329
minutos antes, na mesma figura) fica visualmente próximo do evento que
330
possivelmente o motivou.
331

332
A propriedade \texttt{raw} armazena o dado original, permitindo que a
333
listagem redirecione o usuário para a tela de detalhe correta ao tocar em
334
um card, independentemente da categoria. Já a propriedade \texttt{badge}
335
reaproveita o mesmo mecanismo já descrito na seção de indicadores: para
336
um registro de sono, sinaliza se a duração foi insuficiente; para um
337
registro de humor, destaca a dimensão mais relevante daquele registro
338
(como ``Ansiedade alta'' na figura \ref{fig:screenshot-history}); para um
339
gatilho, indica sua categoria, e assim por diante.
340

341
\FloatBarrier