{"id":20474402,"url":"https://github.com/mateusvrs/puma","last_synced_at":"2025-08-21T22:24:14.632Z","repository":{"id":261017038,"uuid":"882900769","full_name":"mateusvrs/puma","owner":"mateusvrs","description":"PUMA - Challenge","archived":false,"fork":false,"pushed_at":"2024-11-04T07:51:00.000Z","size":113,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-05T14:17:19.939Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","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/mateusvrs.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":"2024-11-04T02:25:14.000Z","updated_at":"2024-11-04T07:51:03.000Z","dependencies_parsed_at":"2024-11-04T08:31:00.458Z","dependency_job_id":"f7d890f3-46f3-45d4-bec7-32f757cb9bee","html_url":"https://github.com/mateusvrs/puma","commit_stats":null,"previous_names":["mateusvrs/puma"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/mateusvrs/puma","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mateusvrs%2Fpuma","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mateusvrs%2Fpuma/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mateusvrs%2Fpuma/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mateusvrs%2Fpuma/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mateusvrs","download_url":"https://codeload.github.com/mateusvrs/puma/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mateusvrs%2Fpuma/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":271553422,"owners_count":24779821,"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-08-21T02:00:08.990Z","response_time":74,"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":"2024-11-15T14:29:28.401Z","updated_at":"2025-08-21T22:24:14.452Z","avatar_url":"https://github.com/mateusvrs.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Desafio - PUMA\n\n## Descrição\n\nO desafio foi implementado por completo, ou seja, o **backend** (API) consegue executar as 4 funcionalidades propostas no desafio, e o **frontend** consegue consumir a API e exibir as informações na tela executando as ações de adicionar usuário, favoritar, listar, remover e ordenar usuários pelo nome.\n\n## Pré-requisitos\n\n- **Node.js** (v18.20.4+)\n- **Docker** (v26.1.3+)\n- **Docker Compose** (v2.27.0+)\n- **NPM** (v10.8.1+)\n\n**Importante:** Todos os comandos a seguir são referentes ao sistema **Linux**.\n\n## Backend\n\nO backend foi desenvolvido em **Node.js** utilizando o **Express** para criar a API, o ORM chamado **Prisma** foi escolhido para conexão com o banco de dados **PostgreSQL** que é inicializado através de um **Docker**. Para gerenciar os usuários adicionados foi criada uma *Model* chamada **User** com os campos importantes da seguinte forma:\n\n```js\nmodel User {\n  id         String   @id @default(uuid())\n  name       String?\n  photo_url  String\n  username   String   @unique\n  favorite   Boolean  @default(false)\n  created_at DateTime @default(now())\n}\n```\n\n### Rotas\n\nPara resgatar as informações necessárias do banco de dados foi utilizado o **Prisma Client** que é gerado automaticamente a partir do schema do banco de dados. As rotas criadas foram:\n\n**Obs:** Os códigos abaixo estão simplificados, para ver o código completo acesse o arquivo `backend/src/controllers/users.js`.\n\n- **GET** `/users`: Nessa rota é retornada a lista de usuários cadastrados no banco de dados ordenados pela data de criação.\n\n```js\nawait this.#prisma.user.findMany({\n    orderBy: {\n        created_at: 'asc'\n    }\n})\n```\n\n- **POST** `/users`: Nessa rota é possível adicionar um novo usuário ao banco de dados. Para isso é necessário enviar um objeto JSON pelo `body` com o campo `username`, logo, o backend irá buscar o usuário na API do GitHub e salvar as informações no banco de dados, caso o usuário exista.\n\n```js\nconst response = await fetch(`${GITHUB_URL}/users/${body.username}`)\nconst data = await response.json()\n\nawait this.#prisma.user.create({\n    data: {\n        username: data.login,\n        name: data.name,\n        photo_url: data.avatar_url\n    }\n})\n```\n\n- **DELETE** `/users/:username`: Nessa rota é possível remover um usuário do banco de dados. Para isso é necessário enviar o `username` do usuário que deseja remover.\n\n```js\nawait this.#prisma.user.delete({\n    where: {\n        username: params.username\n    }\n})\n```\n\n- **PATCH** `/users/:username/toggle-star`: Nessa rota é possível dar uma estrela ou retira-la de um usuário. Para isso é necessário enviar o `username` do usuário que deseja favoritar.\n\n```js\nconst user = await this.#prisma.user.findFirst({\n    where: {\n        favorite: true\n    }\n})\n\nif (user) {\n    const update = await this.#prisma.user.update({\n        where: {\n            username: user.username\n        },\n        data: {\n            favorite: false\n        }\n    })\n\n    if (user.username === params.username) return update\n}\n\nreturn await this.#prisma.user.update({\n    where: {\n        username: params.username\n    },\n    data: {\n        favorite: true\n    }\n})\n```\n\n### Execução do Backend\n\nPara executar o backend é necessário ter o **Node.js** e o **Docker** instalados na máquina. Primeiramente, clone o repositório e acesse a pasta do projeto:\n\n```bash\n# a partir da raiz do projeto\ncd backend\n```\n\nInstale as dependências do projeto, inicialize o banco de dados e migre as tabelas utilizando o **Prisma**:\n\n```bash\nnpm install \u0026\u0026 npm run setup\n\ndocker compose -f docker-compose.yml -p puma-api up -d\n# obs: pode ser necessário \"sudo\" rodar o comando:\n# sudo docker compose -f docker-compose.yml -p puma-api up -d\n\nnpm run migrate\n```\n\nPor fim, execute o backend:\n\n```bash\nnpm start\n```\n\n### Execução dos Testes\n\nBasta executar os comando a seguir para rodar os testes:\n\n```bash\n# a partir da raiz do projeto\ncd backend\n\nnpm install \u0026\u0026 npm run setup\n\ndocker compose -f docker-compose.test.yml -p puma-api-test up -d\n# obs: pode ser necessário \"sudo\" rodar o comando:\n# sudo docker compose -f docker-compose.test.yml -p puma-api-test up -d\n\nnpm run migrate:test\n\nnpm test\n```\n\n## Frontend\n\nO frontend foi desenvolvido em **Vue.js** utilizando o **Vite** para criar o projeto. Para consumir a API do backend foi utilizado o **Fetch** e para estilizar a aplicação foi utilizado o **TailwindCSS** junto ao **shadcn/vue** e o **Lucide** para os ícones.\n\n### Execução do Frontend\n\nPara executar o frontend é necessário ter o **Node.js** instalado na máquina. Primeiramente, clone o repositório e acesse a pasta do projeto:\n\n```bash\n# a partir da raiz do projeto\ncd frontend\n```\n\nInstale as dependências do projeto e execute o frontend:\n\n```bash\nnpm install\n\nnpm run dev\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmateusvrs%2Fpuma","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmateusvrs%2Fpuma","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmateusvrs%2Fpuma/lists"}