... | ... | @@ -102,7 +102,30 @@ class JournalEntry { |
|
|
|
|
|
### Exames
|
|
|
|
|
|
Ainda não definido.
|
|
|
O app oferece a funcionalidade de persistir imagens de exames realizados pelo usuário: a pessoa pode selecionar várias imagens da galeria do dispositivo (ou tirar fotos com a câmera dentro do app), e atribuir um nome e uma descrição ao conjunto de imagens. A aplicação persiste essas informações no Firebase, para que o usuário possa ter acesso rápido aos seus exames de qualquer lugar.
|
|
|
|
|
|
Um desafio para a implementação dessa funcionalidade se dá pela persistência das imagens: como isso pode ser feito com o React Native e coordenado com o Firebase.
|
|
|
|
|
|
O Firebase permite armazenar arquivos de qualquer tipo usado o [Storage](https://firebase.google.com/docs/storage). As imagens são armazenadas da forma que a pessoa desenvolvedora desejar, sendo necessário apenas atribuir um caminho para a mesma.
|
|
|
|
|
|
As imagens foram organizadas no Storage de acordo com o usuário e o exame aos quais estão relacionadas: o caminho para uma imagem é dado pelo ID do usuário e pela data de criação do exame, conforme exemplo abaixo:
|
|
|
|
|
|
```
|
|
|
/<user-id>/exams/<timestamp>/<image-name>
|
|
|
/user-id-x/exams/1573478824428/img-ajfhskd.jpg
|
|
|
```
|
|
|
|
|
|
#### Esquema físico<sup>1</sup>
|
|
|
|
|
|
O objeto `Exam` armazena as informações de um exame, conforme definido abaixo:
|
|
|
|
|
|
```typescript
|
|
|
class Exam {
|
|
|
name: string // nome
|
|
|
description: string // descrição
|
|
|
images: string[] // nomes das imagens no Storage
|
|
|
}
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
... | ... | @@ -111,7 +134,7 @@ Ainda não definido. |
|
|
Definiu-se que os dados serão armazenados no Firebase de acordo com a identificação do usuário. A partir do objeto raiz, cada usuário possui um objeto onde seu id é a chave, e suas anamneses, entradas no diário e exames são seu valor, conforme exemplo abaixo:
|
|
|
|
|
|
```typescript
|
|
|
{ // raiz do Firebase
|
|
|
{ // raiz do Realtime Database
|
|
|
[userId: string]: {
|
|
|
anamneses: {
|
|
|
[creationDate: number /* timestamp */]: AnamnesisRecord
|
... | ... | @@ -123,7 +146,27 @@ Definiu-se que os dados serão armazenados no Firebase de acordo com a identific |
|
|
}
|
|
|
}
|
|
|
|
|
|
// exames: ainda não definido
|
|
|
exams: {
|
|
|
[creationDate: number /* timestamp */]: Exam
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
```
|
|
|
|
|
|
## Esquema físico do Storage<sup>1</sup>
|
|
|
|
|
|
Seguindo o que foi feito no Realtime Database, os arquivos armazenados no Storage são organizados de acordo com a identificação do usuário. A partir do objeto raiz, cada usuário possui uma "pasta" onde seu id é a chave.
|
|
|
|
|
|
Para permitir extensões futuras, como uma nova funcionalidade que requer a persistência de arquivos, as subpastas diretas são de acordo com a feature. As imagens de exames ficam na pasta `exams`, e uma possível futura feature que necessite usar o Storage pode usar uma outra pasta no mesmo nível.
|
|
|
|
|
|
A partir do objeto raiz, a organização do Storage segue o exemplo abaixo:
|
|
|
|
|
|
```typescript
|
|
|
{ // raiz do Storage
|
|
|
[userId: string]: {
|
|
|
exams: {
|
|
|
[creationDate: number /* timestamp */]: File[] // imagens do exame
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
```
|
... | ... | |