eletrotupi / tcc/ commit / e859306

thesis: rework zod inference + add code demo

Pedro Lucas Porcellis porcellis@eletrotupi.com · 1 month ago e859306d5d146d94a8a17ec574c428b9cb94792c Browse files
Parents 192a6bd
Changed files
1
Additions
+38
Deletions
0
monografia/chapters/tech.tex
1 1
\chapter{Tecnologias}
2 2

3 3
Este capítulo apresenta as principais tecnologias empregadas no desenvolvimento
4 4
do aplicativo, organizadas de acordo com a camada da arquitetura em que atuam:
5 5
\textit{front-end}, \textit{back-end} e infraestrutura/persistência de dados.
84 84
usuário estejam em conformidade com o formato esperado. A inferência
85 85
automática de tipos a partir dos esquemas evita a duplicação de definições de
86 86
tipo entre a camada de validação e o restante do código TypeScript do
87 87
back-end.
88 88

89 +
\begin{lstlisting}[language=typescript, caption={Validação e Inferência usando Zod}, label={lst:zod-inference}]
90 +
import {
91 +
  BaseMoodOption,
92 +
  MoodComponentOption,
93 +
  IntensityLevel
94 +
} from '@prisma/client';
95 +

96 +
export const MoodComponentSchema = z.object({
97 +
  component: z.nativeEnum(MoodComponentOption),
98 +
  intensity: z.nativeEnum(IntensityLevel)
99 +
});
100 +

101 +
export const CreateMoodSchema = z.object({
102 +
  annotation: z.string().optional(),
103 +
  moment: z.coerce.date(),
104 +
  selectedMood: z.nativeEnum(BaseMoodOption),
105 +
  anxietyLevel: z.number().int().min(0).max(10),
106 +
  stressLevel: z.number().int().min(0).max(10),
107 +
  energyLevel: z.number().int().min(0).max(10),
108 +
  moodComponents: z.array(MoodComponentSchema).min(1)
109 +
});
110 +

111 +
export type CreateMoodInput = z.infer<typeof CreateMoodSchema>;
112 +
\end{lstlisting}
113 +

114 +
\sourcecode{Elaborado pelo autor (2026)}
115 +

116 +
Aqui, é possível observar alguns elementos, como a extração direta dos
117 +
\textit{enums} mapeados pelo Prisma, citado anteriormente nas linhas 1--5. Em
118 +
seguida, são criados os \textit{schemas} de validação: um valida os componentes
119 +
de humor de forma aninhada dentro do objeto recebido, e o outro valida os dados
120 +
do próprio registro -- os níveis aceitos de ansiedade, estresse e energia; a
121 +
conversão do campo \texttt{moment} para um objeto de data a partir da entrada
122 +
recebida; a exigência de ao menos um componente de humor selecionado; entre
123 +
outros. Por fim, esses dados são exportados como um \textit{type} do
124 +
TypeScript, usado pelo compilador para a verificação estática de tipos no
125 +
restante do back-end.
126 +

89 127
\subsection{Valkey e BullMQ}
90 128

91 129
Valkey é um banco de dados em memória, do tipo chave-valor, criado como
92 130
\textit{fork} de código aberto do Redis, mantido sob a governança da Linux
93 131
Foundation \citep{valkey:2026}. BullMQ é uma biblioteca para gerenciamento de
284 322
ao documentar e automatizar o processo de provisionamento, o projeto
285 323
favorece um modelo mais alinhado aos princípios de privacidade e de
286 324
autonomia sobre os dados dos usuários, permitindo que instituições ou
287 325
indivíduos preocupados com a confidencialidade de dados sensíveis de
288 326
saúde mental hospedem e controlem sua própria instância da aplicação.