{"id":24701565,"url":"https://github.com/jacks1o/blis---teste-t-cnico","last_synced_at":"2026-04-06T02:34:51.316Z","repository":{"id":268157084,"uuid":"903466222","full_name":"JackS1o/Blis---Teste-t-cnico","owner":"JackS1o","description":null,"archived":false,"fork":false,"pushed_at":"2025-01-30T19:11:12.000Z","size":1015,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-22T04:12:37.947Z","etag":null,"topics":["argon2","axios","docker","docker-compose","dotenv","express","jest","joi","jsonwebtoken","multer","mysql","nodejs","prisma","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/JackS1o.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-12-14T17:15:13.000Z","updated_at":"2025-01-30T19:11:15.000Z","dependencies_parsed_at":"2024-12-14T19:28:41.679Z","dependency_job_id":"a8a4dd3a-275b-41a8-b63a-5c68492822d9","html_url":"https://github.com/JackS1o/Blis---Teste-t-cnico","commit_stats":null,"previous_names":["jacks1o/blis---teste-t-cnico"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JackS1o%2FBlis---Teste-t-cnico","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JackS1o%2FBlis---Teste-t-cnico/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JackS1o%2FBlis---Teste-t-cnico/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JackS1o%2FBlis---Teste-t-cnico/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JackS1o","download_url":"https://codeload.github.com/JackS1o/Blis---Teste-t-cnico/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244902927,"owners_count":20529115,"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","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":["argon2","axios","docker","docker-compose","dotenv","express","jest","joi","jsonwebtoken","multer","mysql","nodejs","prisma","typescript"],"created_at":"2025-01-27T05:24:48.202Z","updated_at":"2025-12-30T20:48:06.170Z","avatar_url":"https://github.com/JackS1o.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Blis---Teste-técnico\n\n## Instruções\n\n\u003cdetails\u003e\n  \u003csummary\u003e\n    \u003cstrong\u003eComo executar o projeto\u003c/strong\u003e\n  \u003c/summary\u003e\u003cbr\u003e\n\n  1. Clone o repositório\n    `\n    git@github.com:JackS1o/Blis---Teste-t-cnico.git\n    `\n  2. Instale as dependências\n    `\n    npm install\n    `\n  3. Crie um arquivo .env e adicione nele as variáveis de ambiente conforme o arquivo .env.exemple\n\n  4. Na raíz do projeto, execute o comando `docker-compose up --build` para subir o container da aplicação e do banco de dados. O servidor estará disponível na porta `3000`.\n\n  5. Acesse o projeto em http://localhost:3000\n\n  6. Entre no container docker com o comando `docker exec -it meu-backend bash`, execute o comando `npm run prisma:migrate` para migrar as tabelas do banco de dados.\n\n  7. Execute o comando `npm test` para executar os testes unitários.\n\n  8. Para parar o container, execute o comando `docker-compose down`.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\n    \u003cstrong\u003eRotas desenvolvidas\u003c/strong\u003e\n  \u003c/summary\u003e\u003cbr\u003e\n  \n  - `POST /users` - Cria um novo usuário. O corpo da requisição deve conter o `name`, `birthdate`, `email` e `password` desejados. Exemplo de corpo de requisição:\n  ```json\n  {\n    \"name\": \"Jack\",\n    \"birthdate\": \"2000-12-15\",\n    \"email\": \"jack@gmail.com\",\n    \"password\": \"123456789\"\n  }\n  ```\n  a resposta será um objeto com o seguinte formato:\n  ```json\n  {\n    \"message\": \"User created successfully\"\n  }\n  ```\n\n  - `POST /users/login` - Realiza o login de um usuário. O corpo da requisição deve conter o `email` e `password` que existam no banco de dados. O retorno dessa requisição tabém gera um `token`. Exemplo de corpo de requisição:\n  ```json\n  {\n    \"email\": \"jack@gmail.com\",\n    \"password\": \"123456\",\n  }\n  ```\n  a resposta será um objeto com o seguinte formato:\n  ```json\n  {\n    \"message\": \"Login successful\",\n    \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImI2NTQxMTU0LWJkNmQtNDgzNC04N2RlLTc0ZTQyMjczMmZiMCIsImVtYWlsIjoiamFja0BnbWFpbC5jb20iLCJpYXQiOjE3MzQzNTIxMDEsImV4cCI6MTczNDM1NTcwMX0.6dpuKRclgogXkKt6pGyVDG_zWv-pI6hnEKfLw_fssOg\",\n    \"user\": {\n        \"id\": \"b6541154-bd6d-4834-87de-74e422732fb0\",\n        \"email\": \"jack@gmail.com\",\n        \"name\": \"Jack\"\n    }\n  }\n  ```\n\n  - `POST /users/documents` - Permite fazer o upload de um documento do usuário. O corpo da requisição deve conter o `name` do documento desejado. Exemplo de corpo de requisição:\n\n  ![alt text](./README/image.png)\n\n  a resposta será um objeto com o seguinte formato:\n\n  ```json\n  {\n    \"message\": \"Document created successfully\",\n    \"document\": {\n        \"id\": \"4c81e50d-5fdc-41b9-a3f7-0e2dd5be7a5d\",\n        \"name\": \"teste\",\n        \"url\": \"/uploads/1734352778796-648562658-test_document.pdf\",\n        \"user_id\": \"b6541154-bd6d-4834-87de-74e422732fb0\",\n        \"createdAt\": \"2024-12-16T12:39:38.800Z\",\n        \"updatedAt\": \"2024-12-16T12:39:38.800Z\"\n    }\n  }\n  ```\n\n  - `GET /uploads/document.pdf` - Rota estática que permite visualizar o documento do usuário. Exemplo de requisição:\n\n  ```json\n  /uploads/1734287051299-845511958-test_document.pdf\n  ```\n\n  - `POST /abilities` - Permite criar uma habilidade. O corpo da requisição deve conter o `name` da habilidade desejada. Exemplo de corpo de requisição:\n\n  ```json\n  {\n    \"name\": \"pedreiro\"\n  }\n  ```\n\n  a resposta será um objeto com o seguinte formato:\n\n  ```json\n  {\n    \"id\": \"5a93ad0b-781b-4c09-83ec-e46a70e3a31a\",\n    \"name\": \"pedreiro\",\n    \"active\": true,\n    \"createdAt\": \"2024-12-16T12:42:47.453Z\",\n    \"updatedAt\": \"2024-12-16T12:42:47.453Z\"\n  }\n  ```\n\n  - `PUT /abilities/:id` - Permite atualizar uma habilidade. O corpo da requisição deve conter o `active` da habilidade desejada. Exemplo de corpo de requisição:\n\n  ```json\n  {\n    \"active\": true\n  }\n  ```\n  a resposta será um objeto com o seguinte formato:\n\n  ```json\n  {\n      \"id\": \"5a93ad0b-781b-4c09-83ec-e46a70e3a31a\",\n      \"name\": \"pedreiro\",\n      \"active\": true,\n      \"createdAt\": \"2024-12-16T12:42:47.453Z\",\n      \"updatedAt\": \"2024-12-16T12:44:48.029Z\"\n  }\n  ```\n\n  - `POST /users/abilities` - Permite associar uma habilidade a um usuário. O corpo da requisição deve conter o `ability_id` e `years_experience` desejados. Exemplo de corpo de requisição:\n\n  ```json\n  {\n    \"ability\": \"pedreiro\",\n    \"years_experience\": 4\n  }\n  ```\n\n  a resposta é um objeto com o seguinte formato:\n\n  ```json\n  {\n    \"message\": \"Ability added successfully\"\n  }\n  ```\n\n  - `DELETE /users/abilities` - Permite remover uma ou mais habilidades de um usuário. O corpo da requisição deve conter o `ability` desejado. Exemplo de corpo de requisição:\n\n  ```json\n  {\n    \"abilities\": [\n        \"pedreiro\",\n        \"padeiro\"\n    ]\n  }\n  ```\n  a resposta é um objeto com o seguinte formato:\n\n  ```json\n  {\n      \"message\": \"Ability deleted successfully\"\n  }\n  ```\n\n  - `GET /users/abilities` - Permite obter as habilidades de um usuário de forma paginada e ordenada por ordem de criação decrescente. A url da requisição deve conter o `page` e `limit` desejados. Exemplo de url de requisição:\n\n  ```json\n    \"/users/abilities?page=1\u0026limit=10\"\n  ```\n\n  a resposta é um objeto com o seguinte formato:\n\n  ```json\n  {\n    \"count\": 1,\n    \"rows\": [\n        {\n            \"user_id\": \"b6541154-bd6d-4834-87de-74e422732fb0\",\n            \"name\": \"Jack\",\n            \"email\": \"jack@gmail.com\",\n            \"birthdate\": \"2000-12-15T00:00:00.000Z\",\n            \"ability\": \"pedreiro\",\n            \"years_experience\": 4,\n            \"profilePicture\": \"https://images.dog.ceo/breeds/terrier-scottish/n02097298_9085.jpg\"\n        }\n    ]\n  }\n  ```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n    \u003csummary\u003e\n      \u003cstrong\u003eAtividade Extra\u003c/strong\u003e\n    \u003c/summary\u003e\u003cbr\u003e\n\n  Atividade extra desenvolvida foi usar a API `https://dog.ceo/api/breeds/image/random` para obter uma imagem de cachorro aleatória e adiciona-la ao perfil do usuário ao criar um novo usuário.\n  Essa imagem de cachorro foi adicionada ao banco de dados na tablea `dog_profile_pictures`.\n\n  No retorno da rota - `GET /users/abilities` - foi adicionado o campo `profilePicture` com o link da imagem do cachorro.\n\n  ```json\n  {\n    \"count\": 1,\n    \"rows\": [\n        {\n            \"user_id\": \"b6541154-bd6d-4834-87de-74e422732fb0\",\n            \"name\": \"Jack\",\n            \"email\": \"jack@gmail.com\",\n            \"birthdate\": \"2000-12-15T00:00:00.000Z\",\n            \"ability\": \"pedreiro\",\n            \"years_experience\": 4,\n            \"profilePicture\": \"https://images.dog.ceo/breeds/terrier-scottish/n02097298_9085.jpg\"\n        }\n    ]\n  }\n  ```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\n    \u003cstrong\u003eTecnologias Usadas no Projeto\u003c/strong\u003e\n  \u003c/summary\u003e\u003cbr\u003e\n\n  - TypeScript\n  - Node.js\n  - Express\n  - Prisma\n  - MySQL\n  - Docker\n  - Docker-Compose\n  - Joi\n  - Argon2\n  - axios\n  - dotenv\n  - Multer\n  - jsonwebtoken\n  - jest\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\n    \u003cstrong\u003eScripts do Projeto\u003c/strong\u003e\n  \u003c/summary\u003e\u003cbr\u003e\n\n  - `docker-compose up --build` - Subir o container da aplicação e do banco de dados.\n  - `npm run dev` - Subir o servidor local.\n  - `npm run prisma:migrate` - Migrar as tabelas do banco de dados.\n  - `npm run format` - Formatar o código.\n  - `npm run build` - Compilar o código typescript para o javascript.\n  - `npm test` - Executar os testes unitários.\n\u003c/details\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjacks1o%2Fblis---teste-t-cnico","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjacks1o%2Fblis---teste-t-cnico","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjacks1o%2Fblis---teste-t-cnico/lists"}