{"success":true,"data":{"user":{"name":"Mário Victor Quarta Afonso","email":"marioafonso1997@gmail.com","avatarUrl":"","username":"marioafonso1997"},"profile":{"title":"Software Engineer","summary":"Systems Developer with practical experience in fullstack web development, automation, and IoT. I’ve worked on personal and academic projects involving machine learning, systems integration, and cloud computing, creating intelligent and scalable solutions.","location":"Portugal, Porto","contact":{"linkedin":"https://www.linkedin.com/in/mario-afonso-018107141","github":"https://https//github.com/Mario2211-debug/"},"theme":"minimal"},"experiences":[{"_id":"692fcbf1d80b1d6f2dfa96b7","user":"692fcb31d80b1d6f2dfa9599","company":"CISP (Integrated Public Security Center)","position":"Data Center Technician","context":"Managed and monitored critical IT infrastructure using Linux, Zabbix, and proprietary datacenter platforms. Performed system maintenance, troubleshooting, and uptime optimization in high-availability environments.","responsibilities":[],"technologies":[],"startDate":"2020-04-01T00:00:00.000Z","endDate":"2023-08-01T00:00:00.000Z","isCurrent":false,"createdAt":"2025-12-03T05:34:41.255Z","updatedAt":"2025-12-03T05:34:41.255Z","__v":0},{"_id":"692fcb95d80b1d6f2dfa9601","user":"692fcb31d80b1d6f2dfa9599","company":"Angola Telecom","position":"Technical Assistant (Internship)","context":"Assisted in network and telecommunications operations, supporting equipment configuration, maintenance, and incident resolution.","responsibilities":[],"technologies":[],"startDate":"2019-05-01T00:00:00.000Z","endDate":"2019-08-01T00:00:00.000Z","isCurrent":false,"createdAt":"2025-12-03T05:33:09.516Z","updatedAt":"2025-12-03T05:33:09.516Z","__v":0}],"education":[{"_id":"692fcbf1d80b1d6f2dfa96be","user":"692fcb31d80b1d6f2dfa9599","institution":"Bytes4Future","degree":"Junior Full-Stack Bootcamp","startDate":"2025-07-21T00:00:00.000Z","endDate":"2025-10-10T00:00:00.000Z","isCurrent":false,"type":"Course","coursework":["HTML","CSS","JavaScript","TypeScript","React","Node.js","Next.js","Git","APIs","UX/UI Design & Prototyping"],"description":"Intensive / Project-Based","createdAt":"2025-12-03T05:34:41.527Z","updatedAt":"2025-12-03T19:51:04.094Z","__v":0},{"_id":"692fcbf1d80b1d6f2dfa96b9","user":"692fcb31d80b1d6f2dfa9599","institution":"Escola 42 Porto","degree":"Software Engineering","startDate":"2025-02-22T00:00:00.000Z","endDate":"2025-02-26T00:00:00.000Z","isCurrent":true,"type":"Course","coursework":["Algorithms","Data Structures","Programming Skills","Computer Networks","Databases & Systems Programming","Collaborative Projects","Software Development"],"description":"Non-Traditional Education","createdAt":"2025-12-03T05:34:41.256Z","updatedAt":"2025-12-06T03:03:22.271Z","__v":0},{"_id":"692fcbf1d80b1d6f2dfa96c0","user":"692fcb31d80b1d6f2dfa9599","institution":"University Portucalense","degree":"Master’s Degree","startDate":"2024-09-22T00:00:00.000Z","endDate":null,"isCurrent":true,"type":"Course","coursework":["Cloud Infrastructure","Computer Networks","Databases","IoT Integration","Artificial Intelligence","Cloud & IoT","Data Science","AI-Driven","Collaborative Projects"],"description":"Computer Engineering and Computing","createdAt":"2025-12-03T05:34:41.540Z","updatedAt":"2025-12-06T03:02:33.663Z","__v":0},{"_id":"692fcbf1d80b1d6f2dfa96b5","user":"692fcb31d80b1d6f2dfa9599","institution":"Instituto Superior Politecnico Kalandula de Angola","degree":"Bachelor’s degree","startDate":"2016-01-22T00:00:00.000Z","endDate":"2022-03-03T00:00:00.000Z","isCurrent":false,"type":"Course","coursework":["Software Engineering","Distributed Systems","Databases","Computer Networks","Artificial Intelligence","Cloud & IoT","Information Security","Project Management","Business Management"],"description":"Computer Engineering","createdAt":"2025-12-03T05:34:41.254Z","updatedAt":"2025-12-06T03:00:59.676Z","__v":0}],"skills":[{"skillType":"Technical","_id":"692fcb90d80b1d6f2dfa95d5","user":"692fcb31d80b1d6f2dfa9599","technology":"TypeScript","level":4,"category":"Backend","type":"Professional","description":"","createdAt":"2025-12-03T05:33:04.706Z","updatedAt":"2025-12-03T05:33:04.706Z","__v":0},{"skillType":"Technical","_id":"692fcbeed80b1d6f2dfa9694","user":"692fcb31d80b1d6f2dfa9599","technology":"EdgeX Foundry","level":4,"category":"IoT","type":"Professional","description":"","createdAt":"2025-12-03T05:34:38.100Z","updatedAt":"2025-12-03T05:34:38.100Z","__v":0},{"skillType":"Technical","_id":"692fcbf1d80b1d6f2dfa96b3","user":"692fcb31d80b1d6f2dfa9599","technology":"System Automation","level":4,"category":"Tool","type":"Professional","description":"","createdAt":"2025-12-03T05:34:41.250Z","updatedAt":"2025-12-03T05:34:41.250Z","__v":0},{"skillType":"Technical","_id":"692fcb94d80b1d6f2dfa95f3","user":"692fcb31d80b1d6f2dfa9599","technology":"Git","level":4,"category":"Tool","type":"Professional","description":"","createdAt":"2025-12-03T05:33:08.387Z","updatedAt":"2025-12-03T05:33:08.387Z","__v":0},{"skillType":"Technical","_id":"692fcb93d80b1d6f2dfa95e8","user":"692fcb31d80b1d6f2dfa9599","technology":"Linux","level":4,"category":"Tool","type":"Professional","description":"","createdAt":"2025-12-03T05:33:07.147Z","updatedAt":"2025-12-03T05:33:07.147Z","__v":0},{"skillType":"Technical","_id":"692fcbeed80b1d6f2dfa969a","user":"692fcb31d80b1d6f2dfa9599","technology":"MQTT","level":4,"category":"IoT","type":"Professional","description":"","createdAt":"2025-12-03T05:34:38.758Z","updatedAt":"2025-12-03T05:34:38.758Z","__v":0},{"skillType":"Technical","_id":"692fcbe9d80b1d6f2dfa9672","user":"692fcb31d80b1d6f2dfa9599","technology":"Shell & Linux","level":4,"category":"Tool","type":"Professional","description":"","createdAt":"2025-12-03T05:34:33.851Z","updatedAt":"2025-12-03T05:34:33.851Z","__v":0},{"skillType":"Technical","_id":"692fcb91d80b1d6f2dfa95da","user":"692fcb31d80b1d6f2dfa9599","technology":"React","level":4,"category":"Frontend","type":"Professional","description":"","createdAt":"2025-12-03T05:33:05.328Z","updatedAt":"2025-12-03T05:33:05.328Z","__v":0},{"skillType":"Technical","_id":"692fcb90d80b1d6f2dfa95cf","user":"692fcb31d80b1d6f2dfa9599","technology":"Python","level":4,"category":"Backend","type":"Professional","description":"","createdAt":"2025-12-03T05:33:04.128Z","updatedAt":"2025-12-03T05:33:04.128Z","__v":0},{"skillType":"Technical","_id":"692fcbebd80b1d6f2dfa9680","user":"692fcb31d80b1d6f2dfa9599","technology":"Next.js","level":4,"category":"Frontend","type":"Professional","description":"","createdAt":"2025-12-03T05:34:35.674Z","updatedAt":"2025-12-03T05:34:35.674Z","__v":0},{"skillType":"Technical","_id":"692fcb91d80b1d6f2dfa95df","user":"692fcb31d80b1d6f2dfa9599","technology":"Node.js","level":4,"category":"Backend","type":"Professional","description":"","createdAt":"2025-12-03T05:33:05.910Z","updatedAt":"2025-12-03T05:33:05.910Z","__v":0},{"skillType":"Technical","_id":"692fcb92d80b1d6f2dfa95e3","user":"692fcb31d80b1d6f2dfa9599","technology":"MongoDB","level":3,"category":"Database","type":"Professional","description":"","createdAt":"2025-12-03T05:33:06.529Z","updatedAt":"2025-12-03T05:33:06.529Z","__v":0},{"skillType":"Technical","_id":"692fcbedd80b1d6f2dfa9690","user":"692fcb31d80b1d6f2dfa9599","technology":"influxDB","level":3,"category":"Database","type":"Professional","description":"","createdAt":"2025-12-03T05:34:37.541Z","updatedAt":"2025-12-03T05:34:37.541Z","__v":0},{"skillType":"Technical","_id":"692fcbecd80b1d6f2dfa968a","user":"692fcb31d80b1d6f2dfa9599","technology":"MySQL","level":3,"category":"Database","type":"Professional","description":"","createdAt":"2025-12-03T05:34:36.947Z","updatedAt":"2025-12-03T05:34:36.947Z","__v":0},{"skillType":"Technical","_id":"692fcbe9d80b1d6f2dfa966c","user":"692fcb31d80b1d6f2dfa9599","technology":"C","level":3,"category":"Backend","type":"Professional","description":"","createdAt":"2025-12-03T05:34:33.242Z","updatedAt":"2025-12-03T05:34:33.242Z","__v":0},{"skillType":"Technical","_id":"692fcb94d80b1d6f2dfa95f8","user":"692fcb31d80b1d6f2dfa9599","technology":"Machine Learning","level":3,"category":"Tool","type":"Professional","description":"","createdAt":"2025-12-03T05:33:08.968Z","updatedAt":"2025-12-03T05:33:08.968Z","__v":0},{"skillType":"Technical","_id":"692fcbefd80b1d6f2dfa96a3","user":"692fcb31d80b1d6f2dfa9599","technology":"Figma","level":3,"category":"Tool","type":"Professional","description":"","createdAt":"2025-12-03T05:34:39.970Z","updatedAt":"2025-12-03T05:34:39.970Z","__v":0},{"skillType":"Technical","_id":"692fcb93d80b1d6f2dfa95ee","user":"692fcb31d80b1d6f2dfa9599","technology":"Docker","level":3,"category":"Tool","type":"Professional","description":"","createdAt":"2025-12-03T05:33:07.782Z","updatedAt":"2025-12-03T05:33:07.782Z","__v":0},{"skillType":"Technical","_id":"692fcb95d80b1d6f2dfa9605","user":"692fcb31d80b1d6f2dfa9599","technology":"Cloud & IoT","level":3,"category":"Tool","type":"Professional","description":"","createdAt":"2025-12-03T05:33:09.524Z","updatedAt":"2025-12-03T05:33:09.524Z","__v":0}],"projects":[{"_id":"693e253d31a166d8a0322109","user":"692fcb31d80b1d6f2dfa9599","name":"portfolioHub","description":"PortfolioHub is a complete full-stack application designed for managing and showcasing professional portfolios. It provides a robust administrative dashboard to manage profile information, work experience, education, projects, and skills, serving as a centralized data source for a personal portfolio.","category":"Pessoal","employmentType":"PERSONAL PROJECT","role":"","company":null,"course":null,"type":"","technologies":["NextJS","NodeJS","Docker","MongoDB","JavaScript"],"link":"https://portfolio-hub-neon.vercel.app/","context":"","responsibilities":[],"items":["Authentication & Security","Administrative Dashboard","Profile Management","Artificial Intelligence","Integrations with: GitHub and LinkedIn","PDF resume generation","Customizable templates","Integration with portfolio data","Professional export","Public API for integrations","Custom URLs based on username"],"startDate":"2025-12-03T00:00:00.000Z","isCurrent":true,"source":"github","readme":"# PortfolioHub\n\nPortfolioHub é uma aplicação full-stack completa para gerenciamento e exibição de portfólios profissionais. O sistema oferece um painel administrativo robusto para gerenciar informações de perfil, experiências, educação, projetos e habilidades, servindo como uma fonte centralizada de dados para um portfólio pessoal.\n\n## ✨ Funcionalidades\n\n### 🔐 Autenticação e Segurança\n- Sistema de login e registro com JWT e cookies HTTP-only\n- Autenticação segura multi-usuário\n- Middleware de autorização por usuário\n- Senhas hasheadas com bcrypt\n\n### 📊 Dashboard Administrativo\n- Interface moderna e responsiva\n- Suporte a temas Dark/Light mode\n- Gerenciamento completo de conteúdo do portfólio\n- Estatísticas e visualizações\n\n### 👤 Gerenciamento de Perfil\n- Edição de informações pessoais e profissionais\n- Contatos (LinkedIn, GitHub, email, telefone)\n- Localização e anos de experiência\n- Configurações de privacidade\n\n### 📚 Módulos de Conteúdo\n- **Experiência Profissional**: Histórico completo de trabalho\n- **Formação Acadêmica**: Educação e cursos\n- **Habilidades**: Skills técnicas com níveis de proficiência\n- **Idiomas**: Idiomas falados com níveis\n- **Projetos**: Portfólio de projetos com categorias\n- **Publicações**: Posts e artigos\n- **Categorias**: Sistema de categorização personalizado\n\n### 🤖 Inteligência Artificial\n- **Avaliação de Carreira**: Análise completa do estado atual\n- **Sugestões de Vagas**: Recomendações baseadas no perfil\n- **Análise de Lacunas**: Comparação com cargo desejado\n- **Análise de Carreira Avançada**: Score de proximidade, gráficos, recomendações\n- **Geração de Conteúdo**: Criação de posts para LinkedIn com IA\n\n### 🔗 Integrações\n\n#### GitHub\n- Conexão OAuth com GitHub\n- Importação automática de repositórios\n- Sincronização de projetos\n- Identificação visual de projetos importados\n\n#### LinkedIn\n- Conexão OAuth com LinkedIn\n- Criação e publicação de posts\n- Agendamento de posts\n- Templates inteligentes (projetos, conquistas)\n- Geração de conteúdo com IA\n\n### 📄 Resume Builder\n- Geração de currículos em PDF\n- Templates personalizáveis\n- Integração com dados do portfólio\n- Exportação profissional\n\n### 🌐 Portfólio Público\n- Visualização pública do portfólio\n- API pública para integração\n- URLs personalizadas por username\n\n## 🛠️ Tecnologias e Ferramentas\n\n### Frontend\n- **Framework**: [Next.js 16.0.7](https://nextjs.org/) (App Router)\n- **Biblioteca UI**: [React 19.2.0](https://react.dev/)\n- **Estilização**: [TailwindCSS v4](https://tailwindcss.com/)\n- **Componentes UI**: [Radix UI](https://www.radix-ui.com/)\n- **Gerenciamento de Estado**: [Zustand](https://github.com/pmndrs/zustand)\n- **Cliente HTTP**: [Axios](https://axios-http.com/)\n- **Ícones**: [Lucide React](https://lucide.dev/)\n- **Gráficos**: [Recharts](https://recharts.org/)\n- **Markdown**: [react-markdown](https://github.com/remarkjs/react-markdown)\n- **Linguagem**: TypeScript\n\n### Backend\n- **Runtime**: [Node.js](https://nodejs.org/)\n- **Framework**: [Express.js](https://expressjs.com/)\n- **Banco de Dados**: [MongoDB](https://www.mongodb.com/) com [Mongoose](https://mongoosejs.com/)\n- **Autenticação**: JWT (JSON Web Tokens) & bcryptjs\n- **Documentação**: Swagger UI Express\n- **Validação**: Express Validator\n- **IA**: [OpenRouter](https://openrouter.ai/) API\n- **GitHub API**: [@octokit/rest](https://github.com/octokit/rest.js)\n- **Linguagem**: JavaScript (ES Modules)\n\n### Ferramentas\n- **Linter**: ESLint\n- **Package Manager**: npm\n- **Versionamento**: Git\n\n## 🚀 Como Executar\n\n### Pré-requisitos\n\n- Node.js 18+ instalado\n- MongoDB rodando localmente ou URI de conexão\n- Contas de desenvolvedor (opcional):\n  - GitHub (para integração)\n  - LinkedIn (para integração)\n  - OpenRouter (para IA)\n\n### Instalação\n\n1. **Clone o repositório**:\n   ```bash\n   git clone <repository-url>\n   cd portfolioHub\n   ```\n\n2. **Configure o Backend**:\n   ```bash\n   cd backend\n   npm install\n   cp env.example .env\n   # Edite o arquivo .env com suas configurações\n   ```\n\n3. **Configure o Frontend**:\n   ```bash\n   cd ../frontend\n   npm install\n   # Crie um arquivo .env.local com as variáveis necessárias\n   ```\n\n4. **Inicie o MongoDB** (se estiver rodando localmente):\n   ```bash\n   # MongoDB deve estar rodando na porta 27017\n   # Ou configure a URI no .env do backend\n   ```\n\n5. **Inicie o Backend**:\n   ```bash\n   cd backend\n   npm run dev\n   ```\n   O servidor estará rodando em `http://localhost:5000`\n\n6. **Inicie o Frontend**:\n   ```bash\n   cd frontend\n   npm run dev\n   ```\n   A aplicação estará rodando em `http://localhost:3000`\n\n### Variáveis de Ambiente\n\n#### Backend (`backend/.env`)\n\n```env\n# Server\nPORT=5000\nNODE_ENV=development\n\n# MongoDB\nMONGODB_URI=mongodb://localhost:27017/portfoliohub\n\n# JWT\nJWT_SECRET=your-super-secret-jwt-key-change-in-production\nJWT_EXPIRE=7d\n\n# OpenRouter AI\nOPENROUTER_API_KEY=your-openrouter-api-key-here\nOPENROUTER_BASE_URL=https://openrouter.ai/api/v1\n\n# GitHub OAuth\nGITHUB_CLIENT_ID=your-github-client-id\nGITHUB_CLIENT_SECRET=your-github-client-secret\nGITHUB_ENCRYPTION_KEY=your-64-character-hex-encryption-key-for-tokens\n\n# LinkedIn OAuth\nLINKEDIN_CLIENT_ID=your-linkedin-client-id\nLINKEDIN_CLIENT_SECRET=your-linkedin-client-secret\nLINKEDIN_REDIRECT_URI=http://localhost:3000/dashboard/linkedin\nLINKEDIN_ENCRYPTION_KEY=your-64-character-hex-encryption-key-for-tokens\n\n# URLs\nFRONTEND_URL=http://localhost:3000\nORIGIN_URL=https://your-production-url.com\n```\n\n#### Frontend (`frontend/.env.local`)\n\n```env\n# API\nNEXT_PUBLIC_API_URL=http://localhost:5000\n\n# GitHub OAuth\nNEXT_PUBLIC_GITHUB_CLIENT_ID=your-github-client-id\n\n# LinkedIn OAuth\nNEXT_PUBLIC_LINKEDIN_CLIENT_ID=your-linkedin-client-id\n```\n\n### Configuração de Integrações\n\n#### GitHub\n\n1. Acesse [GitHub Developer Settings](https://github.com/settings/developers)\n2. Crie uma nova OAuth App\n3. Configure:\n   - **Homepage URL**: `http://localhost:3000` (dev) ou sua URL de produção\n   - **Authorization callback URL**: `http://localhost:3000/dashboard/projects` (dev) ou `https://your-domain.com/dashboard/projects` (prod)\n4. Copie o Client ID e Client Secret para o `.env`\n\n#### LinkedIn\n\n1. Acesse [LinkedIn Developers](https://www.linkedin.com/developers/)\n2. Crie uma nova aplicação\n3. Adicione os produtos:\n   - **Share on LinkedIn** (obrigatório para posts)\n   - **Sign In with LinkedIn using OpenID Connect** (obrigatório para OAuth)\n4. Configure as URLs de redirecionamento:\n   - `http://localhost:3000/dashboard/linkedin` (dev)\n   - `https://your-domain.com/dashboard/linkedin` (prod)\n5. Copie o Client ID e Client Secret para o `.env`\n\n#### OpenRouter (IA)\n\n1. Acesse [OpenRouter](https://openrouter.ai/)\n2. Crie uma conta e obtenha sua API Key\n3. Adicione a chave no `.env` do backend\n\n## 📚 Documentação da API\n\nA documentação completa da API está disponível via Swagger UI:\n\n- **Desenvolvimento**: `http://localhost:5000/api-docs`\n- **Produção**: `https://your-api-url.com/api-docs`\n\n### Endpoints Principais\n\n#### Autenticação\n- `POST /api/auth/register` - Registrar novo usuário\n- `POST /api/auth/login` - Login\n- `GET /api/auth/me` - Obter usuário atual\n\n#### Perfis\n- `GET /api/profiles` - Listar perfis\n- `POST /api/profiles` - Criar perfil\n- `PUT /api/profiles/:id` - Atualizar perfil\n- `DELETE /api/profiles/:id` - Deletar perfil\n\n#### Projetos\n- `GET /api/projects` - Listar projetos\n- `POST /api/projects` - Criar projeto\n- `PUT /api/projects/:id` - Atualizar projeto\n- `DELETE /api/projects/:id` - Deletar projeto\n\n#### GitHub\n- `GET /api/github/status` - Status da conexão\n- `POST /api/github/connect` - Conectar GitHub\n- `GET /api/github/repositories` - Listar repositórios\n- `POST /api/github/import` - Importar repositórios\n- `POST /api/github/sync` - Sincronizar projetos\n- `DELETE /api/github/disconnect` - Desconectar\n\n#### LinkedIn\n- `GET /api/linkedin/status` - Status da conexão\n- `POST /api/linkedin/connect` - Conectar LinkedIn\n- `GET /api/linkedin/templates` - Obter templates\n- `POST /api/linkedin/generate-content` - Gerar conteúdo com IA\n- `POST /api/linkedin/posts` - Criar post\n- `DELETE /api/linkedin/disconnect` - Desconectar\n\n#### IA\n- `POST /api/ai/career-assessment` - Avaliação de carreira\n- `POST /api/ai/job-suggestions` - Sugestões de vagas\n- `POST /api/ai/skill-gap` - Análise de lacunas\n- `GET /api/ai/history` - Histórico de consultas\n\n## 🏗️ Estrutura do Projeto\n\n```\nportfolioHub/\n├── backend/\n│   ├── controllers/      # Lógica de negócio\n│   ├── models/           # Modelos do MongoDB\n│   ├── routes/           # Rotas da API\n│   ├── middleware/       # Middlewares (auth, etc)\n│   ├── jobs/             # Jobs agendados (scheduler)\n│   ├── scripts/          # Scripts utilitários\n│   └── server.js         # Servidor principal\n│\n├── frontend/\n│   ├── app/              # Next.js App Router\n│   │   ├── dashboard/    # Páginas do dashboard\n│   │   └── ...\n│   ├── components/       # Componentes React\n│   │   ├── ui/           # Componentes de UI\n│   │   └── ...\n│   ├── contexts/         # Contextos React\n│   ├── lib/              # Utilitários\n│   └── ...\n│\n└── README.md\n```\n\n## 🔒 Segurança\n\n- Senhas hasheadas com bcrypt (10 rounds)\n- JWT com expiração configurável\n- Cookies HTTP-only para tokens\n- Middleware de autorização por usuário\n- Validação de dados de entrada\n- Criptografia de tokens OAuth (AES-256-CBC)\n- Multi-tenant (cada usuário só acessa seus dados)\n- CORS configurado por rota\n\n## 📝 Scripts Disponíveis\n\n### Backend\n- `npm run dev` - Desenvolvimento com nodemon\n- `npm start` - Produção\n- `npm run seed` - Popular banco com dados de teste\n\n### Frontend\n- `npm run dev` - Desenvolvimento\n- `npm run build` - Build de produção\n- `npm start` - Servidor de produção\n- `npm run lint` - Executar linter\n\n## 🎯 Funcionalidades Principais\n\n### Gerenciamento de Projetos\n- Criação manual de projetos\n- Importação automática do GitHub\n- Categorização personalizada\n- Tecnologias e links\n- Datas de início/término\n- Projetos em destaque\n\n### Integração GitHub\n- Conexão OAuth segura\n- Lista de repositórios\n- Importação seletiva\n- Sincronização automática\n- Identificação visual de origem\n\n### Integração LinkedIn\n- Conexão OAuth com OpenID Connect\n- Criação de posts profissionais\n- Agendamento de publicações\n- Templates inteligentes:\n  - Posts sobre projetos\n  - Posts sobre conquistas\n  - Posts personalizados\n- Geração de conteúdo com IA\n- Scheduler automático para posts agendados\n\n### IA de Carreira\n- Avaliação completa do perfil\n- Análise de lacunas de habilidades\n- Sugestões de vagas\n- Recomendações de cursos e projetos\n- Análise de carreira avançada com gráficos\n\n## 🧪 Desenvolvimento\n\n### Regras de Desenvolvimento\n\n- Utilize toda informação disponível no diretório\n- Sempre garanta que métodos, funções e outras propriedades sejam aplicadas em concordância\n- Seguir os padrões atuais do projeto:\n  - Frontend: Next.js App Router, Componentes Funcionais, TypeScript\n  - Backend: MVC, Services, JavaScript (ES Modules)\n- Não quebrar funcionalidades existentes\n- Código bem comentado e seguro, com validações e sanitização de entradas\n- Sempre verifique a concordância das tipagens entre o frontend e o backend\n- Antes de implementar explique o porquê da implementação\n- Estrutura modular para facilitar futuras expansões e manutenção\n- Interface amigável para melhorar a experiência dos usuários\n\n### Padrões de Código\n\n- **Backend**: JavaScript ES Modules, Express.js, Mongoose\n- **Frontend**: TypeScript, React 19, Next.js 16, TailwindCSS\n- **Componentes**: Funcionais com hooks\n- **Estado**: Zustand para estado global, useState para local\n- **API**: Axios com interceptors para autenticação\n\n## 📦 Dependências Principais\n\n### Backend\n- `express` - Framework web\n- `mongoose` - ODM para MongoDB\n- `jsonwebtoken` - JWT tokens\n- `bcryptjs` - Hash de senhas\n- `@octokit/rest` - GitHub API client\n- `axios` - Cliente HTTP\n- `swagger-jsdoc` - Documentação Swagger\n\n### Frontend\n- `next` - Framework React\n- `react` - Biblioteca UI\n- `tailwindcss` - Framework CSS\n- `axios` - Cliente HTTP\n- `zustand` - Gerenciamento de estado\n- `lucide-react` - Ícones\n- `recharts` - Gráficos\n\n## 🚀 Deploy\n\n### Backend (Render/Vercel/Heroku)\n1. Configure as variáveis de ambiente\n2. Configure a URI do MongoDB\n3. Deploy do código\n\n### Frontend (Vercel/Netlify)\n1. Configure as variáveis de ambiente\n2. Configure a URL da API\n3. Deploy do código\n\n## 📄 Licença\n\nISC\n\n## 👥 Contribuindo\n\n1. Fork o projeto\n2. Crie uma branch para sua feature (`git checkout -b feature/AmazingFeature`)\n3. Commit suas mudanças (`git commit -m 'Add some AmazingFeature'`)\n4. Push para a branch (`git push origin feature/AmazingFeature`)\n5. Abra um Pull Request\n\n## 📞 Suporte\n\nPara questões e suporte, abra uma issue no repositório.\n\n---\n\nDesenvolvido com ❤️ usando Next.js, Express e MongoDB\n","createdAt":"2025-12-14T02:47:25.391Z","updatedAt":"2025-12-18T19:30:31.945Z","__v":1,"tools":[],"githubRepoId":1108876078,"githubUrl":"https://github.com/Mario2211-debug/portfolioHub","lastSyncedAt":"2025-12-18T19:28:50.054Z"},{"tools":[],"source":"manual","readme":"","_id":"692fcbf4d80b1d6f2dfa96d8","user":"692fcb31d80b1d6f2dfa9599","name":"Swift Core ERP","description":"Developed and deployed a full-stack ERP system covering sales, inventory, finance, and HR management.","category":"Pessoal","employmentType":"PERSONAL PROJECT","role":"","company":null,"course":null,"type":"","technologies":["TypeScript","Node.js","MongoDB","React"],"link":"https://swifterp.pt/","context":"","responsibilities":[],"startDate":"2024-01-06T00:00:00.000Z","endDate":null,"isCurrent":true,"createdAt":"2025-12-03T05:34:44.802Z","updatedAt":"2025-12-06T02:51:56.800Z","__v":0,"items":["Built the backend with TypeScript/Node.js and a MongoDB database.","Implemented the frontend using React for responsive and interactive UI.","Integrated modules for sales, inventory, finance, and HR with real-time data updates.","Deployed the system live, ensuring scalability and maintainability."]},{"tools":[],"_id":"692fcb9ad80b1d6f2dfa9635","user":"692fcb31d80b1d6f2dfa9599","name":"MeetEasy","description":"Meeting management system with interactive calendar, groups, and notifications. Developed with Next.js, React, Express.js,\nMongoDB, TailwindCSS, Nodemailer and Context API.","category":"Acadêmico","employmentType":"PERSONAL PROJECT","role":"","company":null,"course":null,"type":"","technologies":["Next.js","React","Express.js","MongoDB","TailwindCSS","JavaScript"],"link":"https://github.com/Mario2211-debug/MeetEasy","context":"","responsibilities":[],"startDate":"2025-11-06T00:00:00.000Z","endDate":"2025-11-30T00:00:00.000Z","isCurrent":false,"createdAt":"2025-12-03T05:33:14.442Z","updatedAt":"2025-12-11T23:46:26.223Z","__v":1,"items":["Built the backend with TypeScript/Node.js and a MongoDB database.","User authentication and management.","Meeting creation, editing, and response.","Dashboard with statistics and interactive calendar.","Integration with email and Telegram for notifications."],"githubRepoId":1089881366,"githubUrl":"https://github.com/Mario2211-debug/MeetEasy","lastSyncedAt":"2025-12-11T23:46:26.220Z","readme":"# MeetEasy 📅\n\nSistema completo de gerenciamento de reuniões com interface moderna, minimalista e intuitiva. Gerencie participantes, crie grupos, agende reuniões e visualize tudo em um calendário interativo.\n\n![Next.js](https://img.shields.io/badge/Next.js-16.0-black)\n![React](https://img.shields.io/badge/React-19.0-blue)\n![Express](https://img.shields.io/badge/Express-5.1-green)\n![MongoDB](https://img.shields.io/badge/MongoDB-6.20-green)\n![TailwindCSS](https://img.shields.io/badge/TailwindCSS-4.0-38bdf8)\n\n## ✨ Características\n\n- 🎨 **Interface Moderna**: Design minimalista com espaços em branco e cores bem contrastadas\n- 📅 **Calendário Interativo**: Visualize reuniões com hover tooltips mostrando detalhes\n- 👥 **Sistema de Grupos**: Crie grupos de participantes para facilitar o agendamento\n- 🔔 **Notificações**: Email e Telegram para convites de reuniões\n- 🌙 **Modo Escuro**: Suporte completo a tema claro/escuro\n- 📱 **Responsivo**: Funciona perfeitamente em desktop, tablet e mobile\n- 🔐 **Autenticação**: Sistema seguro de login e registro\n- 📊 **Dashboard**: Estatísticas e visão geral das reuniões\n\n## 🚀 Tecnologias\n\n### Frontend\n- **Next.js 16.0** - Framework React\n- **React 19.0** - Biblioteca UI\n- **TailwindCSS 4.0** - Estilização\n- **Lucide React** - Ícones\n- **Context API** - Gerenciamento de estado\n\n### Backend\n- **Express 5.1** - Framework Node.js\n- **MongoDB** - Banco de dados\n- **Mongoose 8.19** - ODM para MongoDB\n- **Nodemailer** - Envio de emails\n- **Axios** - Cliente HTTP\n\n## 📋 Pré-requisitos\n\n- Node.js 18+ \n- MongoDB (local ou Atlas)\n- npm ou yarn\n\n## 🛠️ Instalação\n\n1. **Clone o repositório**\n```bash\ngit clone <repository-url>\ncd hackathon\n```\n\n2. **Instale as dependências**\n```bash\nnpm install\n```\n\n3. **Configure as variáveis de ambiente**\n\nCrie um arquivo `.env` na raiz do projeto:\n\n```env\n# MongoDB\nMONGODB_URI=mongodb://localhost:27017/meeteasy\n# ou para MongoDB Atlas:\n# MONGODB_URI=mongodb+srv://usuario:senha@cluster.mongodb.net/meeteasy\n\n# Email (SMTP)\nSMTP_HOST=smtp.gmail.com\nSMTP_PORT=587\nSMTP_USER=seu-email@gmail.com\nSMTP_PASS=sua-senha-app\nFROM_EMAIL=seu-email@gmail.com\nFROM_NAME=MeetEasy\n\n# Telegram (opcional)\nTELEGRAM_BOT_TOKEN=seu-token-bot\n\n# Porta do servidor\nPORT=3000\n```\n\n4. **Execute o seed (opcional)**\n\nPara popular o banco com dados de exemplo:\n\n```bash\nnode seed.js\n```\n\n5. **Inicie o servidor de desenvolvimento**\n\n```bash\nnpm run dev\n```\n\nO servidor estará disponível em `http://localhost:3000`\n\n## 📁 Estrutura do Projeto\n\n```\nhackathon/\n├── backend/\n│   ├── controllers/      # Lógica de negócio\n│   │   ├── authController.js\n│   │   ├── meetingController.js\n│   │   └── groupController.js\n│   ├── models/          # Modelos MongoDB\n│   │   ├── User.js\n│   │   ├── Meeting.js\n│   │   └── Group.js\n│   ├── routes/          # Rotas da API\n│   │   └── index.js\n│   ├── lib/            # Bibliotecas\n│   │   └── mongodb.js\n│   └── utils/          # Utilitários\n│       └── notify.js\n├── components/          # Componentes React\n│   ├── Calendar.jsx\n│   ├── Modal.jsx\n│   ├── Sidebar.jsx\n│   ├── Table.jsx\n│   ├── Topbar.jsx\n│   └── ToastProvider.jsx\n├── pages/               # Páginas Next.js\n│   ├── Dashboard.jsx\n│   ├── login.jsx\n│   ├── register.jsx\n│   ├── meetings/\n│   └── participants/\n├── services/            # Serviços de API\n│   └── api.js\n├── context/            # Contextos React\n│   ├── AuthContext.jsx\n│   └── ThemeContext.jsx\n├── styles/             # Estilos globais\n│   └── globals.css\n├── server.js           # Servidor Express + Next.js\n└── package.json\n```\n\n## 🎯 Funcionalidades\n\n### Autenticação\n- ✅ Registro de novos usuários\n- ✅ Login seguro\n- ✅ Proteção de rotas\n- ✅ Gerenciamento de sessão\n\n### Reuniões\n- ✅ Criar reuniões com título, data e horário\n- ✅ Adicionar participantes manualmente\n- ✅ Adicionar grupos inteiros de uma vez\n- ✅ Visualizar todas as reuniões em tabela\n- ✅ Status de reuniões (Pendente, Confirmada, Cancelada)\n- ✅ Resposta de participantes (aceitar/recusar)\n\n### Participantes\n- ✅ Cadastro de novos participantes\n- ✅ Listagem de todos os participantes\n- ✅ Edição e remoção (via detalhes)\n\n### Grupos\n- ✅ Criar grupos de participantes\n- ✅ Adicionar/remover membros dos grupos\n- ✅ Usar grupos ao criar reuniões\n- ✅ Visualizar grupos criados\n\n### Dashboard\n- ✅ Estatísticas de reuniões\n- ✅ Calendário interativo com hover\n- ✅ Lista de próximas reuniões\n- ✅ Cards informativos\n\n### Calendário Interativo\n- ✅ Navegação entre meses\n- ✅ Indicadores visuais para dias com reuniões\n- ✅ Tooltip com detalhes ao hover\n- ✅ Destaque para o dia atual\n- ✅ Visualização de participantes nas reuniões\n\n## 🔌 API Endpoints\n\n### Autenticação\n```\nPOST   /api/auth/login          - Login de usuário\nPOST   /api/auth/register        - Registro de novo usuário\n```\n\n### Usuários\n```\nGET    /api/users                - Listar todos os usuários\n```\n\n### Reuniões\n```\nGET    /api/meetings             - Listar todas as reuniões\nPOST   /api/meeting               - Criar nova reunião\nGET    /api/meetings/respond/:meetingId/:userId - Responder convite\n```\n\n### Grupos\n```\nGET    /api/groups                - Listar todos os grupos\nPOST   /api/groups                - Criar novo grupo\nPUT    /api/groups/:groupId       - Atualizar grupo\nDELETE /api/groups/:groupId       - Deletar grupo\n```\n\n## 🎨 Design System\n\n### Cores\n- **Primária**: Azul (#2563eb / #3b82f6)\n- **Sucesso**: Verde (#10b981)\n- **Aviso**: Amarelo (#f59e0b)\n- **Erro**: Vermelho (#ef4444)\n- **Neutro**: Cinza (escala completa)\n\n### Componentes\n- **Cards**: Bordas arredondadas, sombras suaves\n- **Botões**: Estados hover, disabled, loading\n- **Inputs**: Focus states claros, validação visual\n- **Modais**: Backdrop blur, animações suaves\n- **Tabelas**: Hover states, separadores visuais\n\n## 📱 Responsividade\n\n- **Desktop**: Layout completo com sidebar fixa\n- **Tablet**: Sidebar adaptável\n- **Mobile**: Sidebar colapsável, layout otimizado\n\n## 🌙 Modo Escuro\n\nO sistema suporta tema claro e escuro automaticamente:\n- Cores adaptadas para ambos os temas\n- Contraste adequado para acessibilidade\n- Transições suaves entre temas\n- Preferência do usuário salva\n\n## 🚀 Scripts Disponíveis\n\n```bash\n# Desenvolvimento\nnpm run dev          # Inicia servidor com hot-reload\n\n# Produção\nnpm run build        # Build do Next.js\nnpm start            # Inicia servidor de produção\n\n# Seed\nnode seed.js         # Popula banco com dados de exemplo\n```\n\n## 📝 Variáveis de Ambiente\n\n| Variável | Descrição | Obrigatório |\n|----------|-----------|-------------|\n| `MONGODB_URI` | URI de conexão MongoDB | ✅ Sim |\n| `SMTP_HOST` | Host SMTP para emails | ✅ Sim |\n| `SMTP_PORT` | Porta SMTP | ✅ Sim |\n| `SMTP_USER` | Usuário SMTP | ✅ Sim |\n| `SMTP_PASS` | Senha SMTP | ✅ Sim |\n| `FROM_EMAIL` | Email remetente | ✅ Sim |\n| `FROM_NAME` | Nome remetente | ✅ Sim |\n| `TELEGRAM_BOT_TOKEN` | Token do bot Telegram | ❌ Opcional |\n| `PORT` | Porta do servidor | ❌ Não (padrão: 3000) |\n\n## 🧪 Testando\n\n### Criar uma reunião\n1. Faça login no sistema\n2. Vá em \"Meetings\"\n3. Clique em \"Nova Reunião\"\n4. Preencha os dados e adicione participantes\n5. Clique em \"Criar Reunião\"\n\n### Criar um grupo\n1. Vá em \"Participants\"\n2. Clique em \"Novo Grupo\"\n3. Preencha o nome e selecione membros\n4. Clique em \"Criar Grupo\"\n\n### Usar grupo em reunião\n1. Ao criar uma reunião, selecione um grupo no dropdown\n2. Todos os membros do grupo serão adicionados automaticamente\n3. Você pode adicionar/remover participantes individualmente\n\n## 🐛 Troubleshooting\n\n### Erro de conexão MongoDB\n- Verifique se o MongoDB está rodando\n- Confirme a URI no `.env`\n- Verifique permissões de acesso\n\n### Emails não sendo enviados\n- Verifique credenciais SMTP no `.env`\n- Para Gmail, use \"Senha de App\" (não a senha normal)\n- Verifique firewall/portas\n\n### Erro ao iniciar servidor\n- Verifique se todas as dependências foram instaladas\n- Confirme Node.js 18+\n- Verifique logs de erro no console\n\n## 📄 Licença\n\nEste projeto está sob a licença MIT.\n\n## 👥 Contribuindo\n\nContribuições são bem-vindas! Sinta-se à vontade para:\n1. Fazer fork do projeto\n2. Criar uma branch para sua feature (`git checkout -b feature/AmazingFeature`)\n3. Commit suas mudanças (`git commit -m 'Add some AmazingFeature'`)\n4. Push para a branch (`git push origin feature/AmazingFeature`)\n5. Abrir um Pull Request\n\n## 📧 Suporte\n\nPara questões ou sugestões, abra uma issue no repositório.\n\n---\n\nDesenvolvido com ❤️ usando Next.js, Express e MongoDB\n","source":"github"},{"tools":[],"source":"manual","readme":"","_id":"692fcb99d80b1d6f2dfa9631","user":"692fcb31d80b1d6f2dfa9599","name":"CineVerse","description":"Web system for managing movies with a modern interface and complete CRUD and filter features. Developed with Next.js,\nExpress.js, MongoDB, TailwindCSS, Framer Motion, TypeScript","category":"Acadêmico","employmentType":"PERSONAL PROJECT","role":"","company":null,"course":null,"type":"","technologies":["Next.js","Express.js","MongoDB","TailwindCSS","TypeScript"],"link":"","context":"","responsibilities":[],"startDate":"2025-10-06T00:00:00.000Z","endDate":"2025-10-06T00:00:00.000Z","isCurrent":false,"createdAt":"2025-12-03T05:33:13.847Z","updatedAt":"2025-12-06T02:54:22.055Z","__v":0,"items":["Movie management: add, edit, view, and delete.","Rating system and filters by status and rating.","Responsive interface with dark theme design and animations"]},{"tools":[],"source":"manual","readme":"","_id":"692fcb98d80b1d6f2dfa9628","user":"692fcb31d80b1d6f2dfa9599","name":"Edge IoT Network","description":"Created an Edge IoT network using EdgeX Foundry and MQTT protocol to enable communication between sensors and the platform.","category":"Acadêmico","employmentType":"PERSONAL PROJECT","role":"","company":null,"course":null,"type":"","technologies":["EdgeX Foundry","MQTT"],"link":"","context":"","responsibilities":[],"startDate":"2025-03-06T00:00:00.000Z","endDate":"2025-07-23T00:00:00.000Z","isCurrent":false,"createdAt":"2025-12-03T05:33:12.663Z","updatedAt":"2025-12-06T02:53:07.942Z","__v":0,"items":["Designed and deployed scalable IoT infrastructure on edge devices.","Developed sensor integration and real-time data handling mechanisms."]},{"tools":[],"source":"manual","readme":"","_id":"692fcb98d80b1d6f2dfa9622","user":"692fcb31d80b1d6f2dfa9599","name":"Failure Prediction System","description":"Developed an intelligent failure prediction system based on a Master-Slave architecture with Python, enhancing predictive maintenance capabilities.","category":"Acadêmico","employmentType":"PERSONAL PROJECT","role":"Estudante","company":null,"course":null,"type":"","technologies":["Python","Machine Learning"],"link":"","context":"","responsibilities":[],"startDate":"2024-12-06T00:00:00.000Z","endDate":"2025-03-20T00:00:00.000Z","isCurrent":false,"createdAt":"2025-12-03T05:33:12.041Z","updatedAt":"2025-12-06T02:50:05.862Z","__v":0,"items":[" Implemented communication and data processing between multiple slave units and a master controller.","Applied machine learning techniques to predict system failures accurately and a dashboard created from scratch with NextJS to visualize sensors in real time."]},{"tools":[],"source":"manual","readme":"","_id":"692fcb97d80b1d6f2dfa961d","user":"692fcb31d80b1d6f2dfa9599","name":"Blog and Portfolio Website","description":"Designed and developed front-end and back-end using Next.js, Node.js, and MongoDB to showcase skills, projects, and\ntechnical articles. ","category":"Pessoal","employmentType":"PERSONAL PROJECT","role":"","company":null,"course":null,"type":"","technologies":["Next.js","Node.js","MongoDB"],"link":"https://victor-portfolio-sepia.vercel.app/","context":"","responsibilities":[],"startDate":"2023-09-22T00:00:00.000Z","endDate":null,"isCurrent":true,"createdAt":"2025-12-03T05:33:11.372Z","updatedAt":"2025-12-06T02:56:43.491Z","__v":0,"items":["Utilized AI-assisted development tools to enhance code quality and accelerate the development process."]}],"languages":[],"posts":[{"_id":"698bb399b49777132575a15e","user":"692fcb31d80b1d6f2dfa9599","title":"Dockerfile e docker-compose","slug":"dockerfile-e-docker-compose","description":"Como o Dockerfile e docker-compose se complementam?\n","content":"Nos últimos anos, o Docker se tornou uma das ferramentas mais essenciais no desenvolvimento de software, especialmente para aplicações em ambientes de produção. Entre os componentes mais importantes do Docker estão o **Dockerfile** e o **docker-compose**, que, embora possam ser utilizados separadamente, se complementam de maneira eficaz para criar uma experiência de desenvolvimento mais fluida e eficiente. Neste post, vamos explorar como esses dois elementos trabalham juntos, suas funções específicas e como utilizá-los para gerenciar aplicações complexas de forma simplificada.\n\n## O que é um Dockerfile?\n\nUm **Dockerfile** é um arquivo de texto que contém todas as instruções necessárias para construir uma imagem Docker. Cada instrução no Dockerfile cria uma nova camada na imagem, o que permite configurar todo o ambiente da aplicação. Aqui estão algumas das instruções mais comuns que você pode encontrar em um Dockerfile:\n\n- **FROM**: Define a imagem base a ser utilizada.\n- **RUN**: Executa comandos durante a construção da imagem.\n- **COPY**: Copia arquivos do sistema de arquivos local para a imagem.\n- **CMD**: Define o comando a ser executado quando um contêiner é iniciado a partir da imagem.\n\n### Exemplo de Dockerfile\n\n```dockerfile\n# Usando uma imagem base do Node.js\nFROM node:14\n\n# Definindo o diretório de trabalho\nWORKDIR /app\n\n# Copiando os arquivos do projeto\nCOPY package*.json ./\nRUN npm install\n\n# Copiando o restante dos arquivos\nCOPY . .\n\n# Expondo a porta que a aplicação usará\nEXPOSE 3000\n\n# Comando para iniciar a aplicação\nCMD [\"npm\", \"start\"]\n```\n\n## O que é o docker-compose?\n\nO **docker-compose** é uma ferramenta que permite definir e executar aplicações Docker multi-contêiner. Com um único arquivo de configuração (geralmente chamado de `docker-compose.yml`), você pode especificar todos os serviços que sua aplicação precisa, como bancos de dados, caches e outros serviços de backend.\n\n### Estrutura básica do docker-compose\n\nUm arquivo `docker-compose.yml` típico incluirá:\n\n- **version**: A versão da sintaxe do docker-compose.\n- **services**: A lista de serviços que compõem sua aplicação.\n- **networks**: Redes personalizadas para conectar serviços.\n- **volumes**: Para persistência de dados.\n\n### Exemplo de docker-compose.yml\n\n```yaml\nversion: '3.8'\n\nservices:\n  web:\n    build: .\n    ports:\n      - \"3000:3000\"\n    depends_on:\n      - db\n\n  db:\n    image: postgres:13\n    environment:\n      POSTGRES_USER: user\n      POSTGRES_PASSWORD: password\n    volumes:\n      - db_data:/var/lib/postgresql/data\n\nvolumes:\n  db_data:\n```\n\n## Como o Dockerfile e docker-compose se complementam\n\n### Construção e Orquestração\n\nO Dockerfile é responsável pela construção da imagem de contêiner da aplicação, enquanto o docker-compose facilita a orquestração de múltiplos contêineres. Quando você define um serviço em um arquivo `docker-compose.yml`, você pode referenciar o Dockerfile para construir a imagem necessária para esse serviço. Isso proporciona uma abordagem modular e escalável, onde cada serviço pode ser desenvolvido e testado de forma independente.\n\n### Gerenciamento de Dependências\n\nUsar o docker-compose permite que você especifique as dependências entre serviços. Como no exemplo acima, o serviço `web` depende do serviço `db`. O docker-compose gerencia a ordem de inicialização, garantindo que o banco de dados esteja disponível antes que a aplicação web tente se conectar a ele.\n\n### Ambiente de Desenvolvimento Consistente\n\nCom o Dockerfile e o docker-compose, você pode criar um ambiente de desenvolvimento que é idêntico ao ambiente de produção. Isso minimiza problemas de \"funciona na minha máquina\", já que todos os desenvolvedores podem iniciar a aplicação com um simples comando:\n\n```bash\ndocker-compose up\n```\n\n## Conclusão\n\nO Dockerfile e o docker-compose são ferramentas poderosas que, quando usadas em conjunto, proporcionam uma maneira robusta de desenvolver, testar e implantar aplicações. O Dockerfile permite a criação de imagens personalizadas, enquanto o docker-compose facilita a orquestração de múltiplos serviços interdependentes. Juntas, essas ferramentas não apenas melhoram a eficiência do desenvolvimento, mas também garantem que as aplicações sejam escaláveis e facilmente gerenciáveis em ambientes de produção.\n\nAo entender como cada um desses componentes funciona e como eles se complementam, você pode aproveitar ao máximo o potencial do Docker em seus projetos. Se você ainda não começou a usar essas ferramentas, agora é a hora perfeita para experimentar e ver como elas podem transformar seu fluxo de trabalho de desenvolvimento.","imageUrl":"","category":"Docker","published":true,"type":"blog","status":"draft","template":"custom","postAngle":null,"createdAt":"2026-02-10T22:39:21.589Z","updatedAt":"2026-02-10T22:39:21.589Z","__v":0},{"_id":"698bb2707b0b38d770606870","user":"692fcb31d80b1d6f2dfa9599","title":"Contextos em React","slug":"contextos-em-react","description":"Como Funcionam Contextos em React?","content":"# Como Funcionam Contextos em React\n\nA biblioteca React se tornou uma das ferramentas mais populares para o desenvolvimento de interfaces de usuário, permitindo que os desenvolvedores construam aplicações web dinâmicas e responsivas. Uma das características mais poderosas do React é seu sistema de gerenciamento de estado, e dentro desse contexto, os *Contextos* desempenham um papel crucial. Neste post, vamos explorar como funcionam os contextos em React, como utilizá-los e quando são mais apropriados.\n\n## Introdução\n\nO sistema de gerenciamento de estado do React pode ser complexo, especialmente quando lidamos com aplicações maiores. Às vezes, o estado precisa ser compartilhado entre múltiplos componentes em diferentes níveis da árvore de componentes, e isso pode levar a uma série de *props drilling* (o ato de passar propriedades de um componente pai para um componente filho, e assim por diante). É aí que os contextos entram em cena.\n\nOs contextos permitem que você compartilhe valores entre componentes sem a necessidade de passar props manualmente em cada nível. Isso não apenas simplifica o gerenciamento de estado, mas também melhora a legibilidade e a manutenibilidade do seu código.\n\n## O Que É o Contexto?\n\nO Contexto em React é uma forma de passar dados através da árvore de componentes sem ter que passar props manualmente em cada nível. Ele é especialmente útil quando você precisa compartilhar dados que podem ser considerados \"globais\" para uma árvore de componentes, como informações sobre o usuário autenticado, temas ou preferências de linguagem.\n\n## Criando um Contexto\n\nPara criar um contexto em React, você pode usar a função `createContext()` que retorna um objeto com duas propriedades principais: `Provider` e `Consumer`.\n\nAqui está um exemplo básico de como criar e utilizar um contexto:\n\n```javascript\nimport React, { createContext, useState, useContext } from 'react';\n\n// 1. Criando o Contexto\nconst ThemeContext = createContext();\n\n// 2. Criando um Provider\nconst ThemeProvider = ({ children }) => {\n  const [theme, setTheme] = useState('light');\n\n  const toggleTheme = () => {\n    setTheme((prevTheme) => (prevTheme === 'light' ? 'dark' : 'light'));\n  };\n\n  return (\n    <ThemeContext.Provider value={{ theme, toggleTheme }}>\n      {children}\n    </ThemeContext.Provider>\n  );\n};\n\n// 3. Criando um componente que consome o contexto\nconst ThemedComponent = () => {\n  const { theme, toggleTheme } = useContext(ThemeContext);\n\n  return (\n    <div style={{ background: theme === 'light' ? '#fff' : '#333', color: theme === 'light' ? '#000' : '#fff' }}>\n      <p>O tema atual é {theme}</p>\n      <button onClick={toggleTheme}>Alternar Tema</button>\n    </div>\n  );\n};\n\n// 4. Usando o Provider no aplicativo\nconst App = () => {\n  return (\n    <ThemeProvider>\n      <ThemedComponent />\n    </ThemeProvider>\n  );\n};\n\nexport default App;\n```\n\n### Explicação do Código\n\n1. **Criando o Contexto**: Utilizamos `createContext()` para criar um novo contexto chamado `ThemeContext`.\n2. **Provider**: O componente `ThemeProvider` encapsula a lógica de estado. Ele mantém o estado do tema e fornece uma função para alterná-lo.\n3. **Consumer**: O componente `ThemedComponent` utiliza o hook `useContext` para acessar o valor do contexto e renderizar o tema atual.\n4. **Usando o Provider**: O `ThemeProvider` é utilizado para envolver o componente principal da aplicação, permitindo que todos os componentes filhos acessem o contexto.\n\n## Quando Usar Contextos?\n\nOs contextos são ideais para dados que:\n\n- Precisam ser acessíveis em muitos níveis da árvore de componentes.\n- São considerados globais, como informações de autenticação ou configurações de tema.\n- Não mudam com frequência, já que atualizações de contexto causam re-renderizações nos componentes que o consomem.\n\nPor outro lado, se você está lidando com dados que mudam frequentemente ou que são específicos de um único componente, pode ser mais eficiente usar o estado local ou uma biblioteca de gerenciamento de estado como Redux ou MobX.\n\n## Conclusão\n\nOs contextos em React são uma ferramenta poderosa que permite compartilhar dados entre componentes de forma eficiente e limpa. Ao entender como funcionam e quando utilizá-los, você pode melhorar a arquitetura das suas aplicações e evitar os problemas que surgem com o *props drilling*. Lembre-se de que, embora os contextos sejam úteis, também é importante considerar o desempenho e a complexidade da sua aplicação ao decidir a melhor maneira de gerenciar o estado.\n\nSe você ainda não experimentou contextos em seus projetos React, agora é um ótimo momento para começar!","imageUrl":"","category":"FullStack","published":true,"type":"blog","status":"draft","template":"custom","postAngle":null,"createdAt":"2026-02-10T22:34:24.014Z","updatedAt":"2026-02-10T22:34:24.014Z","__v":0},{"_id":"69680cc79d43b026176ca551","user":"692fcb31d80b1d6f2dfa9599","title":"Meeting management system with interactive calendar, groups, and notifications. ","slug":"markdown-1768426695459","description":"Meeting management system with interactive calendar, groups, and notifications. Developed with Next.js, React, Express.js,\nMongoDB, TailwindCSS, Nodemailer and Context API.","content":"# Gerenciamento de Reuniões com Next.js: A Abordagem de Autenticação de Usuário\n\n## Introdução ao Tópico\n\nA autenticação de usuários é uma parte crítica de qualquer aplicação web, especialmente em sistemas de gerenciamento de reuniões como o MeetEasy. A segurança e a personalização da experiência do usuário dependem de um sistema de autenticação robusto. Neste post, vou compartilhar como implementei a autenticação de usuários no MeetEasy utilizando Next.js, com um backend desenvolvido em Express.js e MongoDB para armazenar as informações do usuário.\n\n## Como Apliquei no Projeto\n\nPara o MeetEasy, decidi usar uma abordagem baseada em JSON Web Tokens (JWT) para a autenticação. Isso permite que os usuários façam login e acessem suas informações de maneira segura. A aplicação foi dividida em duas partes principais: o frontend, construído com Next.js, e o backend, desenvolvido em Express.js, ambos comunicando-se através de APIs REST.\n\n### Fluxo de Autenticação\n\n1. **Registro de Usuário**: Os usuários podem se registrar, fornecendo um nome de usuário, e-mail e senha. Essas informações são armazenadas no banco de dados MongoDB.\n2. **Login de Usuário**: Após o registro, os usuários podem fazer login. Um token JWT é gerado e enviado ao usuário, que deve ser armazenado localmente (por exemplo, nos cookies ou no local storage).\n3. **Validação de Token**: Para acessar rotas protegidas, o token deve ser enviado em cada requisição. O backend valida o token, garantindo que o usuário esteja autenticado.\n\n## Detalhes Técnicos\n\n### Configuração do Backend\n\nNo backend, utilizei o Express.js para lidar com as solicitações de registro e login. Aqui está um exemplo de como configurar a rota de registro:\n\n```javascript\nconst express = require('express');\nconst bcrypt = require('bcrypt');\nconst jwt = require('jsonwebtoken');\nconst User = require('./models/User'); // Modelo de usuário do MongoDB\n\nconst router = express.Router();\n\n// Rota de registro\nrouter.post('/register', async (req, res) => {\n    const { username, email, password } = req.body;\n\n    // Verificações e hash da senha\n    const hashedPassword = await bcrypt.hash(password, 10);\n    const newUser = new User({ username, email, password: hashedPassword });\n\n    try {\n        await newUser.save();\n        res.status(201).send('Usuário criado com sucesso!');\n    } catch (error) {\n        res.status(400).send('Erro ao criar usuário.');\n    }\n});\n```\n\n### Rota de Login\n\nO login é onde o token JWT é gerado e enviado ao usuário:\n\n```javascript\n// Rota de login\nrouter.post('/login', async (req, res) => {\n    const { email, password } = req.body;\n    const user = await User.findOne({ email });\n\n    if (!user) {\n        return res.status(404).send('Usuário não encontrado.');\n    }\n\n    const isPasswordValid = await bcrypt.compare(password, user.password);\n    if (!isPasswordValid) {\n        return res.status(401).send('Senha incorreta.');\n    }\n\n    const token = jwt.sign({ id: user._id }, process.env.JWT_SECRET, { expiresIn: '1h' });\n    res.json({ token });\n});\n```\n\n### Integração com Next.js\n\nNo frontend, utilizei a Context API do React para gerenciar o estado de autenticação do usuário. Aqui está um exemplo de como configurar o contexto:\n\n```javascript\nimport React, { createContext, useContext, useState } from 'react';\n\nconst AuthContext = createContext();\n\nexport const AuthProvider = ({ children }) => {\n    const [user, setUser] = useState(null);\n\n    const login = (token) => {\n        localStorage.setItem('token', token);\n        setUser(true);\n    };\n\n    const logout = () => {\n        localStorage.removeItem('token');\n        setUser(null);\n    };\n\n    return (\n        <AuthContext.Provider value={{ user, login, logout }}>\n            {children}\n        </AuthContext.Provider>\n    );\n};\n\nexport const useAuth = () => {\n    return useContext(AuthContext);\n};\n```\n\n## Resultados\n\nA implementação da autenticação de usuário no MeetEasy não só melhorou a segurança da aplicação, mas também proporcionou uma experiência de usuário muito mais personalizada. Os usuários agora podem criar reuniões, gerenciar suas informações e receber notificações, tudo dentro de uma interface segura e amigável.\n\n### Benefícios Observados\n\n- **Segurança Aprimorada**: O uso de JWT e hashing de senhas com bcrypt aumentou significativamente a segurança dos dados dos usuários.\n- **Experiência do Usuário**: O gerenciamento de estado da autenticação através da Context API facilitou a implementação de funcionalidades como login automático e logout.\n- **Escalabilidade**: O design modular da autenticação permite fácil expansão no futuro, caso novas funcionalidades de segurança sejam necessárias.\n\n## Conclusão\n\nA autenticação de usuários é um aspecto essencial de qualquer aplicação moderna. No MeetEasy, a escolha de usar Next.js para o frontend e Express.js para o backend, com JWT para autenticação, provou ser uma solução eficaz e segura. Com a implementação bem-sucedida, o sistema está pronto para oferecer uma experiência de reunião interativa e personalizada, garantindo que as informações dos usuários permaneçam seguras e acessíveis apenas a eles. \n\nPara mais detalhes sobre o projeto, consulte o [repositório do MeetEasy](link-do-repositorio).","imageUrl":"","category":"Acadêmico","published":true,"type":"blog","status":"draft","template":"project","templateData":{"projectId":"692fcb9ad80b1d6f2dfa9635","projectName":"MeetEasy"},"postAngle":"technique","postTopic":"Next.js","createdAt":"2026-01-14T21:38:15.460Z","updatedAt":"2026-02-11T11:12:57.016Z","__v":0},{"_id":"69371af2e4858c531fe9c326","user":"692fcb31d80b1d6f2dfa9599","title":"Do you know how data types work in the C programming language?","slug":"do-you-know-how-data-types-work-in-the-c-programming-language","description":"Today we're going to delve a little deeper into data types in C, and the reasons behind them.","content":"## How Does a Computer Actually Store Values?\n\nHave you ever wondered how a computer knows if a value is `int`, `char`, or another type?\n\nThe short answer is: **it doesn't know**. Computres **only works with bits**.\n\n## Everything is Binary\n\nRegardless of the type you use in the code — `int`, `char`, `float` — the value **is always stored in binary**.\n\nFor example:\n\n```c\nint x = 42;\n```\nIn memory, what actually exists is something like:\n\n```\n00101010\n```\n\nThe computer **does not store decimal**, **does not store hexadecimal**, **does not store octal**, and does not store \"letters\". It only stores **0 and 1**.\n\n## Code is for Humans\n\nThe code we write is just a **human representation**. Programming languages ​​were created to make our lives easier, not the machine's.\n\nThen when you write:\n\n```c\nint x = 42;\n```\n\nThis is still **text**.\n\nOnly later does the compiler convert everything to binary. the process is, conceptually, like this:\n\n```\n42 (decimal) → 00101010 (binary)\n```\n\nThis binary value is what goes into memory.\n\n## So why do we see \"normal\" numbers in the terminal?\n\nBecause we **asked** to see them that way. Functions like `printf` use **formatters** (`%d`, `%x`, `%o`, `%f`, etc.) to say:\n\n> \"Interpret these bits in a specific way.\"\n\nExample:\n\n```c\nprintf(\"%d\", x); \n```\n\nHere, `%d` tells `printf`:\n\n> “Interpret these bits as a decimal number.”\n\n## Same value, multiple interpretations\n\nThe bits don't change.\n\nWhat changes is **how you ask it to interpret them**:\n\n```c\nprintf(\"%d\", x); // decimal → 42\nprintf(\"%x\", x); // hexadecimal → 2a\nprintf(\"%o\", x); // octal → 52\n\n```\n\nInternally, the binary value is exactly the same.\n\n## Type is not a base\n\nThis is a common mistake:\n\n* `int` is **not a numeric base** is a **type**\n* `char` is **not a numeric base** is a **type**\n\nA type is just a **container of bits**.\n\nTypically, an `int` occupies 32 bits (depending on the architecture). The numerical base only appears in two places:\n\n* In the **source code** (e.g., `42`, `0x2A`);\n\n* In the **output**, when you decide how to display the bits (`printf`).\n\n## 🧠 Final Summary\n\n* The computer **only understands binary**;\n\n* Decimal, hexadecimal, and octal are human conventions;\n\n* Types (`int`, `char`) only define **how the bits will be used**;\n\n* `printf` decides **how to interpret and display** these bits;\n\n* The value in memory never changes — only the interpretation.","imageUrl":"","category":"Learning C","published":true,"createdAt":"2025-12-08T18:37:38.141Z","updatedAt":"2025-12-18T19:22:50.495Z","__v":0,"postAngle":null,"status":"draft","template":"custom","type":"blog"}]}}