{"id":50509830,"url":"https://github.com/robsonmt/code-challenge-midfalconi","last_synced_at":"2026-06-02T19:02:30.646Z","repository":{"id":323792171,"uuid":"1094622573","full_name":"RobsonMT/Code-Challenge-MidFalconi","owner":"RobsonMT","description":null,"archived":false,"fork":false,"pushed_at":"2025-11-26T00:38:33.000Z","size":466,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-11-29T04:20:28.974Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","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/RobsonMT.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-11-12T00:39:02.000Z","updated_at":"2025-11-26T00:38:30.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/RobsonMT/Code-Challenge-MidFalconi","commit_stats":null,"previous_names":["robsonmt/code-challenge-midfalconi"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/RobsonMT/Code-Challenge-MidFalconi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RobsonMT%2FCode-Challenge-MidFalconi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RobsonMT%2FCode-Challenge-MidFalconi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RobsonMT%2FCode-Challenge-MidFalconi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RobsonMT%2FCode-Challenge-MidFalconi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/RobsonMT","download_url":"https://codeload.github.com/RobsonMT/Code-Challenge-MidFalconi/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RobsonMT%2FCode-Challenge-MidFalconi/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33833277,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-02T02:00:07.132Z","response_time":109,"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":[],"created_at":"2026-06-02T19:02:29.436Z","updated_at":"2026-06-02T19:02:30.635Z","avatar_url":"https://github.com/RobsonMT.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Desafio Técnico Fullstack — Usuários \u0026 Perfis\n\nAplicação fullstack desenvolvida com NestJS (backend) e Next.js (frontend), utilizando TypeScript em ambos os lados e TypeORM com banco em memória (SQLite).\nO projeto implementa um CRUD completo de usuários com perfis, incluindo filtros, ativação/desativação e interface web.\n\n---\n\n## Tecnologias Utilizadas\n\n- Node.js + Nest\n- TypeScript  \n- TypeORM  \n- SQLite \n- Docker \u0026 Docker Compose  \n- ESLint / Prettier  \n- dotenv  \n\n---\n\n## Como rodar o projeto localmente\n\n### 1. Clone o repositório\n\n```bash\ngit clone git@github.com:RobsonMT/Code-Challenge-MidFalconi.git\ncd Code-Challenge-MidFalconi\n```\n\n### 2. Acesse a pasta backend e instale as dependencias\n\n```bash\ncd backend/\n\nnpm install\nnpm run start:dev\n```\n\n### 3. Acesse a pasta frontend e crie um arquivo .env.local na raiz da pasta frontend\n\n```bash\ncd frontend/\n\n.env.local\nNEXT_PUBLIC_API_URL=\"http://localhost:3000\"\n\nnpm install\nnpm run dev\n```\n---\n\n## Como rodar o projeto com docker\n\n### 1. Subindo com Docker\n```bash\n# Construir e iniciar containers\ndocker-compose up --build\n\n# Derrubar containers\ndocker-compose down -v\n```\n### 2. A aplicação estará disponível em:\n- backend: http://localhost:3000/\n- Frontend: http://localhost:3001/\n\n---\n\n## Funcionalidades implementadas\n\n### Backend (NestJS + TypeORM)\n- CRUD completo de usuários (/users)\n- CRUD de perfis (/profiles)\n- Relacionamento 1:N entre Profile e User\n- Ativar / desativar usuário\n- Filtrar usuários por perfil\n- Seed automático de dados iniciais (2 perfis + 2 usuários)\n- Armazenamento em memória via SQLite\n- Estrutura modular (Users, Profiles, Seed)\n- Validação com DTOs (class-validator)\n### Frontend (Next.js + TailwindCSS)\n- Tela de listagem de usuários em tabela responsiva\n- Filtro por perfil\n- Criação, edição e exclusão de usuários\n- Modal de confirmação para exclusão\n- Toasts de feedback (sucesso/erro)\n- Campos pré-carregados no modo de edição\n- Destaque visual para usuários ativos/inativos\n- Estilo moderno com Tailwind + sombras suaves\n\n## Decisões técnicas\n\n- NestJS + TypeORM: framework e ORM consolidados, facilitando modularização, tipagem e injeção de dependências.\n- SQLite em memória: simplifica o ambiente, mantendo as vantagens do TypeORM sem depender de banco externo.\n- Next.js (App Router) + TypeScript: garante tipagem forte e SSR (quando necessário), mantendo simplicidade no CRUD.\n- TailwindCSS: acelera o desenvolvimento visual com estilização consistente e responsiva.\n- react-hot-toast: fornece feedback instantâneo ao usuário para ações CRUD.\n- Docker Compose: unifica ambiente com backend e frontend integrados, prontos para rodar em qualquer máquina.\n\n## Possíveis pontos de melhoria\n\nAutenticação e autorização: implementar login, JWT e controle de acesso por perfil.\n- Persistência real: substituir SQLite in-memory por PostgreSQL (já suportado via TypeORM).\n- Testes automatizados: adicionar testes unitários e de integração com Jest.\n- Swagger: documentar as rotas da API com @nestjs/swagger.\n- Paginação e busca: melhorar a listagem de usuários com paginação e busca por nome/email.\n- UX refinado: adicionar feedbacks visuais mais dinâmicos (loaders, animações, skeletons).\n- CI/CD: configurar pipeline para build e deploy automático via GitHub Actions.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frobsonmt%2Fcode-challenge-midfalconi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frobsonmt%2Fcode-challenge-midfalconi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frobsonmt%2Fcode-challenge-midfalconi/lists"}