{"id":31593020,"url":"https://github.com/lucass-barreto/magicfridgeia","last_synced_at":"2026-04-28T23:38:35.189Z","repository":{"id":316467429,"uuid":"1060350036","full_name":"lucass-barreto/MagicFridgeIA","owner":"lucass-barreto","description":"Aplicação web full-stack em Java que gere o inventário de um frigorífico e utiliza a API da OpenAI para criar receitas com base nos ingredientes disponíveis. Desenvolvido com Spring Boot, Thymeleaf, WebClient e Flyway.","archived":false,"fork":false,"pushed_at":"2025-09-24T18:28:17.000Z","size":253,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-24T20:26:01.658Z","etag":null,"topics":["artificial-intelligence","flyway-migrations","fullstack-java","java","maven","openia-api","spring","spring-boot","springboot","thymeleaf","webclient"],"latest_commit_sha":null,"homepage":"","language":"HTML","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/lucass-barreto.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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-19T19:04:31.000Z","updated_at":"2025-09-24T18:32:35.000Z","dependencies_parsed_at":"2025-09-24T20:26:02.896Z","dependency_job_id":"e83e4465-7084-438a-8251-4fdedf9dff7a","html_url":"https://github.com/lucass-barreto/MagicFridgeIA","commit_stats":null,"previous_names":["lucass-barreto/magicfridgeia"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/lucass-barreto/MagicFridgeIA","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lucass-barreto%2FMagicFridgeIA","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lucass-barreto%2FMagicFridgeIA/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lucass-barreto%2FMagicFridgeIA/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lucass-barreto%2FMagicFridgeIA/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lucass-barreto","download_url":"https://codeload.github.com/lucass-barreto/MagicFridgeIA/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lucass-barreto%2FMagicFridgeIA/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278556225,"owners_count":26006079,"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","status":"online","status_checked_at":"2025-10-06T02:00:05.630Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["artificial-intelligence","flyway-migrations","fullstack-java","java","maven","openia-api","spring","spring-boot","springboot","thymeleaf","webclient"],"created_at":"2025-10-06T03:35:55.724Z","updated_at":"2026-04-28T23:38:35.181Z","avatar_url":"https://github.com/lucass-barreto.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# MagicFridgeIA - Geladeira Inteligente com Geração de Receitas via IA\n\n![Java](https://img.shields.io/badge/Java-21-blue?logo=openjdk\u0026logoColor=white)\n![Spring Boot](https://img.shields.io/badge/Spring_Boot-3.5.5-green?logo=spring\u0026logoColor=white)\n![Docker](https://img.shields.io/badge/Docker-2496ED?logo=docker\u0026logoColor=white)\n![Maven](https://img.shields.io/badge/Maven-4.0-red?logo=apachemaven\u0026logoColor=white)\n![Thymeleaf](https://img.shields.io/badge/Thymeleaf-3.1-green?logo=thymeleaf\u0026logoColor=white)\n[![OpenAI API](https://img.shields.io/badge/OpenAI-API-10a37f?logo=openai\u0026logoColor=white)](https://openai.com/api/)\n\nAplicação web full-stack que simula o gerenciamento de uma geladeira, permitindo ao usuário cadastrar ingredientes e, com um único clique, solicitar à API da OpenAI que gere uma receita criativa utilizando os itens disponíveis. O projeto foi desenvolvido como um estudo aprofundado no ecossistema Java, com foco na integração de serviços de IA, na construção de interfaces web reativas com Thymeleaf e nas melhores práticas de desenvolvimento com Spring Boot.\n\n---\n\n### 📸 Visão Geral da Interface\n\nA aplicação conta com um dashboard moderno e funcional, que centraliza todas as interações do usuário.\n\n#### **Dashboard Principal:** \n*O painel centraliza o formulário de adição de ingredientes e a opção da geração de receita com IA.*\n\n![Dashboard da Aplicação](assets/dashboard.PNG)\n\n*Logo abaixo há uma lista com todos os itens adicionados e as opções de **deletar** e **editar** um item.*\n![Lista de itens](assets/tabela-de-itens.PNG)\n\n#### **Página de Edição Dedicada:**\n*Uma interface limpa para a alteração de um ingrediente específico, garantindo uma experiência de usuário fluida.*\n\n![Página de Alteração de Item](assets/alterar-item.PNG)\n\n#### **Geração de Receitas com IA:**\n*Após adicionar os ingredientes, o usuário pode solicitar uma receita, que é exibida dinamicamente na mesma tela.*\n\n![Exemplo de Receita Gerada](assets/gerador-de-receitas.PNG)\n\n---\n\n## 📜 Descrição Completa\n\n**MagicFridgeIA** é uma solução criativa para um problema comum: o que cozinhar com o que se tem em casa? A aplicação permite o gerenciamento completo do inventário de uma geladeira, desde o cadastro de itens com suas respectivas categorias e validades até a exclusão e alteração dos mesmos.\n\nO grande diferencial do projeto é a sua integração com a **API da OpenAI**. O back-end consulta todos os ingredientes disponíveis no banco de dados, formata essa lista em um prompt otimizado e o envia para um modelo GPT. A resposta da IA, uma receita completa, é então exibida na interface.\n\nO projeto foi construído com uma clara separação de responsabilidades, utilizando controllers `@RestController` para uma potencial API JSON e um `@Controller` dedicado para a interface de usuário, renderizada no lado do servidor com **Thymeleaf**. Para garantir a portabilidade e simplificar a configuração do ambiente, a aplicação foi totalmente containerizada com **Docker** e orquestrada com **Docker Compose**, permitindo que todo o sistema (aplicação + banco de dados PostgreSQL) seja executado de forma isolada e consistente com um único comando.\n\n---\n\n### 🚀 Funcionalidades\n\n- ✅ **CRUD Completo de Ingredientes:** Endpoints e interface para Criar, Ler, Atualizar e Deletar itens na geladeira.\n- 🖥️ **Dashboard Interativo:** Interface web única construída com Thymeleaf para todas as operações.\n- 🤖 **Integração com IA:** Comunicação reativa com a API da OpenAI usando `WebClient` para gerar receitas.\n-  dynamic **Prompt Dinâmico:** A aplicação busca os dados do banco em tempo real para construir o prompt que é enviado à IA.\n- 🗃️ **Versionamento de Banco de Dados:** Uso do **Flyway** para criar e gerenciar o schema do banco de dados de forma automatizada.\n- ✨ **Design Moderno:** Interface com CSS puro, focada em uma experiência de usuário limpa e agradável.\n\n---\n\n### 💪 Desafios Superados\n\nDurante o desenvolvimento, vários desafios foram superados, servindo como grandes pontos de aprendizado:\n\n- **Integração com API Externa (`401 Unauthorized`):** Um longo processo de depuração para resolver falhas de autenticação com a API da OpenAI. A solução envolveu a correção de detalhes minuciosos, como o espaço no header \"Bearer \", o nome exato do modelo (`gpt-4o-mini`) e a garantia de que a chave de API correta estava sendo carregada pelo ambiente Spring.\n- **Programação Reativa (`WebClient`):** Compreensão na prática de como lidar com respostas assíncronas (`Mono`). O desafio foi aprender a extrair dados de um JSON complexo sem usar DTOs, navegando pela estrutura com `Map` e `List` e utilizando o operador `.map()` para transformar a resposta dentro do fluxo reativo.\n- **Spring MVC \u0026 Thymeleaf:** Aprofundamento na diferença crucial entre `@Controller` (para renderizar views) e `@RestController` (para retornar dados). Resolução de erros `404 (Not Found)` e `405 (Method Not Allowed)` através da correção de rotas (`@RequestMapping`) e do uso do `HiddenHttpMethodFilter` do Spring para permitir o uso dos verbos `PUT` e `DELETE` em formulários HTML.\n- **Configuração de Build (Maven):** Resolução de um erro raro (`HalfWidthInputException`) causado por um caractere invisível no arquivo `application.properties`, o que exigiu a recriação do arquivo para limpar problemas de codificação.\n- **Injeção de Dependência (`NullPointerException`):** Diagnóstico de erros de `NullPointerException` que levaram à compreensão da importância da injeção de dependências via construtor e da necessidade de `getters/setters` em classes DTO (resolvido com o `@Data` do Lombok).\n\n---\n\n### 🛠️ Tecnologias Utilizadas\n\n- **Backend:**\n    - Java 17\n    - Spring Boot 3\n    - Spring Web (com WebClient para chamadas reativas)\n    - Spring Data JPA / Hibernate\n- **Frontend:**\n    - Thymeleaf\n    - HTML5\n    - CSS3\n- **Banco de Dados:**\n    - PostgreSQL\n    - Flyway (para versionamento de schema)\n- **Build \u0026 Dependências:**\n    - Apache Maven\n    - Lombok\n    - MapStruct\n- **DevOps**\n    - Docker\n---\n\n## ⚙️ Instalação e Uso\n\n### 🐳 Rodando com Docker (Método Recomendado)\nEsta é a forma mais simples e rápida de executar o projeto, pois todo o ambiente (aplicação + banco de dados PostgreSQL) é gerenciado pelo Docker.\n\n1.  **Pré-requisitos:**\n    * Docker e Docker Compose instalados.\n    * Uma chave de API da OpenAI.\n\n2.  **Clone o repositório:**\n    ```bash\n    git clone [https://github.com/lucass-barreto/MagicFridgeIA.git](https://github.com/lucass-barreto/MagicFridgeIA.git)\n    cd MagicFridgeIA\n    ```\n\n3.  **Configure as variáveis de ambiente:**\n    Na raiz do projeto, crie um arquivo `.env` a partir do `.env.example`. Este arquivo deve conter as credenciais do banco de dados e sua chave da API da OpenAI.\n    ```bash\n    cp .env.example .env\n    ```\n    *Em seguida, edite o arquivo `.env` e insira sua chave da API da OpenAI na variável `OPENIA_KEY`.*\n\n4.  **Suba o ambiente com Docker Compose:**\n    Este comando irá construir a imagem da aplicação e iniciar os containers em segundo plano.\n    ```bash\n    docker-compose up --build -d\n    ```\n\n5.  **Acesse a Aplicação:**\n    Após alguns instantes, a aplicação estará disponível no seu navegador:\n    * **Interface Web (Dashboard):** [http://localhost:8080/ui/dashboard](http://localhost:8080/ui/dashboard)\n\n\n### 🐋 Imagem no Docker Hub\nUma imagem pré-construída desta aplicação está disponível publicamente no Docker Hub. Você pode baixá-la diretamente com o comando:\n```bash\ndocker pull lucassbarreto/magicfridge-app:0.0.1-RELEASE\n```\n\n**Para mais detalhes, visite o repositório no [Docker Hub](https://hub.docker.com/r/lucassbarreto/magicfridge-app).**\n\n## 📫 Contato\n\n**Lucas Barreto Oliveira**\n\n* **GitHub:** [@lucass-barreto](https://github.com/lucass-barreto)\n* **LinkedIn:** [@lucass-barreto](https://www.linkedin.com/in/lucass-barreto)\n* **Email:** lucasbo.dev@gmail.com\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flucass-barreto%2Fmagicfridgeia","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flucass-barreto%2Fmagicfridgeia","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flucass-barreto%2Fmagicfridgeia/lists"}