{"id":20876838,"url":"https://github.com/brawlingthebits/eva","last_synced_at":"2026-04-25T22:34:31.920Z","repository":{"id":38827196,"uuid":"506723072","full_name":"brawlingthebits/EVA","owner":"brawlingthebits","description":"API that brings the registration of categories and products by a user for simulation of an e-commerce.","archived":false,"fork":false,"pushed_at":"2022-06-28T16:36:57.000Z","size":194,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-04T18:24:49.382Z","etag":null,"topics":["node","typescript"],"latest_commit_sha":null,"homepage":"","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/brawlingthebits.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}},"created_at":"2022-06-23T16:58:51.000Z","updated_at":"2022-09-23T17:27:06.000Z","dependencies_parsed_at":"2022-09-18T08:41:40.651Z","dependency_job_id":null,"html_url":"https://github.com/brawlingthebits/EVA","commit_stats":null,"previous_names":["brawlingthebits/eva"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/brawlingthebits/EVA","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brawlingthebits%2FEVA","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brawlingthebits%2FEVA/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brawlingthebits%2FEVA/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brawlingthebits%2FEVA/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/brawlingthebits","download_url":"https://codeload.github.com/brawlingthebits/EVA/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brawlingthebits%2FEVA/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32279658,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-25T18:29:39.964Z","status":"ssl_error","status_checked_at":"2026-04-25T18:29:32.149Z","response_time":59,"last_error":"SSL_read: 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":["node","typescript"],"created_at":"2024-11-18T06:55:08.240Z","updated_at":"2026-04-25T22:34:31.906Z","avatar_url":"https://github.com/brawlingthebits.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Teste Eva Commerce\n\nEste é um back-end que desenvolve uma API para que os usuários possam cadastrar produtos acrescentando seus names, preços e descrições, dentro de alguma categoria existente. O usuário também pode cadastrar as suas categorias. \n\nCriado na linguagem TypeScript, com o framework Node, utiliza TypeORM e PostGresql nos bancos de dados e seus relacionamentos. Também foram utilizadas bibliotecas como uuid, yup, jwt, e bcrypt. \n\n## Como rodar esta aplicação?\n\nPara utilizá-la na sua máquina, basta seguir os passos a seguir:\n\n### 1) Primeira opção - Baixar o arquivo em zip\n\nO arquivo irá ser baixado na sua máquina, assim, basta extraí-lo e entrar na pasta liberada.\n\n### 1) Segunda opção - Clonar o repositório\n\nVocê deverá fazer um fork, caso queira criar um repositório no seu próprio perfil. De qualquer forma, você deverá clonar com alguma das três opções disponíveis, copiando o link apresentado.\n\nEm seguida, acesse o terminal da sua máquina e rode o comando \n\n```shell\ngit clone git@github.com:bercardosoc/EVA.git\n```\n\nAssim, você pode entrar na pasta agora disponível.\n\n### 2) Instale as dependências\n\nLogo, acesse o terminal e rode `yarn` ou `npm install` para que sejam baixadas as dependências da aplicação como `node_modules`. Este processo pode ser um pouco demorado.\n\n### 3) Abra a aplicação no seu editor de código\n\nPara usuários de VS Code, basta rodar um simples `code .` dentro do terminal no mesmo diretório/pasta e assim você poderá fazer o que deseja na aplicação.\n\n### 4) Pré-requisitos para rodar a aplicação\n\nPara que ela funcione corretamente, necessita configurar as variáveis de ambiente, copiando o que há disponível no seu `.env.example` e preenchendo seus dados no seu `.env` local, que você deverá criar na raiz do projeto.\n\nQuando suas variáveis estiverem prontas, você pode rodar as migrations para que estas se integrem com o seu banco de dados local. Para isso, basta rodar:\n\n```shell\nyarn typeorm migration:run -d src/data-source.ts\n```\n\n### 5) Rodando a aplicação\n\nAgora que você cumpre todos os pré-requisitos, você pode rodá-la com um simples `yarn dev` e ela estará disponível em alguma porta, mas por padrão, provavelmente será a 3000. \n\nCaso tenha dúvidas, basta checar o terminal, a aplicação tem um console.log que informa.\n\n## Enpoints\n\n### Rotas sem autenticação\n\n## Cadastro de usuário\n\n`POST /users/signup - FORMATO DA REQUISIÇÃO`\n\n```json```\n{\n\t\"name\": \"Bernardo\",\n\t\"email\": \"bernardo@mail.com\",\n\t\"password\": \"senhaforte\"\n}\n```\n\n`POST /users/signup - FORMATO DA RESPOSTA - STATUS 201`\n\n```json\n{\n\t\"email\": \"bernardo@mail.com\",\n\t\"name\": \"Bernardo\",\n\t\"id\": \"5858cbb7-31b1-49e8-a572-ec21a8c3e744\"\n}\n```\n## Login de usuário\n\n`POST /users/signin - FORMATO DA REQUISIÇÃO`\n\n```json\n{\n\t\"email\": \"bernardo@mail.com\",\n\t\"password\": \"senhaforte\"\n}\n```\n`POST /users/signup - FORMATO DA RESPOSTA - STATUS 200`\n\n```json\n{\n\t\"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjU4NThjYmI3LTMxYjEtNDllOC1hNTcyLWVjMjFhOGMzZTc0NCIsImlhdCI6MTY1NjM2OTc0OCwiZXhwIjoxNjU2MzczMzQ4fQ.e2pctoTfPMo4f6ko9eM4aHUhbiQH2ln3Ipy0uj2xG1c\"\n}\n```\n\n## Lista de produtos \n\n`GET /products - FORMATO DA RESPOSTA - STATUS 200`\n\n```json\n{\n\t\"products\": [\n\t\t{\n\t\t\t\"id\": \"67a3be9d-6c80-4044-964c-a4d72c54c616\",\n\t\t\t\"name\": \"Patinho de borracha\",\n\t\t\t\"description\": \"Um objeto para decoração.\",\n\t\t\t\"price\": 5\n\t\t},\n\t\t{\n\t\t\t\"id\": \"d8ffe37d-c1db-4377-84e5-d58cfbc20cf5\",\n\t\t\t\"name\": \"Biscoito integral\",\n\t\t\t\"description\": \"Biscoito de morango e banana com aveia.\",\n\t\t\t\"price\": 10\n\t\t},\n\t\t{\n\t\t\t\"id\": \"3e68013e-2dcf-4cc3-a18a-01615fc6dc7b\",\n\t\t\t\"name\": \"Caneca estampada\",\n\t\t\t\"description\": \"Caneca com códigos de git na estampa.\",\n\t\t\t\"price\": 15\n\t\t}\n\t]\n}\n```\n\n## Lista de produtos por preço\n\n`GET /products/:maior - FORMATO DA RESPOSTA - STATUS 200`\n\n```json\n{\n\t\"products\": [\n\t\t{\n\t\t\t\"id\": \"3dd70396-cacd-4417-933c-4642efd46802\",\n\t\t\t\"name\": \"barraca de acampamento\",\n\t\t\t\"description\": \"acampe sem preocupação\",\n\t\t\t\"price\": 100\n\t\t},\n\t\t{\n\t\t\t\"id\": \"11b755f2-a4d7-487c-afea-f0863da0b1b9\",\n\t\t\t\"name\": \"patinho de borracha\",\n\t\t\t\"description\": \"o seu melhor amigo para pair coding\",\n\t\t\t\"price\": 1\n\t\t}\n\t]\n}\n```\n\n`GET /products/:menor - FORMATO DA RESPOSTA - STATUS 200`\n\n```json\n{\n\t\"products\": [\n\t\t{\n\t\t\t\"id\": \"11b755f2-a4d7-487c-afea-f0863da0b1b9\",\n\t\t\t\"name\": \"patinho de borracha\",\n\t\t\t\"description\": \"o seu melhor amigo para pair coding\",\n\t\t\t\"price\": 1\n\t\t},\n\t\t{\n\t\t\t\"id\": \"3dd70396-cacd-4417-933c-4642efd46802\",\n\t\t\t\"name\": \"barraca de acampamento\",\n\t\t\t\"description\": \"acampe sem preocupação\",\n\t\t\t\"price\": 100\n\t\t}\n\t]\n}\n```\n\n## Lista de categorias \n\nEsta é uma rota que além de retornar as categorias propriamente ditas, também tem a importância de trazer os produtos por categoria. \n\n`GET /categories - FORMATO DA RESPOSTA - STATUS 200`\n\n```json \n\n{\n\t\"categories\": [\n\t\t{\n\t\t\t\"categoryId\": \"2f397495-1c59-4506-b803-bc1fb86e10f0\",\n\t\t\t\"name\": \"lazer\",\n\t\t\t\"description\": \"os melhores produtos de lazer\",\n\t\t\t\"products\": [\n\t\t\t\t{\n\t\t\t\t\t\"id\": \"b52ffdaf-0f64-4158-b123-e28a886249a5\",\n\t\t\t\t\t\"name\": \"barraca de acampamento\",\n\t\t\t\t\t\"description\": \"acampe sem preocupação\",\n\t\t\t\t\t\"price\": 100\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"categoryId\": \"ea6294fe-3bd3-4603-91d2-45c7f1bd68ab\",\n\t\t\t\"name\": \"decoração\",\n\t\t\t\"description\": \"os melhores produtos de decoração\",\n\t\t\t\"products\": [\n\t\t\t\t{\n\t\t\t\t\t\"id\": \"c4333adc-b1c6-4217-92a4-7c25ec57d632\",\n\t\t\t\t\t\"name\": \"patinho de borracha\",\n\t\t\t\t\t\"description\": \"seu melhor amigo de pair coding\",\n\t\t\t\t\t\"price\": 1\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t]\n}\n\n```\n\n## Única categoria\n\nNesta opção, é possível selecionar uma única categoria, o que facilita a leitura do seu array de produtos.\n\n`GET /categories/:name - FORMATO DA RESPOSTA - STATUS 200`\n\n```json\n{\n\t\"products\": [\n\t\t{\n\t\t\t\"description\": \"acampe sem preocupação\",\n\t\t\t\"price\": 100,\n\t\t\t\"name\": \"barraca de acampamento\"\n\t\t},\n\t\t{\n\t\t\t\"description\": \"seu melhor amigo de pair coding\",\n\t\t\t\"price\": 1,\n\t\t\t\"name\": \"patinho de borracha\"\n\t\t},\n\t\t{\n\t\t\t\"description\": \"seu melhor amigo de pair coding\",\n\t\t\t\"price\": 1,\n\t\t\t\"name\": \"gatinho de borracha\"\n\t\t}\n\t],\n\t\"description\": \"os melhores produtos de lazer\",\n\t\"name\": \"lazer\",\n\t\"categoryId\": \"2f397495-1c59-4506-b803-bc1fb86e10f0\"\n}\n```\n\n### Possíveis erros \n\n`GET /categories/:name - FORMATO DA RESPOSTA - NOT FOUND 404`\n\n```json\n{\n\t\"error\": \"Categoria não encontrada\"\n}\n```\n\n### Rotas com autenticação\n\nSão rotas onde é necessário o login do usuário, cujo token de acesso irá disponibilizar informações, como o seu id, para que assim possa ser atribuído como criador.\n\nAssim, onde estas APIs forem testadas, será necessário adicionar algo como `Authorization: Bearer {token}` no cabeçalho da requisição.\n\n## Criação de uma categoria\n\n`POST /categories - FORMATO DE REQUISIÇÃO`\n\n```json\n\n{\n\t\"name\": \"lazer\",\n\t\"description\": \"os melhores produtos de lazer\"\n}\n\n```\n\n`POST /categories - FORMATO DE RESPOSTA - 201 CREATED`\n\n```json\n{\n\t\"description\": \"os melhores produtos de lazer\",\n\t\"name\": \"lazer\",\n\t\"categoryId\": \"0ac9cb6b-d8bc-46ba-bc8b-1c6c8e643a8a\"\n}\n```\n\n\n### Possíveis erros \n\n`POST /categories - FORMATO DE RESPOSTA - 409 CONFLICT`\n```json\n{\n\t\"message\": \"lazer already exists\"\n}\n```\n\n## Edição de categoria \n\nVocê pode passar apenas um dos campos de uma categoria já existente.\n\n`PATCH /categories/:id - FORMATO DE REQUISIÇÃO`\n\n```json\n{\n\t\"name\": \"diversão\",\n\t\"description\": \"as melhores formas de lazer\"\n}\n```\n\n`POST /categories - FORMATO DE RESPOSTA - 200 OK`\n\n```json\n{\n\t\"categoryId\": \"0ac9cb6b-d8bc-46ba-bc8b-1c6c8e643a8a\",\n\t\"name\": \"diversão\",\n\t\"description\": \"as melhores formas de lazer\"\n}\n```\n\n### Possíveis erros \n\n`PATCH /categories/:id - FORMATO DE REQUISIÇÃO`\n\n```json\n{\n\t\"name\": \"roupa\",\n\t\"description\": \"as melhores roupas por um preço que cabe no seu bolso\"\n}\n```\n\n`POST /categories/:id - FORMATO DE RESPOSTA - 409 CONFLICT`\n\n```json\n{\n\t\"message\": \"A categoria roupa já existe\"\n}\n```\n\n## Deleção de uma categoria \n\n`DELETE /categories/:id`\n\n`Não é necessário corpo de requisição`\n\n`DELETE /categories/:id - FORMATO DE RESPOSTA - 200 OK`\n\n`Deletado com sucesso!`\n\n\n\n## Criação de um produto\n\n`POST /products - FORMATO DE REQUISIÇÃO`\n\n```json\n{\n\t\"name\": \"patinho de borracha\",\n\t\"price\": 1,\n\t\"description\": \"o seu melhor amigo para pair coding\",\n\t\"category\": \"decoração\"\n}\n```\n`POST /products - FORMATO DE RESPOSTA - 201 CREATED`\n\n```json\n{\n\t\"description\": \"o seu melhor amigo para pair coding\",\n\t\"price\": 1,\n\t\"name\": \"patinho de borracha\",\n\t\"category\": {\n\t\t\"categoryId\": \"d5b6043c-fab5-432f-82e9-abfe094d44dc\",\n\t\t\"name\": \"roupa\",\n\t\t\"description\": \"as melhores roupas por um preço que cabe no seu bolso\"\n\t},\n\t\"owner\": {\n\t\t\"id\": \"a4a20853-ee10-4f80-bee6-2eede6d51c06\",\n\t\t\"iat\": 1656424429,\n\t\t\"exp\": 1656428029\n\t},\n\t\"id\": \"11b755f2-a4d7-487c-afea-f0863da0b1b9\"\n}\n```\n\n### Possíveis erros \n\n`POST /products - FORMATO DE REQUISIÇÃO\n\n```json\n{\n\t\"name\": \"barraca de acampamento\",\n\t\"price\": 100,\n\t\"description\": \"acampe sem preocupação\",\n\t\"category\": \"lazer\"\n}\n```\n\n`POST /products - FORMATO DE RESPOSTA - 400 BAD REQUEST`\n\n```json\n{\n\t\"message\": \"A categoria lazer não existe\"\n}\n```\n\n## Deleção de um produto \n\n`DELETE /products/:id`\n\n`Não é necessário corpo de requisição`\n\n`DELETE /products/:id - FORMATO DE RESPOSTA - 200 OK`\n\n`Deletado com sucesso!`","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrawlingthebits%2Feva","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbrawlingthebits%2Feva","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrawlingthebits%2Feva/lists"}