ViconSaga Java Backend
Documentação Técnica Completa
Versão: 1.0.0
Organização: Fiocruz / Fiotec
Repositório: github.com/drcalifornia/viconsaga_fiotec_java
Sumário
- Visão Geral do Projeto
- Arquitetura e Estrutura do Projeto
- Configuração e Ambiente
- Como Executar a Aplicação
- Segurança e Autorização
- Endpoints da API REST
- Modelos de Dados
- Serviços e Lógica de Negócio
- Infraestrutura e DevOps
- Testes e Cobertura
- Sistema de Upload de Arquivos
- Convenções e Padrões de Código
- Apêndice
1. Visão Geral do Projeto
1.1 Descrição
O ViconSaga Java é um backend REST desenvolvido com Spring Boot para o sistema de gerenciamento de projetos, formulários e coleta de dados georreferenciados da Fiocruz. O sistema é a implementação Java do projeto ViconSaga (Vigilância Comunitária com Saúde e Geoprocessamento Ativo), integrado à infraestrutura da Fiotec.
1.2 Principais Funcionalidades
- Autenticação e autorização via Keycloak (OAuth2/JWT)
- Gerenciamento de projetos com controle de acesso por workgroups
- Criação e gestão de formulários dinâmicos com múltiplos tipos de campos
- Registro de dados georreferenciados (pontos, linhas, áreas)
- Upload e download de arquivos para registros e projetos
- Gestão de usuários integrada ao SSO Keycloak
- Documentação automática via Swagger/OpenAPI 3
- Migrações de banco de dados com Flyway
- Cobertura de testes unitários com JaCoCo (mínimo 80%)
1.3 Stack Tecnológica
| Tecnologia |
Versão |
Finalidade |
| Java |
21 |
Linguagem principal |
| Spring Boot |
4.0.2 |
Framework web e IoC |
| Spring Security + OAuth2 |
4.0.x |
Autenticação e autorização |
| Spring Data JPA |
4.0.x |
Persistência de dados |
| Keycloak |
22.0.0 |
Identity Provider / SSO |
| MySQL |
8.0 |
Banco de dados relacional |
| Flyway |
10.x |
Migração de banco de dados |
| MapStruct |
1.6.3 |
Mapeamento de DTOs |
| Lombok |
1.18.x |
Redução de boilerplate |
| SpringDoc OpenAPI |
2.8.4 |
Documentação Swagger |
| JaCoCo |
0.8.14 |
Cobertura de testes |
| Docker / Docker Compose |
— |
Containerização |
| MailHog |
latest |
Mock SMTP para desenvolvimento |
2. Arquitetura e Estrutura do Projeto
2.1 Visão Arquitetural
O sistema segue uma arquitetura em camadas baseada nos padrões do Spring Boot, com separação clara de responsabilidades entre Controllers, Services, Repositories e Models. O projeto está dividido em três domínios principais:
| Domínio |
Pacote |
Responsabilidade |
| Autenticação |
authentication |
Login, refresh token, sincronização com Keycloak |
| Projeto |
project |
Projetos, formulários, registros, arquivos |
| Usuário |
user |
CRUD de usuários, roles Keycloak, recuperação de senha |
| Comum |
common |
Configurações, exceções, serviços compartilhados |
2.2 Estrutura de Pacotes
br.fiocruz.viconsaga
├── ViconSagaApplication.java
├── authentication/
│ ├── config/ # KeycloakConfig
│ ├── controller/ # LoginController, AuthController
│ ├── dto/ # LoginRequestDTO, LoginResponseDTO, RefreshTokenDTO
│ └── service/ # LoginService
├── common/
│ ├── config/ # CorsConfig, JacksonConfig, OpenApiConfig, SecurityConfig
│ ├── constant/ # HttpStatusCode
│ ├── dto/ # ApiResponse, UploadProgressDTO
│ ├── exception/ # GlobalExceptionHandler, exceções customizadas
│ └── service/ # FileStorageService, SecurityService, TokenService,
│ # UploadProgressTrackerService
├── project/
│ ├── adapter/ # Implementações dos repositórios
│ ├── controller/ # 7 controllers REST
│ ├── dto/ # ~25 DTOs
│ ├── mapper/ # MapStruct mappers
│ ├── model/ # 18 entidades JPA
│ ├── repository/ # Spring Data interfaces
│ ├── service/ # Lógica de negócio
│ │ ├── fieldhandler/ # Handlers por tipo de campo
│ │ └── validation/ # Validadores de registros
│ └── specification/ # JPA Specifications para filtros
└── user/
├── adapter/ # UserRepositoryAdapter
├── controller/ # UserController
├── dto/ # UserDTO, UserSummaryDTO, AssignRolesDTO
├── mapper/ # UserMapper
├── model/ # User
├── repository/ # UserRepository
└── service/ # UserService, KeycloakUserService, PasswordRecoveryService
2.3 Padrão de Resposta da API
Todas as respostas da API seguem o padrão envelope ApiResponse<T>:
{
"success": true,
"data": { ... },
"message": "Operação realizada com sucesso"
}
2.4 Design Pattern: Field Handler
Para o processamento de campos de formulário com múltiplos tipos de dados, foi implementado o padrão Strategy com a interface FieldValueHandler e um Registry. Cada tipo de campo (Text, Numeric, Date, Time, TimeSerie, Unichoice, Multichoice) possui seu próprio Handler e Validator registrados no FieldValueHandlerRegistry.
3. Configuração e Ambiente
3.1 Pré-requisitos
| Requisito |
Versão Mínima |
Link |
| Java JDK |
21 |
oracle.com/java/technologies/downloads |
| Maven |
3.8+ |
maven.apache.org |
| Docker |
20+ |
docs.docker.com/get-docker |
| Docker Compose |
2.0+ |
docs.docker.com/compose/install |
3.2 Variáveis de Ambiente
O projeto usa arquivos .env para centralizar configurações por ambiente:
| Variável |
Padrão (local-dev) |
Descrição |
DB_HOST |
localhost |
Host do banco de dados |
DB_PORT |
3309 |
Porta do MySQL |
DB_NAME |
viconsaga |
Nome do banco de dados |
DB_USER |
viconsaga |
Usuário do banco |
DB_PASSWORD |
secret |
Senha do banco |
KEYCLOAK_URL |
http://localhost:8088 |
URL do Keycloak |
KEYCLOAK_REALM |
fiocruz |
Realm do Keycloak |
KEYCLOAK_CLIENT_ID |
viconsaga-backend |
Client ID |
KEYCLOAK_CLIENT_SECRET |
*** |
Client Secret |
KEYCLOAK_ADMIN_USERNAME |
admin |
Admin do Keycloak |
KEYCLOAK_ADMIN_PASSWORD |
admin |
Senha do admin Keycloak |
ALLOWED_ORIGINS |
http://localhost:4200 |
CORS origins permitidas |
FLYWAY_ENABLED |
true |
Habilitar migrações automáticas |
LOGGING_LEVEL |
INFO |
Nível de log |
FILE_UPLOAD_DIR |
uploads |
Diretório de upload |
IMAGE_VERSION |
local-dev |
Versão da imagem Docker |
SPRINGDOC_SERVERS_URL |
http://localhost:8889 |
URL base para o Swagger |
3.3 Configuração por Ambiente
Para selecionar o ambiente, copie o arquivo correspondente:
# Desenvolvimento local
cp .env.local-dev .env
# Produção (saudeterritorial.com.br)
cp .env.saudeterritorial .env
4. Como Executar a Aplicação
4.1 Via Docker Compose (Recomendado)
Sobe todos os serviços (API, MySQL, Keycloak, MySQL do Keycloak, MailHog):
docker compose up -d
A aplicação estará disponível em:
| Serviço |
URL |
| API |
http://localhost:8880 |
| Swagger UI |
http://localhost:8880/swagger-ui/index.html |
| Keycloak |
http://localhost:8088 (admin / admin) |
| MailHog Web UI |
http://localhost:8025 |
| MySQL |
localhost:3309 (viconsaga / secret) |
4.2 Via IDE (IntelliJ / VS Code)
Com o Docker Compose rodando apenas os serviços de infraestrutura:
# Suba apenas os serviços de suporte
docker compose up -d viconsaga-mysql keycloak keycloak-mysql mailhog
# Execute a aplicação Spring Boot
mvn spring-boot:run
Neste caso, o Swagger estará em: http://localhost:8889/swagger-ui/index.html
4.3 Configuração Inicial do Keycloak
Após subir o Keycloak, é necessário criar um usuário no realm fiocruz:
- Acesse http://localhost:8088 e faça login com
admin / admin
- Selecione o realm
fiocruz
- Crie um usuário com email e senha (marque Temporary: off em Credentials)
- Atribua as Client Roles do client
viconsaga-backend conforme necessário
Roles disponíveis: SystemAdministrator, ProjectAdministrator, Manager, Editor, Visitor
4.4 Obtendo um Token de Acesso
curl -X POST http://localhost:8088/realms/fiocruz/protocol/openid-connect/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "client_id=viconsaga-backend" \
-d "client_secret=SEU_SECRET" \
-d "username=seu@email.com" \
-d "password=sua_senha" \
-d "grant_type=password"
5. Segurança e Autorização
5.1 Modelo de Autenticação
A aplicação utiliza OAuth2 Resource Server com tokens JWT emitidos pelo Keycloak. Cada requisição autenticada deve incluir o header:
Authorization: Bearer <token_jwt>
5.2 Perfis de Acesso (Roles)
| Role |
Descrição |
Nível de Acesso |
SystemAdministrator |
Administrador do sistema |
Acesso total a todos os recursos |
ProjectAdministrator |
Administrador de projetos |
Gerencia projetos e usuários do projeto |
Manager |
Gerente |
Acesso de gerenciamento parcial |
Editor |
Editor |
Pode criar/editar registros e formulários |
Visitor |
Visitante |
Acesso somente leitura |
5.3 Controle de Permissão por Endpoint
| Módulo |
Roles Autorizadas |
Observação |
POST /auth/login |
Público |
Autenticação inicial |
POST /auth/refresh-token |
Público |
Renovação de token |
GET /auth/all-roles |
SA, PA |
Lista roles disponíveis |
GET /projects/ |
SA |
Listagem geral de projetos |
GET /projects/{id} |
SA, PA |
Valida permissão de workgroup |
POST /projects |
SA, PA |
Cria projeto |
PUT /projects/{id} |
SA, PA |
Atualiza projeto |
DELETE /projects/{id} |
SA, PA |
Soft delete do projeto |
GET/POST/PUT/DELETE /forms |
SA, PA, ED |
Gestão de formulários |
GET/POST/PUT/DELETE /forms/{id}/fields |
SA, PA |
Gestão de campos |
GET/POST/DELETE /records |
SA, PA, ED |
Registros de formulário |
GET /users/ |
SA |
Lista todos usuários |
GET/POST /users/* |
SA, PA |
Gestão de usuários |
Legenda: SA = SystemAdministrator | PA = ProjectAdministrator | ED = Editor
5.4 Configuração de CORS
As origens permitidas são configuráveis via variável ALLOWED_ORIGINS. No ambiente local, o padrão é:
http://localhost:4200, http://localhost:4201
6. Endpoints da API REST
6.1 Autenticação — /auth
| Método |
Endpoint |
Descrição |
Auth |
POST |
/auth/login |
Autenticar usuário via Keycloak e sincronizar com DB local |
Público |
POST |
/auth/refresh-token |
Renovar token de acesso com refresh token |
Público |
GET |
/auth/all-roles |
Listar todos os roles disponíveis no sistema |
SA, PA |
6.2 Projetos — /projects
| Método |
Endpoint |
Descrição |
Auth |
GET |
/projects/ |
Listar projetos com paginação e filtros |
SA |
GET |
/projects/{idProject} |
Buscar projeto por ID |
SA, PA |
POST |
/projects |
Criar novo projeto |
SA, PA |
PUT |
/projects/{idProject} |
Atualizar projeto existente |
SA, PA |
DELETE |
/projects/{idProject} |
Soft delete de projeto |
SA, PA |
Parâmetros de filtro aceitos no GET /projects/:
| Parâmetro |
Tipo |
Descrição |
page |
Integer |
Página (padrão: 0) |
pageSize |
Integer |
Itens por página (padrão: 10) |
sortBy |
String |
Campo de ordenação |
sortDirection |
String |
ASC ou DESC (padrão: ASC) |
strName |
String |
Filtro por nome do projeto |
strAlias |
String |
Filtro por alias |
txtDescription |
String |
Filtro por descrição |
idUserCreator |
Integer |
Filtro por criador |
idCountry |
Integer |
Filtro por país |
blnActive |
Boolean |
Filtro por status ativo |
userIds |
Integer[] |
Filtro por IDs de usuários associados |
| Método |
Endpoint |
Descrição |
Auth |
GET |
/forms |
Listar formulários com paginação e filtros |
SA, PA, ED |
GET |
/forms/{idForm} |
Buscar formulário por ID |
SA, PA, ED |
POST |
/forms |
Criar novo formulário |
SA, PA, ED |
PUT |
/forms/{idForm} |
Atualizar formulário |
SA, PA, ED |
DELETE |
/forms/{idForm} |
Remover formulário |
SA, PA, ED |
| Método |
Endpoint |
Descrição |
Auth |
GET |
/forms/{idForm}/fields |
Listar campos do formulário |
SA, PA |
POST |
/forms/{idForm}/fields |
Adicionar campo ao formulário |
SA, PA |
PUT |
/forms/fields/{idFormField} |
Atualizar campo |
SA, PA |
DELETE |
/forms/fields/{idFormField} |
Remover campo |
SA, PA |
GET |
/forms/fields/{idFormField}/alternatives |
Listar alternativas de um campo |
SA, PA |
POST |
/forms/fields/{idFormField}/alternatives |
Criar alternativa |
SA, PA, ED |
PUT |
/forms/fields/alternatives/{id} |
Atualizar alternativa |
SA, PA |
DELETE |
/forms/fields/alternatives/{id} |
Remover alternativa |
SA, PA |
6.5 Registros — /records
| Método |
Endpoint |
Descrição |
Auth |
GET |
/records |
Listar registros com paginação e filtros |
SA, PA, ED |
GET |
/records/{idFormRecord} |
Buscar registro por ID (UUID) |
SA, PA, ED |
POST |
/records/save |
Salvar registro com todos os valores de campos |
SA, PA, ED |
DELETE |
/records/{idFormRecord} |
Soft delete de registro |
SA, PA, ED |
Parâmetros de filtro do GET /records: idProject, idUser, idForm, idDevice, page, size
6.6 Arquivos de Registros — /records/{id}/files
| Método |
Endpoint |
Descrição |
Auth |
POST |
/records/{idFormRecord}/files/upload |
Upload de arquivo (max 10MB) |
SA, PA, ED |
POST |
/records/{idFormRecord}/files/url |
Anexar URL de arquivo externo |
SA, PA, ED |
GET |
/records/{idFormRecord}/files |
Listar arquivos do registro |
Todos |
GET |
/records/{idFormRecord}/files/{id}/download |
Download de arquivo |
Todos |
PATCH |
/records/{idFormRecord}/files/{id}/description |
Atualizar descrição |
SA, PA, ED |
DELETE |
/records/{idFormRecord}/files/{id} |
Remover arquivo |
SA, PA, ED |
GET |
/records/files/upload-progress/{uploadId} |
Verificar progresso do upload |
Todos |
6.7 Arquivos de Projetos — /projects/{id}/files
| Método |
Endpoint |
Descrição |
Auth |
POST |
/projects/{idProject}/files/upload |
Upload de arquivo para projeto (max 10MB) |
SA, PA |
GET |
/projects/{idProject}/files |
Listar arquivos do projeto |
SA, PA |
GET |
/projects/{idProject}/files/{id}/download |
Download de arquivo do projeto |
SA, PA, ED |
DELETE |
/projects/{idProject}/files/{id} |
Remover arquivo do projeto |
SA, PA |
PATCH |
/projects/{idProject}/files/{id}/description |
Atualizar descrição |
SA, PA |
6.8 Usuários de Projetos — /api/project-users
| Método |
Endpoint |
Descrição |
Auth |
GET |
/api/project-users/project/{idProject} |
Listar usuários do projeto (paginado) |
SA, PA |
POST |
/api/project-users/project/{idProject}/add/{idUser} |
Adicionar usuário ao projeto |
SA, PA |
DELETE |
/api/project-users/project/{idProject}/remove/{idUser} |
Remover usuário do projeto |
SA, PA |
GET |
/api/project-users/project/{idProject}/not-in-project |
Listar usuários NÃO no projeto |
SA, PA |
6.9 Usuários — /users
| Método |
Endpoint |
Descrição |
Auth |
GET |
/users/ |
Listar todos os usuários ativos |
SA |
GET |
/users/{idUser} |
Buscar usuário por ID |
SA, PA |
GET |
/users/email/{email} |
Buscar usuário por email |
SA, PA |
GET |
/users/projects/ |
Projetos do usuário autenticado (paginado) |
SA, PA, ED |
GET |
/users/{idUser}/roles |
Roles do usuário no SSO |
SA, PA |
POST |
/users/{idUser}/assign-roles |
Atribuir roles ao usuário |
SA, PA |
POST |
/users/import-from-sso |
Importar usuário do Keycloak por email |
SA, PA |
POST |
/users/recover-password |
Enviar email de recuperação de senha |
Público |
DELETE |
/users/{idUser} |
Soft delete de usuário |
SA |
PATCH |
/users/{idUser}/active |
Ativar/desativar usuário |
SA |
7. Modelos de Dados
7.1 Entidades Principais
| Entidade |
Tabela |
Descrição |
Project |
project |
Projeto de coleta de dados georreferenciados |
User |
user |
Usuário do sistema, vinculado ao Keycloak |
ProjectWorkgroup |
projectworkgroup |
Grupo de trabalho de um projeto |
UserProjectWorkgroup |
userprojectworkgroup |
Associação usuário-workgroup-projeto |
Form |
form |
Formulário de coleta dentro de um projeto |
FormField |
formfield |
Campo de um formulário (texto, numérico, etc.) |
FormFieldType |
formfieldtype |
Tipo de campo (7 tipos suportados) |
FormFieldAlternative |
formfieldalternative |
Alternativas para campos de escolha |
FormRecord |
formrecord |
Registro/coleta de dados (UUID como PK) |
FormRecordField |
formrecordfield |
Valor de um campo em um registro |
FormRecordFieldText |
formrecordfieldtext |
Valor textual de um campo |
FormRecordFieldNumeric |
formrecordfieldnumeric |
Valor numérico de um campo |
FormRecordFieldDate |
formrecordfielddate |
Valor de data de um campo |
FormRecordFieldTime |
formrecordfieldtime |
Valor de hora de um campo |
FormRecordFieldTimeSerie |
formrecordfieldtimeserie |
Série temporal de um campo |
FormRecordFieldAlternative |
formrecordfieldalternative |
Escolha selecionada em um campo |
FormRecordVertex |
formrecordvertex |
Vértices geográficos de um registro |
FormRecordFile |
formrecordfile |
Arquivo anexado a um registro |
ProjectFile |
projectfile |
Arquivo anexado a um projeto |
ShapeType |
shapetype |
Tipo de geometria (Point, Line, Area) |
| ID |
Tipo |
Tabela de Valor |
Descrição |
| 1 |
Text |
formrecordfieldtext |
Campo de texto livre |
| 2 |
Numeric |
formrecordfieldnumeric |
Campo numérico (double) |
| 3 |
Unichoice |
formrecordfieldalternative |
Escolha única entre alternativas |
| 4 |
Multichoice |
formrecordfieldalternative |
Múltipla escolha entre alternativas |
| 5 |
Date |
formrecordfielddate |
Campo de data |
| 6 |
Time |
formrecordfieldtime |
Campo de hora |
| 7 |
TimeSerie |
formrecordfieldtimeserie |
Série temporal com data-hora e valor |
7.3 Migrações Flyway
| Versão |
Arquivo |
Descrição |
| V1 |
V1__base_structure.sql |
Estrutura base completa com dados iniciais |
| V2 |
V2__inserts.sql |
Dados iniciais adicionais |
| V3 |
V3__remove_idProject_from_user.sql |
Remove relação direta projeto-usuário |
| V4 |
V4__insert_form_samples_inserts.sql |
Dados de exemplo de formulários |
| V5 |
V5__add_blnRequired_to_formfield.sql |
Adiciona campo obrigatório ao FormField |
| V6 |
V6__add_blnCanAddChoice_to_formfield.sql |
Permite adicionar escolhas dinamicamente |
| V7 |
V7__add_externalUrl_to_project.sql |
URL externa para projetos |
| V8 |
V8__add_lngFileSize_to_projectfile.sql |
Tamanho de arquivo em ProjectFile |
| V9 |
V9__add_projectfile_columns_if_missing.sql |
Colunas opcionais em ProjectFile |
| V10 |
V10__add_dtLastUpdate_to_project.sql |
Data de última atualização do projeto |
| V11 |
V11__create_job_queue.sql |
Fila de jobs assíncronos |
| V12 |
V12__add_retry_columns_to_jobqueue.sql |
Colunas de retry na fila |
| V13 |
V13__add_fail_reason_to_jobqueue.sql |
Razão de falha na fila |
| V14 |
V14__add_dtDeleted_to_project.sql |
Soft delete de projetos |
8. Serviços e Lógica de Negócio
8.1 Serviços do Domínio Project
| Serviço |
Responsabilidade Principal |
ProjectService |
CRUD de projetos, paginação, filtros, soft delete, projetos do usuário |
FormService |
CRUD de formulários, listagem paginada por projeto |
FormFieldService |
Gerenciamento de campos e alternativas de formulários |
FormRecordService |
Salvar registros com todos os tipos de campo, paginação, soft delete |
FormRecordFileService |
Upload/download/delete de arquivos vinculados a registros |
ProjectFileService |
Upload/download/delete de arquivos vinculados a projetos |
8.2 Serviços do Domínio User
| Serviço |
Responsabilidade Principal |
UserService |
CRUD de usuários, importação do Keycloak, atribuição de roles, soft delete |
KeycloakUserService |
Integração com API Admin do Keycloak para gerenciar usuários e roles |
PasswordRecoveryService |
Dispara fluxo de recuperação de senha via Keycloak |
8.3 Serviços Comuns
| Serviço |
Responsabilidade Principal |
LoginService |
Autenticação via Keycloak, sincronização do usuário com banco local |
SecurityService |
Extração de informações do token JWT, validação de permissões |
TokenService |
Extração de claims do token JWT (userId, roles) |
FileStorageService |
Armazenamento físico de arquivos no sistema de arquivos |
UploadProgressTrackerService |
Rastreamento em memória do progresso de uploads |
8.4 Sistema de Validação de Registros
Antes de salvar um FormRecord, o FormRecordRequestValidator executa as seguintes validações:
- Verifica se os campos obrigatórios estão preenchidos
- Delega a validação do valor para o
FieldValueValidator correspondente ao tipo
- Valida URLs externas anexadas via
FormRecordFileUrlValidator
- Lança
FormRecordRequestValidationException com detalhes dos erros encontrados
9. Infraestrutura e DevOps
9.1 Serviços Docker Compose
| Serviço |
Imagem |
Porta |
Descrição |
viconsaga-api |
Build local |
8880:8889 |
Backend Spring Boot |
viconsaga-mysql |
mysql:8.0 |
3309:3306 |
Banco de dados da aplicação |
keycloak |
Build local |
8088:8080 |
Identity Provider |
keycloak-mysql |
mysql:8.0 |
3310:3306 |
Banco de dados do Keycloak |
mailhog |
mailhog/mailhog |
1025/8025 |
Mock SMTP + Web UI |
9.2 Dockerfile da Aplicação
A imagem é baseada em eclipse-temurin:21 e realiza o build Maven durante a construção:
FROM eclipse-temurin:21
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn clean package -DskipTests
EXPOSE 8889
CMD ["java", "-jar", "target/vigiante.jar"]
9.3 Keycloak Customizado
O Keycloak utiliza um Dockerfile customizado que inclui:
- Importação automática do realm
fiocruz (fiocruz-realm-export.json)
- Tema personalizado
vigiante para emails e tela de boas-vindas
- Templates de email customizados em FreeMarker (
.ftl)
9.4 Volumes Persistentes
java_db_data — Dados do MySQL da aplicação
java_keycloak_data — Dados do MySQL do Keycloak
./uploads — Arquivos enviados pelos usuários (mapeado no container)
10. Testes e Cobertura
10.1 Estrutura de Testes
| Módulo |
Classes de Teste |
authentication.controller |
AuthControllerTest, LoginControllerTest |
authentication.service |
LoginServiceTest |
common.service |
FileStorageServiceTest, SecurityServiceTest, TokenServiceTest, UploadProgressTrackerServiceTest |
project.controller |
FormControllerTest, FormFieldControllerTest, FormRecordControllerTest, FormRecordFileControllerTest, ProjectControllerTest, ProjectFileControllerTest, ProjectUserControllerTest |
project.service |
FormFieldServiceTest, FormRecordFileServiceTest, FormRecordServiceTest, FormServiceTest, ProjectFileServiceTest, ProjectServiceTest |
project.service.fieldhandler |
DateFieldHandlerTest, MultichoiceFieldHandlerTest, NumericFieldHandlerTest, TextFieldHandlerTest, TimeFieldHandlerTest, TimeSerieFieldHandlerTest, UnichoiceFieldHandlerTest |
project.service.validation |
FormRecordFileUrlValidatorTest, FormRecordRequestValidatorTest |
project.service.validation.fieldvalidators |
8 validators testados |
project.specification |
FormRecordSpecificationTest, FormSpecificationTest, ProjectSpecificationTest |
user.controller |
UserControllerTest |
user.service |
KeycloakUserServiceTest, UserServiceTest |
10.2 Executando os Testes
# Executar todos os testes
mvn clean test
# Executar com relatório de cobertura (perfil coverage)
mvn clean test -Pcoverage
O relatório HTML é gerado em:
target/site/jacoco/index.html
10.3 Configuração de Cobertura
| Parâmetro |
Valor |
| Cobertura mínima de linhas |
80% |
| Cobertura mínima de branches |
80% |
| Ferramenta |
JaCoCo 0.8.14 |
| Escopo |
Por classe |
Classes excluídas da verificação: exception/**, config/**, dto/**, adapter/**, model/**, mapper/**, constant/**, fieldhandler/**, specification/**, util/**, ViconSagaApplication
11. Sistema de Upload de Arquivos
11.1 Configuração de Arquivos
| Configuração |
Valor Padrão |
| Diretório de upload |
uploads/ |
| Tamanho máximo por arquivo |
10MB |
| Tamanho máximo da requisição |
10MB |
| Threshold para disco |
2KB |
| Extensões permitidas |
jpg, jpeg, png, gif, pdf, doc, docx, xls, xlsx, txt, csv, mp4, avi, mov |
11.2 Fluxo de Upload
- Cliente envia
POST /records/{id}/files/upload com multipart/form-data
- API cria um
uploadId e retorna junto com a resposta
FileStorageService salva o arquivo com nome único (UUID) no diretório configurado
- Cliente pode consultar o progresso via
GET /records/files/upload-progress/{uploadId}
- Registro do arquivo é salvo na tabela
formrecordfile com nome original e tamanho
11.3 URLs Externas
Além do upload local, é possível anexar URLs externas a registros. URLs de certos domínios são bloqueadas por configuração (ex: youtube.com). A URL é armazenada no campo strFileOriginalName da tabela formrecordfile.
12. Convenções e Padrões de Código
12.1 Nomenclatura
| Contexto |
Convenção |
Exemplo |
| Colunas de banco (booleanos) |
Prefixo bln |
blnActive, blnDeleted |
| Colunas de banco (strings) |
Prefixo str |
strName, strEmail |
| Colunas de banco (texto longo) |
Prefixo txt |
txtDescription |
| Colunas de banco (inteiros) |
Prefixo int/lng |
intOrder, lngFileSize |
| Colunas de banco (decimais) |
Prefixo dbl |
dblLatitude, dblLongitude |
| Colunas de banco (datas) |
Prefixo dt |
dtCreation, dtLastUpdate |
| PKs de entidades |
id + NomeDaEntidade |
idProject, idFormRecord |
| Classes de serviço |
NomeDomínio + Service |
ProjectService, LoginService |
| Classes de controller |
NomeDomínio + Controller |
ProjectController |
| DTOs |
Finalidade + DTO |
LoginRequestDTO, FormRecordDTO |
| Mappers |
NomeDomínio + Mapper |
ProjectMapper, FormFieldMapper |
12.2 Tratamento de Erros
O GlobalExceptionHandler centraliza o tratamento de exceções e retorna respostas padronizadas:
| Exceção |
HTTP Status |
AuthenticationException |
401 Unauthorized |
ResourceNotFoundException |
404 Not Found |
FileStorageException |
400 Bad Request ou 404 |
FormRecordRequestValidationException |
400 com detalhes de validação |
Exception genérica |
500 Internal Server Error |
12.3 Soft Delete
Projetos e registros de formulário utilizam soft delete: ao invés de remover fisicamente, um campo de data de exclusão (dtDeleted) é preenchido. Consultas filtram automaticamente registros com dtDeleted != null.
12.4 Paginação
Todas as listagens que podem retornar muitos resultados utilizam paginação com parâmetros padronizados: page (0-indexado), pageSize/size, sortBy e sortDirection.
13. Apêndice
13.1 Links Úteis
| Recurso |
URL (ambiente local) |
| Swagger UI (Docker Compose) |
http://localhost:8880/swagger-ui/index.html |
| Swagger UI (IDE) |
http://localhost:8889/swagger-ui/index.html |
| OpenAPI JSON |
http://localhost:8889/v3/api-docs |
| Keycloak Admin |
http://localhost:8088 |
| MailHog Web UI |
http://localhost:8025 |
| Relatório JaCoCo |
target/site/jacoco/index.html (após rodar testes) |
13.2 Variáveis de Build
| Variável |
Descrição |
IMAGE_VERSION |
Versão da imagem Docker (passada como ARG no Dockerfile) |
JAVA_OPTS |
Opções JVM (ex: -Xmx512m) |
13.3 Comandos Úteis
# Subir todos os serviços
docker compose up -d
# Acompanhar logs da API
docker logs -f viconsaga-api
# Executar testes
mvn clean test
# Executar testes com cobertura
mvn clean test -Pcoverage
# Build sem testes
mvn clean package -DskipTests
# Verificar banco de dados
mysql -h localhost -P 3309 -u viconsaga -psecret viconsaga