Este projeto trata-se de uma API para um sistema de gerenciamento de estudantes, contendo as funcionalidades básicas para cadastrar e matricular alunos em uma turma, cadastrar e atribuir professores a uma turma. Também é possível obter as listas de turmas, estudantes e professores, e alterar os dados desses objetos.
classDiagram
class Estudante {
+ Long id
+ String nome
+ String nomeResponsavel
+ String contatoResponsavel
+ String dataNascimento
+ Boolean estaAtivo
+ LocalDate dataMatricula
+ Turma turma
}
class Turma {
+ Long id
+ String identificacaoTurma
+ Boolean estaAtiva
+ List<Estudante> estudantes
+ List<Professor> professores
}
class Professor {
+ Long id
+ String nome
+ String email
+ String disciplina
+ List<Turma> turmas
}
Turma --> "1..*" Estudante
Turma --> "*..*" Professor
class EstudanteService {
+ EstudanteRepository estudanteRepository
+ save(Estudante estudante): Estudante
+ findById(Long id): Estudante
+ findAll(): List<Estudante>
}
class TurmaService {
+ TurmaRepository turmaRepository
+ save(Turma turma): Turma
+ findById(Long id): Turma
+ findAll(): List<Turma>
}
class ProfessorService {
+ ProfessorRepository professorRepository
+ save(Professor professor): Professor
+ findById(Long id): Professor
+ findAll(): List<Professor>
}
class EstudanteRepository {
+ save(Estudante estudante): Estudante
+ findById(Long id): Estudante
+ findAll(): List<Estudante>
}
class TurmaRepository {
+ save(Turma turma): Turma
+ findById(Long id): Turma
+ findAll(): List<Turma>
}
class ProfessorRepository {
+ save(Professor professor): Professor
+ findById(Long id): Professor
+ findAll(): List<Professor>
+ filtrarPorNome(String nome): ResponseEntity<?>
}
class EstudanteController {
+ estudanteService: EstudanteService
+ cadastrarEstudante(EstudanteDTO estudanteDTO): ResponseEntity<?>
+ listarTodos(): ResponseEntity<List<EstudanteDTO>>
+ editarEstudante(Long id, EstudanteDTO estudanteDTO): ResponseEntity<?>
+ filtrarPorId(Long id): ResponseEntity<?>
+ filtrarPorNome(String nome): ResponseEntity<?>
+ filtrarPorStatus(Boolean estaAtivo): ResponseEntity<?>
}
class TurmaController {
+ turmaService: TurmaService
+ criarTurma(TurmaDTO turmaDTO): ResponseEntity<?>
+ listarTodas(): ResponseEntity<List<TurmaDTO>>
+ editarTurma(Long id, TurmaDTO turmaDTO): ResponseEntity<?>
+ filtrarPorStatus(Boolean estaAtivo): ResponseEntity<?>
}
class ProfessorController {
+ professorService: ProfessorService
+ cadastrarProfessor(ProfessorDTO professorDTO): ResponseEntity<?>
+ listarTodos(): ResponseEntity<List<ProfessorDTO>>
+ editarProfessor(Long id, ProfessorDTO professorDTO): ResponseEntity<?>
+ filtrarPorNome(String nome): ResponseEntity<?>
}
class CustomExceptionHandler {
+ handleNotFoundException()
+ handleBadRequestException()
+ handleInternalServerError()
}
EstudanteController --> EstudanteService
TurmaController --> TurmaService
ProfessorController --> ProfessorService
EstudanteService --> EstudanteRepository
TurmaService --> TurmaRepository
ProfessorService --> ProfessorRepository
Estudante --> EstudanteController
Turma --> TurmaController
Professor --> ProfessorController
- Ferramentas Utilizadas
- Pré-requisitos
- Métodos Implementados
- Documentação da API
- Métodos de busca e listagem
- Testes Unitários
- Autoras
Back-end:
- Java
- Spring Boot
- PostgreSQL
- H2
- Authentication
- JUnit
- Mockito
- JaCoCo
Java instalado (versão 17 ou superior) e conexão com o banco de dados H2 ou Postgres. Para utilizar a API será necessário colocar o USUÁRIO e SENHA, tanto no banco de dados quanto na plataforma usada para fazer as requisições HTTPs.
Estudantes
-
GET/estudante -
POST/estudante -
PATCH/estudante/{id} -
PUT/estudante/{id} -
GET/estudante?nomeAluno -
GET/estudante?status=
Professores
-
POST/professor -
PUT/professor/:id -
GET/professor -
GET/professor?nomeProfessor -
PATCH/professor/:id
Turma
-
POST/turma -
PUT/turma/{id} -
GET/turma -
GET/turma/{id} -
PATCH/turma/{id}
POST /estudante| Parâmetro | Tipo | Descrição |
|---|---|---|
nomeAluno |
string |
Obrigatório. |
nomeResponsável |
string |
Obrigatório. |
contatoResponsável |
string |
Obrigatório. |
estaAtivo |
string |
Obrigatório. |
| Exemplo: |
// Corpo da requisição para cadastro de aluno
{
"nomeAluno": "Ana Clara",
"nomeResponsavel": "Luiz",
"dataNascimento": "02/12/1994",
"contatoResponsavel": "19 99634535",
"estaAtivo:" true
}Exemplo de Resposta
{
"id": 4,
"estaAtivo": true,
"nomeAluno": "Ana Clara",
"dataNascimento": "02/12/1994",
"nomeResponsavel": "Luiz",
"contatoResponsavel": "19 99634535",
"dataDeCadastro": "2024-02-25T16:21:44.029981",
"dataAtualizacao": null
} PUT /estudante/idMétodo utilizado para atualizar todos os dados do estudante.
| Parâmetro | Tipo | Descrição |
|---|---|---|
nomeAluno |
string |
Obrigatório. |
nomeResponsável |
string |
Obrigatório. |
contatoResponsável |
string |
Obrigatório. |
dataNascimento |
string |
Obrigatório. |
PATCH /estudante/id| Parâmetro | Tipo | Descrição |
|---|---|---|
nomeAluno |
string |
Opcional. |
nomeResponsável |
string |
Opcional. |
contatoResponsável |
string |
Opcional. |
dataNascimento |
string |
Opcional. |
turma_id |
string |
Opcional. |
POST /turma| Parâmetro | Tipo | Descrição |
|---|---|---|
nomeTurma |
string |
Obrigatório. |
estaAtiva |
boolean |
Obrigatório. . |
| Exemplo: |
{
"nomeTurma": "Programação Web II",
"estaAtiva": true
} PUT e PATCH /turma/id| Parâmetro | Tipo | Descrição |
|---|---|---|
nomeTurma |
string |
Obrigatório para PUT e Opcional para PATCH. |
estaAtiva |
string |
Obrigatório para PUT e Opcional para PATCH. |
POST /professor| Parâmetro | Tipo | Descrição |
|---|---|---|
nomeProfessor |
string |
Obrigatório. |
email |
string |
Obrigatório. |
disciplinaLecionada |
string |
Obrigatório. |
estaAtivo |
boolean |
Opcional. |
| Exemplo: |
{
"nomeProfessor": "Brunno Nogueira",
"email": "brunno.nogueira@example.com",
"disciplinaLecionada": "Programação Web II"
}Exemplo de Resposta
{
"id": 1,
"nomeProfessor": "Brunno Nogueira",
"email": "brunno.nogueira@example.com",
"disciplinaLecionada": "Programação Web II",
"estaAtivo": null,
"listaTurmas": []
} PUT e PATCH /professor/id| Parâmetro | Tipo | Descrição |
|---|---|---|
nomeProfessor |
string |
Obrigatório para PUT e Opcional para PATCH. |
email |
string |
Obrigatório para PUT e Opcional para PATCH. |
disciplinaLecionada |
string |
Obrigatório para PUT e Opcional para PATCH. |
PATCH /professor/id
| Parâmetro | Tipo | Descrição |
|---|---|---|
turmaId |
string |
Obrigatório para PUT e Opcional para PATCH. |
PATCH /estudante/id| Parâmetro | Tipo | Descrição |
|---|---|---|
turma_id |
int |
Obrigatório. |
Exemplo:
{
"turma_id": 1,
} GET /estudante/id
GET /professor/id
GET /turma/id
Retorna um estudante, professor ou turma específica que é encontrada no banco de dados pela busca por id. Quando não encontrado, obtemos a resposta "null".
Exemplo para GET /turma/1
{
"id": 1,
"nomeTurma": "Programação Web II",
"estaAtiva": true,
"estudantes": [
{
"id": 1,
"estaAtivo": false,
"nomeAluno": "Ana Clara",
"dataNascimento": "02/12/1994",
"nomeResponsavel": "Luiz",
"contatoResponsavel": "19 99634535",
"dataDeCadastro": "2024-02-25T16:16:48.913131",
"dataAtualizacao": "2024-02-25T17:10:35.220755"
},
{
"id": 2,
"estaAtivo": true,
"nomeAluno": "Raquel Tamagnoni",
"dataNascimento": "2005-10-15",
"nomeResponsavel": "Waldete Tamagnoni",
"contatoResponsavel": "waldetea@xample.com",
"dataDeCadastro": "2024-02-25T16:17:53.393341",
"dataAtualizacao": "2024-02-25T17:10:28.055252"
}
],
"professores": [
{
"id": 1,
"nomeProfessor": "Brunno Nogueira",
"email": "brunno.nogueira@example.com",
"disciplinaLecionada": "Programação Web II",
"estaAtivo": null
}
]
} GET /estudantes?status=true
GET /estudantes?status=false GET /estudante?nomeAluno=nome_do_aluno
GET /professor?nomeProfessor=nome_do_professor GET /estudantes
GET /professores
GET /turmasEstes métodos foram implementados para que se possa obter a lista de todos os estudantes, professores ou turmas cadastradas no banco de dados.
Os testes unitários garantem que cada componente individual do software esteja funcionando corretamente de acordo com as especificações. Neste projeto, implementamos testes unitários para as classes Controller e Service de Estudante, Turma e Professor. Para realizar tais testes, recorremos aos frameworks JUnit e Mockito, além de bibliotecas específicas para testes de persistência de dados, como Spring Data JPA Test.
As classes de testes das Controllers foram implementadas para verificar o comportamento dos endpoints listados em cada Controller. Esses testes cobrem os casos de sucesso e de falha, como BadRequest e ResourceNotFoundException. Por exemplo, todos os métodos da classe ControllerTurma foram implementados, incluindo criar turma, listar todas as turmas, buscar turma por ID, alterar turma, filtrar turma por status e capturar exceções adequadas.
Os testes das Services envolvem a lógica de negócios relacionada a cada entidade. De modo geral, garantimos que o cadastro, atualização e busca, que foram todos os métodos descritos acima estejam funcionando corretamente. Isto é, verificamos se as exceções são tratadas adequadamente e se os dados são manipulados conforme esperado.
Relatório da cobertura dos testes criado pelo JaCoCo. Ao todo os testes performados cobrem 75% da API.
