{"id":28382270,"url":"https://github.com/filipemt/library_api","last_synced_at":"2025-06-25T05:31:33.099Z","repository":{"id":285940422,"uuid":"959356682","full_name":"Filipemt/library_api","owner":"Filipemt","description":"Projeto com intuito de aprender conceitos de API Rest","archived":false,"fork":false,"pushed_at":"2025-06-23T17:29:04.000Z","size":119,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-23T18:36:16.219Z","etag":null,"topics":["api-rest","authentication","backend","docker-container","java","jpa-hibernate","lombok","maven","oauth2","postgresql","spring-boot","spring-security","validation"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Filipemt.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-04-02T16:56:07.000Z","updated_at":"2025-06-23T17:29:08.000Z","dependencies_parsed_at":null,"dependency_job_id":"d43b82c9-3a0d-4e56-871f-62589aa4b1b2","html_url":"https://github.com/Filipemt/library_api","commit_stats":null,"previous_names":["filipemt/library_api"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Filipemt/library_api","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Filipemt%2Flibrary_api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Filipemt%2Flibrary_api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Filipemt%2Flibrary_api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Filipemt%2Flibrary_api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Filipemt","download_url":"https://codeload.github.com/Filipemt/library_api/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Filipemt%2Flibrary_api/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261813005,"owners_count":23213599,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api-rest","authentication","backend","docker-container","java","jpa-hibernate","lombok","maven","oauth2","postgresql","spring-boot","spring-security","validation"],"created_at":"2025-05-30T04:07:13.550Z","updated_at":"2025-06-25T05:31:33.085Z","avatar_url":"https://github.com/Filipemt.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"```markdown\n# Library API\n\nA aplicação **Library API** é um sistema desenvolvido utilizando **Spring Boot** que permite gerenciar uma biblioteca, incluindo o cadastro de livros, autores e usuários, além de garantir a segurança através da autenticação e autorização utilizando Spring Security.\n\n## Descrição do Projeto\n\nO projeto gerencia as entidades de uma biblioteca, com funcionalidades como:\n\n- Cadastro e busca de **autores** com validações e controle de duplicidade.\n- Registro e consulta de **livros**, com busca por título, autor, ISBN, gênero e ano de publicação.\n- Gerenciamento de **usuários**, com autenticação e autorização.\n- Controle de acessos baseados em perfil (**ROLE_ADMIN**, **ROLE_USER**, etc).\n\n## Tecnologias Utilizadas\n\n- **Java 21**\n- **Spring Boot 3.3.4**\n  - Spring Web\n  - Spring Data JPA\n  - Spring Security\n  - Spring Validation\n- **PostgreSQL** como banco de dados relacional.\n- **MapStruct** para mapeamento de objetos DTO para entidades.\n- **Lombok** para redução de código boilerplate.\n- **Thymeleaf** para renderização da página de login customizada (frontend).\n- **Hypersistence Utils** para facilitar o uso de recursos avançados do Hibernate.\n\n## Estrutura do Projeto\n\n### Pacotes\n\n- `com.filipecode.libraryApi.model.dtos`  \n  Contém os objetos de transferência de dados (**DTOs**) para requisição e resposta.\n\n- `com.filipecode.libraryApi.model.entities`  \n  Define as entidades mapeadas para tabelas do banco de dados, como `Author` e `Book`.\n\n- `com.filipecode.libraryApi.controller`  \n  Define os controladores REST responsáveis por expor endpoints para gerenciar livros, autores e usuários.  \n\n- `com.filipecode.libraryApi.repositories`  \n  Repositórios que interagem diretamente com o banco de dados usando JPA e Spring Data.\n\n- `com.filipecode.libraryApi.service`  \n  Camada de serviço que contém as regras de negócio da aplicação.\n\n- `com.filipecode.libraryApi.security`  \n  Configurações de segurança para autenticação e autorização.\n\n- `com.filipecode.libraryApi.validator`  \n  Inclui validações customizadas para entidades.\n\n- `com.filipecode.libraryApi.exceptions`  \n  Exceptions customizadas para lidar com situações como duplicidade de registro ou operação não permitida.\n\n- `com.filipecode.libraryApi.repositories.specs`  \n  Especificações do Spring Data JPA para consultas dinâmicas de livros.\n\n### Entidades Principais\n\n#### Author\n\nRepresenta o autor do livro.\n\n- **Atributos:**\n  - `id`: UUID\n  - `name`: Nome do autor (máx. 100 caracteres)\n  - `dateOfBirth`: Data de nascimento\n  - `nationality`: Nacionalidade (máx. 50 caracteres)\n  - `books`: Lista de livros relacionados a este autor\n\n#### Book\n\nRepresenta os livros cadastrados na biblioteca.\n\n- **Atributos:**\n  - `id`: UUID\n  - `isbn`: Código único do livro\n  - `title`: Título do livro\n  - `publicationDate`: Data de publicação\n  - `gender`: Gênero do livro (Enum: FICCAO, FANTASIA, MISTERIO, etc.)\n  - `price`: Preço do livro\n\n#### UserLogin\n\nRepresenta os usuários que podem acessar o sistema.\n\n- **Atributos:**\n  - `id`: UUID\n  - `login`: Nome de usuário único\n  - `password`: Senha (segura e criptografada)\n  - `roles`: Perfil(s) associado(s) ao usuário\n\n### Endpoints\n\n#### Gerenciamento de Livros\n\n- **POST /livros**  \n  Cadastrar um livro (requer `ROLE_OPERADOR` ou `ROLE_GERENTE`).\n\n- **GET /livros/{id}**  \n  Consultar detalhes de um livro pelo ID.\n\n- **DELETE /livros/{id}**  \n  Remover um livro do sistema.\n\n- **GET /livros**  \n  Buscar livros com filtros (ISBN, título, gênero, autor, etc.).\n\n- **PUT /livros/{id}**  \n  Atualizar dados de um livro.\n\n#### Gerenciamento de Autores\n\n- **POST /autores**  \n  Cadastrar um autor (requer `ROLE_GERENTE`).\n\n- **GET /autores/{id}**  \n  Consultar detalhes de um autor.\n\n- **DELETE /autores/{id}**  \n  Remover um autor (apenas se ele não for relacionado a livros).\n\n- **GET /autores**  \n  Listar autores com filtros opcionais de nome e nacionalidade.\n\n- **PUT /autores/{id}**  \n  Atualizar os dados de um autor existente.\n\n#### Gerenciamento de Usuários\n\n- **POST /usuarios**  \n  Registrar um novo usuário.\n\n#### Autenticação\n\n- **GET /login**  \n  Página customizada de login.\n\n### Segurança\n\nFoi configurado um sistema baseado em tokens de autenticação via Spring Security:\n\n- Autorização baseada em **roles** utilizando anotações como `@PreAuthorize`.\n- Uso do MapStruct para criar mapeadores entre entidades e DTOs de forma eficiente.\n\n### Regras de Negócio\n\n- Validação de duplicidade para autores (`AuthorValidator`) e livros (`BookValidator`).\n- Impossibilidade de remover autores que possuem livros cadastrados.\n- Preços obrigatórios para livros publicados a partir de 2020.\n\n## Banco de Dados\n\n### Estrutura das Tabelas\n``` sql\ncreate table autor(\n  id uuid not null primary key,\n  nome varchar(100) not null,\n  data_nascimento date not null,\n  nacionalidade varchar(50) not null,\n  data_cadastro timestamp,\n  data_atualizacao timestamp,\n  id_usuario uuid\n);\n\ncreate table livro (\n   id uuid not null primary key,\n   isbn varchar(20) not null unique,\n   titulo varchar(150) not null,\n   data_publicacao date not null,\n   genero varchar(30) not null,\n   preco numeric(18,2),\n   data_cadastro timestamp,\n   data_atualizacao timestamp,\n   id_usuario uuid,\n   id_autor uuid not null references autor(id),\n   constraint chk_genero check (genero in ('FICCAO', 'FANTASIA', 'MISTERIO','ROMANCE', 'BIOGRAFIA', 'CIENCIA') )\n);\n\ncreate table usuario(\n    id UUID NOT NULL PRIMARY KEY,\n    login VARCHAR(20) NOT NULL UNIQUE,\n    senha VARCHAR(300) NOT NULL,\n    roles VARCHAR[]\n);\n```\n## Requisitos\n\n- **Java 21**\n- **PostgreSQL**\n- **Maven**\n\n## Como Executar o Projeto\n\n1. Clone o repositório:\n   ```bash\n   git clone \u003crepository-url\u003e\n   ```\n\n2. Configure o arquivo `application.properties` com as credenciais do banco de dados.\n\n3. Execute o comando Maven para rodar a aplicação:\n   ```bash\n   mvn spring-boot:run\n   ```\n\n4. Acesse a aplicação em [http://localhost:8080](http://localhost:8080).\n\n## Autor\nDesenvolvido por **Filipe Mota**.```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffilipemt%2Flibrary_api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffilipemt%2Flibrary_api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffilipemt%2Flibrary_api/lists"}