{"id":20845408,"url":"https://github.com/maxjdev/api_catalogo-utilizando-jwt-mysql-docker","last_synced_at":"2026-02-14T18:02:45.513Z","repository":{"id":262904274,"uuid":"886977592","full_name":"maxjdev/API_Catalogo-utilizando-JWT-MySQL-Docker","owner":"maxjdev","description":"API de Catalogo feita em Java-17 com Spring, um catalogo de produtos associados a marca com implementações para auditoria, segurança com Spring Security + JWT e Docker.","archived":false,"fork":false,"pushed_at":"2025-03-13T08:38:29.000Z","size":286,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-15T20:45:53.039Z","etag":null,"topics":["docker","flyway","github-actions","java","jpa","jwt","maven","mysql","spring-boot","spring-security","swagger","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/maxjdev.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":"2024-11-12T00:31:19.000Z","updated_at":"2025-03-13T08:38:33.000Z","dependencies_parsed_at":null,"dependency_job_id":"9e33aa58-41f1-4ca3-83d6-6b421b045609","html_url":"https://github.com/maxjdev/API_Catalogo-utilizando-JWT-MySQL-Docker","commit_stats":null,"previous_names":["maxjdev/api_catalogo-utilizando-jwt-mysql-docker"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/maxjdev/API_Catalogo-utilizando-JWT-MySQL-Docker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxjdev%2FAPI_Catalogo-utilizando-JWT-MySQL-Docker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxjdev%2FAPI_Catalogo-utilizando-JWT-MySQL-Docker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxjdev%2FAPI_Catalogo-utilizando-JWT-MySQL-Docker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxjdev%2FAPI_Catalogo-utilizando-JWT-MySQL-Docker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/maxjdev","download_url":"https://codeload.github.com/maxjdev/API_Catalogo-utilizando-JWT-MySQL-Docker/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxjdev%2FAPI_Catalogo-utilizando-JWT-MySQL-Docker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29451935,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-14T15:52:44.973Z","status":"ssl_error","status_checked_at":"2026-02-14T15:52:11.208Z","response_time":53,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["docker","flyway","github-actions","java","jpa","jwt","maven","mysql","spring-boot","spring-security","swagger","validation"],"created_at":"2024-11-18T02:12:50.163Z","updated_at":"2026-02-14T18:02:45.508Z","avatar_url":"https://github.com/maxjdev.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# API-Catalogo\n\n![Java](https://img.shields.io/badge/java-%23ED8B00.svg?style=for-the-badge\u0026logo=openjdk\u0026logoColor=white)\n![Spring](https://img.shields.io/badge/spring-%236DB33F.svg?style=for-the-badge\u0026logo=spring\u0026logoColor=white)\n![JWT](https://img.shields.io/badge/JWT-black?style=for-the-badge\u0026logo=JSON%20web%20tokens)\n![Swagger](https://img.shields.io/badge/-Swagger-%23Clojure?style=for-the-badge\u0026logo=swagger\u0026logoColor=white)\u003cbr\u003e\n![Apache Maven](https://img.shields.io/badge/Apache%20Maven-C71A36?style=for-the-badge\u0026logo=Apache%20Maven\u0026logoColor=white)\n![MySQL](https://img.shields.io/badge/mysql-4479A1.svg?style=for-the-badge\u0026logo=mysql\u0026logoColor=white)\n![Docker](https://img.shields.io/badge/docker-%230db7ed.svg?style=for-the-badge\u0026logo=docker\u0026logoColor=white)\n\n\u003c/div\u003e\n\n### Descrição\n\nO API Catálogo é uma aplicação backend em Java 17 com Spring Boot, projetada para gerenciar um catálogo de produtos com segurança e eficiência. Possui autenticação e autorização via JWT, respostas paginadas, tratamento global de exceções e versionamento de banco de dados com Flyway. A API é documentada com OpenAPI/Swagger e utiliza Docker e Docker Compose para deploy, com pipelines automatizadas no GitHub Actions. É uma solução moderna, escalável e fácil de integrar.\n\n### Tecnologias usadas\n- **Java 17:** Linguagem de programação para o desenvolvimento da aplicação.\n- **Spring:** Framework para criação de aplicações Java.\n  - **Spring-Web:** Para desenvolvimento de APIs RESTful.\n  - **Spring-Validation:** Validação de dados no lado do servidor.\n  - **Spring-Security:** Autenticação e autorização.\n  - **Spring-Data-JPA:** Integração com bancos de dados usando JPA/Hibernate.\n  - **Spring-DevTools:** Facilita o desenvolvimento com reinicialização automática.\n- **JWT:** Implementação de tokens JWT para autenticação e autorização.\n- **Flyway:** Gerenciamento e versionamento de schema do banco de dados.\n  - **Flyway-Core:** Integração principal com Flyway.\n  - **Flyway-MySQL:** Suporte específico para banco de dados MySQL.\n- **MySQL Connector/J:** Driver JDBC para conexão com MySQL.\n- **H2 Database:** Banco de dados em memória para testes e desenvolvimento.\n- **SpringDoc OpenAPI:** Documentação interativa para APIs RESTful (Swagger UI).\n- **Lombok:** Reduz a verbosidade do código, gerando automaticamente métodos comuns.\n- **Maven:** Gerenciador de dependências e build do projeto.\n\u003chr\u003e\n\n### Imagens\n\n- POST para realizar registro de usuário\n  ![Login](img/register.png)\n\n- POST para realizar login/autenticar\n  ![Login](img/login.png)\n\n- GET para listar produtos com paginação\n  ![Login](img/getAll-products.png)\n\u003chr\u003e\n\n### Diagrama\n\n\n```mermaid\nclassDiagram\n  class AuditableEntity {\n    \u003c\u003cabstract\u003e\u003e\n    -Status status\n    -LocalDateTime createdAt\n    -LocalDateTime updatedAt\n    +activate()\n    +disable()\n    +delete()\n  }\n\n  class Brand {\n    -Long id\n    -String name\n    -Product[] products\n    +onStatusChange(Status newStatus)\n  }\n\n  class Product {\n    -Long id\n    -String name\n    -String description\n    -BigDecimal price\n    -int stockQuantity\n    -Brand brand\n  }\n\n  class User {\n    -String id\n    -String login\n    -String password\n    -UserRole role\n    +getAuthorities()\n    +getUsername()\n    +isAccountNonExpired()\n    +isAccountNonLocked()\n    +isEnabled()\n  }\n\n  class Status {\n    \u003c\u003cenum\u003e\u003e\n    +ACTIVE\n    +INACTIVE\n    +DELETED\n  }\n\n  class UserRole {\n    \u003c\u003cenum\u003e\u003e\n    +ADMIN\n    +USER\n  }\n\n  AuditableEntity \u003c|-- Brand\n  AuditableEntity \u003c|-- Product\n  AuditableEntity \u003c|-- User\n  Brand \"1\" *-- \"N\" Product\n```\n\u003chr\u003e\n\n### Como utilizar\n##### Requisitos para executar o projeto:\n- Docker e Docker Compose instalados na maquina.\n\nEm apenas 3 comandos simples a API estará disponível para consumo.\n\n- Clone o repositório:\n```bash\ngit clone https://github.com/maxjdev/API_Catalogo-utilizando-JWT-MySQL-Docker.git\n```\n\n- Navegue até o diretório do projeto:\n```bash\ncd API_Catalogo-utilizando-JWT-MySQL-Docker\n```\n\n- Rode o projeto:\n```bash\ndocker compose up --build\n```\n\u003chr\u003e\n\n### Endpoints\n| Rotas                                 | Visibilidade  | Descrição                                            |\n|---------------------------------------|---------------|------------------------------------------------------|\n| \u003ckbd\u003ePOST /auth/*\u003c/kbd\u003e               | Público       | Registro e login.                                    |\n| \u003ckbd\u003eGET /api/v1/**\u003c/kbd\u003e             | Público       | Busca por ID, por nome ou buscar todos com paginação |\n| \u003ckbd\u003ePUT/DELETE /api/admin/**\u003c/kbd\u003e   | Administrador | Torna entidade ACTIVE, INACTIVE ou faz \"full delete\" |\n| \u003ckbd\u003ePOST/PUT/DELETE /api/v1/**\u003c/kbd\u003e | Autenticado   | Create, Update ou Delete                             |\n\u003chr\u003e\n\n### Documentação\nAcesse a documentação interativa em \u003ca href=\"http://localhost:9090/swagger-ui.html\"\u003ehttp://localhost:9090/swagger-ui.html\u003c/a\u003e\n\u003chr\u003e\n\n### Entidades pré-persistidas\n\n#### Via Flyway:\n```sql\nINSERT INTO tb_brand (name, status, created_at, updated_at)\nVALUES\n    ('Taurus', 'ACTIVE', NOW(), NOW()),\n    ('Imbel', 'ACTIVE', NOW(), NOW()),\n    ('Glock', 'ACTIVE', NOW(), NOW()),\n    ('Colt', 'ACTIVE', NOW(), NOW()),\n    ('Sig Sauer', 'ACTIVE', NOW(), NOW()),\n    ('Beretta', 'ACTIVE', NOW(), NOW()),\n    ('Smith \u0026 Wesson', 'ACTIVE', NOW(), NOW()),\n    ('Heckler \u0026 Koch', 'ACTIVE', NOW(), NOW());\n```\n```sql\nINSERT INTO tb_product (name, brand_id, description, price, stock_quantity, status, created_at, updated_at)\nVALUES\n    ('Pistola G2C', 1, 'Pistola compacta e leve, ideal para porte velado.', 2500.00, 15, 'ACTIVE', NOW(), NOW()),\n    ('Pistola TS9', 1, 'Pistola para uso tático e esportivo, com alta precisão.', 3200.00, 10, 'ACTIVE', NOW(), NOW()),\n    ('Carabina IA2', 2, 'Carabina de alta resistência, utilizada por forças armadas.', 4500.00, 8, 'ACTIVE', NOW(), NOW()),\n    ('Pistola .40', 2, 'Pistola popular para uso policial, confiável e durável.', 2800.00, 20, 'ACTIVE', NOW(), NOW()),\n    ('Glock 17', 3, 'Modelo clássico da Glock, confiável e amplamente utilizado.', 3000.00, 25, 'ACTIVE', NOW(), NOW()),\n    ('Glock 19', 3, 'Modelo compacto da Glock, ideal para porte velado.', 3100.00, 18, 'ACTIVE', NOW(), NOW()),\n    ('Colt M1911', 4, 'Pistola lendária com mais de um século de uso militar.', 3500.00, 12, 'ACTIVE', NOW(), NOW()),\n    ('Colt Python', 4, 'Revólver de alta precisão e construção robusta.', 3700.00, 5, 'ACTIVE', NOW(), NOW()),\n    ('Sig Sauer P320', 5, 'Pistola modular e confiável, usada por forças militares.', 3300.00, 10, 'INACTIVE', NOW(), NOW()),\n    ('Sig Sauer P226', 5, 'Pistola clássica de serviço, com alta precisão.', 3400.00, 6, 'DELETED', NOW(), NOW()),\n    ('Beretta 92FS', 6, 'Pistola de alto desempenho com design clássico.', 3100.00, 12, 'INACTIVE', NOW(), NOW()),\n    ('Beretta PX4 Storm', 6, 'Pistola compacta, ideal para defesa pessoal.', 2900.00, 5, 'DELETED', NOW(), NOW()),\n    ('S\u0026W M\u0026P9', 7, 'Pistola de polímero com ergonomia avançada.', 3200.00, 9, 'INACTIVE', NOW(), NOW()),\n    ('S\u0026W 686', 7, 'Revólver robusto, projetado para alto desempenho.', 3600.00, 3, 'DELETED', NOW(), NOW()),\n    ('HK USP', 8, 'Pistola versátil, projetada para uso militar e policial.', 3500.00, 8, 'INACTIVE', NOW(), NOW()),\n    ('HK VP9', 8, 'Pistola leve com sistema de disparo inovador.', 3400.00, 4, 'DELETED', NOW(), NOW());\n```\n#### Via CommandLineRunner:\n```java\n@Override\npublic void run(String... args) throws Exception {\n  authenticationService.register(new RegisterDTO(\"useradmin\", \"passwordadmin\", UserRole.ADMIN));\n  authenticationService.register(new RegisterDTO(\"userstandard\", \"passwordstandard\", UserRole.USER));\n}\n```\n\u003chr\u003e\n\n### Contruibuição\n- Para contribuir, faça um fork deste repositório e envie suas alterações por meio de pull requests.\n- Para relatórios de bugs ou sugestões de melhorias, abra uma issue na página do projeto.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxjdev%2Fapi_catalogo-utilizando-jwt-mysql-docker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmaxjdev%2Fapi_catalogo-utilizando-jwt-mysql-docker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxjdev%2Fapi_catalogo-utilizando-jwt-mysql-docker/lists"}