- A API é para uso em sistemas de gestão de livros, desenvolvida utilizando a linguagem de programação Java com recursos do Spring Boot. Abaixo, segue status de desenvolvimento, stack e requisitos.
- ✅ Status: Concluído - Part I
- ❌ Status: Andamento - Part II
- API-REST-SPRING-BOOT: Armazena o código da API (backend);
- Backend: Java 17+, Spring Boot, Spring Web, Spring Data JPA (ORM).
- Banco de dados: H2 Database.
- Gerenciamento de Dependências: Maven.
- Validação: Bean Validation.
- Documentação: Swagger
- WebServices;
- REST;
- Validação de dados;
- Documentação API com Swagger;
- Mínimo de 5 entidades com relacionamentos entre si
- Pelo menos um relacionamento de cada tipo: One-to-One, One-to-Many e Many-to-Many
- Utilizar validações adequadas (Bean Validation) em cada entidade
- Implementar pelo menos um enum em uma das entidades
- Mínimo de 5 endpoints REST para cada entidade
- Implementar operações CRUD completas para cada entidade
- Todas as rotas de listagem devem ser paginadas (utilizando Pageable)
- Incluir pelo menos 1 endpoint com consultas personalizadas por entidade
- GET /users/search?email= — buscar usuário por email
- GET /profiles/user/{userId} — perfil pelo ID do usuário
- GET /categories/search?title= — buscar categoria por título
- GET /suppliers/search?name= — buscar fornecedor por nome
- GET /authors/search?name= — buscar autor por nome
- GET /books/category/{categoryId} — livros por categoria
- GET /loans/user/{userId} — empréstimos por usuário
- Utilizar códigos de status HTTP apropriados para cada operação
- Documentar todos os endpoints usando Springdoc OpenAPI (Swagger)
- Incluir descrições detalhadas, exemplos e possíveis códigos de resposta
- Garantir que a documentação esteja completa e precisa
- Implementar HATEOAS utilizando Spring HATEOAS
- Incluir links relevantes nas respostas (self, update, delete, etc.)
- Garantir navegabilidade entre recursos da API
- Utilizar EntityModel, CollectionModel ou PagedModel quando aplicável
- Idempotência
- Autenticação com Chave de API
- Rate Limiting
- CORS (Cross-Origin Resource Sharing)
- Versionamento da API (X-API-Version)
- Validações e Tratamento de Erros
- Documentação com Swagger/OpenAPI
- Utilizar o framework Spring Boot em sua versão mais recente
- Implementar o projeto com Java 17 ou superior
- Utilizar o Maven ou Gradle como gerenciador de dependências (Maven)
- Configurar o banco de dados H2 para persistência de dados
- Utilizar Spring Data JPA para ORM
- [] tratar erros de resposta (500);
- [] detalhar Swagger com texto, explicando o contexto;
- [] exemplos de conteúdo;
- [] exemplos de resposta;
- [] fazer termos de serviço;
- [] descrição: remover pagination/error handlingz, especificar tipo de HATEOAS;
- Usuário
- Perfil
- Livro
- Categoria
- Fornecedor
- Autor
- Empréstimo
- O usuário deve poder se cadastrar;
- O usuário deve poder se logar;
- O usuário deve poder resetar a senha;
- O usuário deve poder realizar um empréstimo;
- O usuário deve poder visualizar todos os livros;
- O usuário deve poder visualizar suas informações de perfil;
- O usuário deve poder visualizar o histórico de empréstimos;
- O administrador deve poder registrar um fornecedor;
- O administrador deve poder registrar uma categoria;
- O administrador deve poder registrar um livro;
- O administrador deve poder registat um autor;
- O administrador deve poder deletar um fornecedor;
- O administrador deve poder deletar uma categoria;
- O administrador deve poder deletar um livro;
- O administrador deve poder deletar um autor;
- O usuário deve poder deletar a própria conta;
- O usuário deve poder atualizar seu usuário (email/senha)
- O usuário deve poder atualizar as informações de seu perfil;
- O usuário deve poder atualizar seu empréstimo;
- O usuário deve poder visualizar todas as categorias;
- O usuário deve poder visualizar livros agrupados por autor/categoria/fornecedor;
- O usuário deve poder visualizar a quantidade de livros por categoria;
- O usuário deve poder filtrar seu histórico de empréstimos por período e por categoria;
- O administrador deve poder visualizar todos os usuários.
- A senha do usuário precisa estar em formato hash;
- Os dados da aplicação precisam estar persistidos em um banco H2;
- Todas as listas de dados precisam estar paginadas com 10 itens por página;
- Todos os usuários devem ser identificados pela permissão de "membro" ou "admin";
- O sistema deve possuir tratamento centralizado de erros;
- O administrador não pode visualizar senhas dos usuários.
- Todas as rotas precisam estar documentadas utilizando o swagger;
- O usuário deve ser identificado por um JWT (JSON Web Token) entre as requisições;
- O sistema deve ter rate limiting;
- O sistema deve implementar refresh token para renovação de autenticação;
- Invalidar o JWT ao deletar a conta do usuário.
- O usuário não deve poder se cadastrar com e-mail duplicado;
- Os usuários, por padrão, recebem o cargo (permissão) de "membro";
- O administrador pode visualizar todos os usuários;
- O administrador não deve poder cadastrar categorias com o mesmo título;
- O administrador não deve poder cadastrar mais que 15 categorias;
- O token de reset de senha deve expirar em 15 minutos e só pode ser usado uma vez;
- O usuário que solicitou renovação de senha não pode cadastrar a mesma senha novamente;
- O usuário não deve poder solicitar empréstimo para outro usuário;
- O usuário só pode visualizar os próprios empréstimos;
- O administrador não deve poder atualizar o livro com a mesma categoria já em uso pelo próprio livro;
- O usuário não deve poder visualizar empréstimos de outros usuários;
- Ao deletar uma conta, os empréstimos vinculados ao usuário devem ser mantidos.
- Um usuário pode possuir vários empréstimos. Cada empréstimo pertence a exatamente um usuário (One-to-Many).
- Uma categoria pode possuir vários livros. Cada livro pertence a uma categoria (One-to-Many).
- Um fornecedor pode fornecer vários livros. Cada livro possui um fornecedor (One-to-Many).
- Um livro pode possuir vários autores e um autor pode escrever vários livros (Many-to-Many).
- Um usuário possui exatamente um perfil, e cada perfil pertence a exatamente um usuário (One-to-One)

