{"id":25013840,"url":"https://github.com/alexsimao/crud-biblioteca","last_synced_at":"2026-05-06T13:09:33.971Z","repository":{"id":274898474,"uuid":"924423039","full_name":"AlexSimao/CRUD-biblioteca","owner":"AlexSimao","description":"Projeto criado para meu estudo pessoal do Spring Framework. Foi solicitado para uma IA criar o diagrama de um Banco de Dados para que possa estar criando as regras de negócio(CRUD) para se comunicar com o Banco de Dados.","archived":false,"fork":false,"pushed_at":"2025-03-01T17:36:46.000Z","size":79,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-30T05:12:18.150Z","etag":null,"topics":["crud","h2-database","java","jparepository","postgresql","spring","spring-boot"],"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/AlexSimao.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}},"created_at":"2025-01-30T01:03:17.000Z","updated_at":"2025-03-01T17:36:50.000Z","dependencies_parsed_at":"2025-02-06T03:23:57.235Z","dependency_job_id":null,"html_url":"https://github.com/AlexSimao/CRUD-biblioteca","commit_stats":null,"previous_names":["alexsimao/crud-biblioteca"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlexSimao%2FCRUD-biblioteca","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlexSimao%2FCRUD-biblioteca/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlexSimao%2FCRUD-biblioteca/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlexSimao%2FCRUD-biblioteca/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AlexSimao","download_url":"https://codeload.github.com/AlexSimao/CRUD-biblioteca/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246277367,"owners_count":20751549,"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":["crud","h2-database","java","jparepository","postgresql","spring","spring-boot"],"created_at":"2025-02-05T07:16:07.295Z","updated_at":"2026-05-06T13:09:28.921Z","avatar_url":"https://github.com/AlexSimao.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Documentação da API Biblioteca - Estudo\n\nEste documento detalha a API do sistema de biblioteca, incluindo entidades, serviços, endpoints, DTOs e exemplos de requisição/resposta.\n\n### 1. Visão Geral da Aplicação\n\nA aplicação Biblioteca é um sistema de gerenciamento de informações para uma biblioteca, desenvolvido com o objetivo de facilitar o controle de livros, autores e empréstimos. Trata-se de um projeto de estudo que implementa uma API RESTful utilizando o framework Spring Boot no backend.\n\n#### 1.1 Arquitetura\n#### A aplicação segue o padrão de arquitetura MVC (*Model-View-Controller*), que separa as responsabilidades em três camadas distintas:\n\n* **Model:** Representa os dados da aplicação e as regras de negócio. As entidades (Autor, Livro, Emprestimo) fazem parte do Model.\n* **View:** Não está presente nesta aplicação, já que ela é uma API RESTful. Em uma aplicação web tradicional, a View seria responsável por apresentar os dados ao usuário (ex: páginas HTML).\n* **Controller:** Responsável por receber as requisições dos clientes (através dos endpoints da API), interagir com o Model (chamando os serviços) e retornar as respostas apropriadas.\n\n#### 1.2 Tecnologias\n*  **1 - Spring Boot:** Framework Java utilizado para construir a aplicação. O Spring Boot facilita a criação de aplicações Spring, oferecendo recursos como autoconfiguração, injeção de dependências e um servidor web embarcado.\n\n* **2 - JPA Repository (Spring Data JPA):** Simplifica o acesso ao banco de dados.  As interfaces `AutorRepository`, `LivroRepository` e `EmprestimoRepository` estendem `JpaRepository`, fornecendo métodos para realizar operações CRUD (Create, Read, Update, Delete) de forma simples e eficiente.\n\n* **3 - HATEOAS (Spring HATEOAS):** Permite a criação de APIs RESTful que incluem links para outros recursos relacionados nas respostas. Isso facilita a navegação e a descoberta de funcionalidades por parte dos clientes da API.\n\n* **4 - Tratamento de Exceções:** A aplicação possui um tratamento de exceções centralizado, que garante que a API retorne mensagens de erro consistentes e informativas em caso de problemas.  A classe `ResourceExceptionHandler` utiliza as anotações `@ControllerAdvice` e `@ExceptionHandler` para interceptar as exceções lançadas pela aplicação e convertê-las em respostas HTTP apropriadas.\n\n* **5 - API RESTful:** A aplicação expõe seus serviços através de uma API RESTful, que permite que outras aplicações (clientes) interajam com ela utilizando o protocolo HTTP.  Os Controllers são responsáveis por receber as requisições HTTP e retornar as respostas apropriadas.\n\n* **6 - Banco de Dados:** A aplicação utiliza um banco de dados relacional para armazenar os dados.  O tipo específico de banco de dados não está definido no código fornecido, mas pode ser configurado através das propriedades do Spring Boot (ex: `application.properties`).  Opções comuns incluem MySQL, PostgreSQL, H2 (para desenvolvimento) etc.\n\n### 2. Detalhamento das Entidades\n\n```ruby\n+----------------+       +----------------+       +---------------------+\n|   tb_livros    |       |   tb_autores   |       |   tb_emprestimos    |\n+----------------+       +----------------+       +---------------------+\n| id (PK)        |       | id (PK)        |       | id (PK)             |\n| titulo         |       | nome           |       | livro_id (FK)       |\n| autor_id (FK)  |       +----------------+       | usuario             |\n| ano_publicacao |                                | data_emprestimo     |\n+----------------+                                | data_devolucao      |\n                                                  +---------------------+\n```\n#### 2.1 Autor\n\n*   **id (Long):** Identificador único (chave primária). Gerado automaticamente.\n*   **nome (String):** Nome completo do autor.\n\n#### 2.2 Livro\n\n*   **id (Long):** Identificador único (chave primária). Gerado automaticamente.\n*   **titulo (String):** Título do livro.\n*   **autor (Autor):** Autor do livro (chave estrangeira, Muitos-para-Um).\n*   **ano\\_publicacao (String):** Ano de publicação.\n\n#### 2.3 Emprestimo\n\n*   **id (Long):** Identificador único (chave primária). Gerado automaticamente.\n*   **livro (Livro):** Livro emprestado (chave estrangeira, Muitos-para-Um).\n*   **usuario (String):** Nome do usuário.\n*   **dataEmprestimo (String):** Data do empréstimo.\n*   **dataDevolucao (String):** Data de devolução (pode ser nulo).\n\n### 3. Serviços da Aplicação\n\n#### 3.1 AutorService\n\n*   **getAll():** Lista todos os autores.\n*   **getAllPageable(Pageable pageable):** Página de autores.\n*   **findByParamName(String nome, Pageable pageable):** Busca autores por nome (paginado).\n*   **findById(long id):** Busca autor por ID.\n*   **findLivrosByAutor(long id):** Lista livros de um autor.\n*   **createAutor(AutorDTO autorDTO):** Cria autor.\n*   **updateAutor(long id, AutorDTO autorDTO):** Atualiza autor.\n*   **deleteAutor(long id):** Exclui autor.  Lança `ForeignKeyReferenceException` se o autor tiver livros associados.\n\n#### 3.2 LivroService\n\n*   **findAll():** Lista todos os livros.\n*   **findAllPageable(Pageable pageable):** Página de livros.\n*   **findByParamTitle(String titulo, Pageable pageable):** Busca livros por título (paginado).\n*   **findById(long id):** Busca livro por ID.\n*   **createLivro(LivroRequestDTO livroRequestDTO):** Cria livro.  Cria o autor se ele não existir.\n*   **updateLivro(Long id, LivroRequestDTO livroRequestDTO):** Atualiza livro.\n*   **deleteLivro(long id):** Exclui livro. Lança `ForeignKeyReferenceException` se o livro tiver empréstimos associados.\n\n#### 3.3 EmprestimoService\n\n*   **findAll():** Lista todos os empréstimos.\n*   **findAllPageable(Pageable pageable):** Página de empréstimos.\n*   **findById(Long id):** Busca empréstimo por ID.\n*   **emprestimoAtivo():** Lista empréstimos ativos.\n*   **novoEmprestimo(EmprestimoRequestDTO emprestimoDTO):** Cria empréstimo.\n*   **devolucaoDeEmprestimo(Long id):** Registra devolução.\n\n### 4. Endpoints da API\n\n#### 4.1 AutorController\n\n*   `GET /autor`: Lista autores.\n*   `GET /autor/page`: Página de autores.\n*   `GET /autor/page/nome`: Busca autores por nome (paginado).\n*   `GET /autor/{id}`: Autor por ID.\n*   `GET /autor/{id}/livro`: Livros por autor.\n*   `POST /autor`: Cria autor.\n    *   **Requisição (exemplo JSON):** `{\"nome\": \"Novo Autor\"}`\n    *   **Resposta (exemplo JSON):** `{\"id\": 101, \"nome\": \"Novo Autor\", \"links\":[{\"rel\":\"all\",\"href\":\"http://localhost:8080/autor\"}]}`\n*   `PUT /autor/{id}`: Atualiza autor.\n    *   **Requisição (exemplo JSON):** `{\"nome\": \"Autor Atualizado\"}`\n    *   **Resposta (exemplo JSON):** `{\"id\": 101, \"nome\": \"Autor Atualizado\", \"links\":[{\"rel\":\"all\",\"href\":\"http://localhost:8080/autor\"}]}`\n*   `DELETE /autor/{id}`: Exclui autor.\n\n#### 4.2 LivroController\n\n*   `GET /livro`: Lista livros.\n*   `GET /livro/page`: Página de livros.\n*   `GET /livro/page/titulo`: Busca livros por título (paginado).\n*   `GET /livro/{id}`: Livro por ID.\n*   `POST /livro`: Cria livro.\n    *   **Requisição (exemplo JSON):** `{\"titulo\": \"Novo Livro\", \"autorNome\": \"Nome do Autor\", \"ano_publicacao\": \"2024\"}`\n    *   **Resposta (exemplo JSON):** `{\"id\": 201, \"titulo\": \"Novo Livro\", \"autor\": {\"id\": 101, \"nome\": \"Nome do Autor\"}, \"ano_publicacao\": \"2024\", \"links\":[{\"rel\":\"all\",\"href\":\"http://localhost:8080/livro\"}]}`\n*   `PUT /livro/{id}`: Atualiza livro.\n    *   **Requisição (exemplo JSON):** `{\"titulo\": \"Livro Atualizado\", \"autorNome\": \"Nome do Autor\", \"ano_publicacao\": \"2025\"}`\n    *   **Resposta (exemplo JSON):** `{\"id\": 201, \"titulo\": \"Livro Atualizado\", \"autor\": {\"id\": 101, \"nome\": \"Nome do Autor\"}, \"ano_publicacao\": \"2025\", \"links\":[{\"rel\":\"all\",\"href\":\"http://localhost:8080/livro\"}]}`\n*   `DELETE /livro/{id}`: Exclui livro.\n\n#### 4.3 EmprestimoController\n\n*   `GET /emprestimo`: Lista empréstimos.\n*   `GET /emprestimo/page`: Página de empréstimos.\n*   `GET /emprestimo/{id}`: Empréstimo por ID.\n*   `GET /emprestimo/ativos`: Empréstimos ativos.\n*   `POST /emprestimo`: Cria empréstimo.\n    *   **Requisição (exemplo JSON):** `{\"livro_id\": 201, \"usuario\": \"Nome do Usuário\", \"dataEmprestimo\": \"2025-05-10\"}`\n    *   **Resposta (exemplo JSON):** `{\"id\": 301, \"livro\": {\"id\": 201, \"titulo\": \"Nome do Livro\", \"autor\": {\"id\": 101, \"nome\": \"Nome do Autor\"}, \"ano_publicacao\": \"2024\"}, \"usuario\": \"Nome do Usuário\", \"dataEmprestimo\": \"2025-05-10\", \"dataDevolucao\": null, \"links\":[{\"rel\":\"all\",\"href\":\"http://localhost:8080/emprestimo\"}]}`\n*   `PUT /emprestimo/{id}`: Registra devolução.\n    *   **Resposta (exemplo JSON):** `{\"id\": 301, \"livro\": {\"id\": 201, \"titulo\": \"Nome do Livro\", \"autor\": {\"id\": 101, \"nome\": \"Nome do Autor\"}, \"ano_publicacao\": \"2024\"}, \"usuario\": \"Nome do Usuário\", \"dataEmprestimo\": \"2025-05-10\", \"dataDevolucao\": \"2025-05-20\", \"links\":[{\"rel\":\"all\",\"href\":\"http://localhost:8080/emprestimo\"}]}`\n\n### 5. Detalhamento dos DTOs\n\n#### 5.1 LivroRequestDTO\n\n*   **id (Long):** ID do livro (opcional em criações).\n*   **titulo (String):** Título do livro.\n*   **autorNome (String):** Nome do autor.\n*   **ano\\_publicacao (String):** Ano de publicação.\n\n#### 5.2 EmprestimoRequestDTO\n\n*   **id (Long):** ID do empréstimo (opcional em criações).\n*   **livro\\_id (Long):** ID do livro.\n*   **usuario (String):** Nome do usuário.\n\n#### 5.3 AutorDTO\n\n*   **id (Long):** Identificador único do autor.\n*   **nome (String):** Nome do autor.\n*   **links (List\\\u003cLink\u003e):** Links HATEOAS para outras operações relacionadas ao autor.  Inclui links para:\n    *   `self`: O próprio recurso autor.\n    *   `all`: A lista de todos os autores.\n\n#### 5.4 LivroDTO\n\n*   **id (Long):** Identificador único do livro.\n*   **titulo (String):** Título do livro.\n*   **autor (Autor):** Autor do livro.\n*   **ano\\_publicacao (String):** Ano de publicação.\n*   **links (List\\\u003cLink\u003e):** Links HATEOAS. Inclui links para:\n    *   `self`: O próprio recurso livro.\n    *   `all`: A lista de todos os livros.\n\n#### 5.5 EmprestimoDTO\n\n*   **id (Long):** Identificador único do empréstimo.\n*   **livro (Livro):** Livro emprestado.\n*   **usuario (String):** Nome do usuário.\n*   **dataEmprestimo (String):** Data do empréstimo.\n*   **dataDevolucao (String):** Data de devolução.\n*   **links (List\\\u003cLink\u003e):** Links HATEOAS. Inclui links para:\n    *   `self`: O próprio recurso empréstimo.\n    *   `all`: A lista de todos os empréstimos.\n\n### 6. Tratamento de Exceções\n\nA aplicação possui um tratamento de exceções centralizado em `ResourceExceptionHandler`. As seguintes exceções são tratadas:\n\n*   **EntityNotFoundException:** Retorna status `404 Not Found` com mensagem de erro.\n*   **IllegalArgumentException:** Retorna status `400 Bad Request` com mensagem de erro.\n*   **ForeignKeyReferenceException:** Retorna status `409 Conflict` com mensagem de erro, indicando que a operação não pode ser realizada devido a uma referência existente em outra entidade (ex: tentar deletar um autor que possui livros).\n\nAs respostas de erro seguem o formato:\n\n```json\n{\n  \"timestamp\": \"Data e hora do erro\",\n  \"status\": \"Código de status HTTP\",\n  \"error\": \"Nome do erro\",\n  \"message\": \"Mensagem detalhada do erro\",\n  \"path\": \"Caminho da requisição que causou o erro\"\n}\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falexsimao%2Fcrud-biblioteca","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falexsimao%2Fcrud-biblioteca","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falexsimao%2Fcrud-biblioteca/lists"}