{"id":18972457,"url":"https://github.com/patrickmps/bloglist","last_synced_at":"2025-10-29T07:14:23.488Z","repository":{"id":200407371,"uuid":"699598547","full_name":"patrickmps/bloglist","owner":"patrickmps","description":"O BlogList API permite aos usuários salvar informações sobre blogs interessantes que encontram pela internet. ","archived":false,"fork":false,"pushed_at":"2023-10-30T14:04:37.000Z","size":210,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-19T18:54:53.193Z","etag":null,"topics":["express","expressjs","javascript","mongodb","node","nodejs","react","reactjs"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/patrickmps.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2023-10-03T00:22:30.000Z","updated_at":"2023-10-17T01:12:51.000Z","dependencies_parsed_at":null,"dependency_job_id":"28962d8a-76e5-484d-995c-0beb37acd175","html_url":"https://github.com/patrickmps/bloglist","commit_stats":null,"previous_names":["patrickmps/bloglist"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/patrickmps/bloglist","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patrickmps%2Fbloglist","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patrickmps%2Fbloglist/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patrickmps%2Fbloglist/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patrickmps%2Fbloglist/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/patrickmps","download_url":"https://codeload.github.com/patrickmps/bloglist/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patrickmps%2Fbloglist/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":281578709,"owners_count":26525045,"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-10-29T02:00:06.901Z","response_time":59,"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":["express","expressjs","javascript","mongodb","node","nodejs","react","reactjs"],"created_at":"2024-11-08T15:08:44.421Z","updated_at":"2025-10-29T07:14:23.444Z","avatar_url":"https://github.com/patrickmps.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# BlogList API\n\n![bloglist-api](https://github.com/patrickmps/bloglist/assets/58093259/41c6893e-ffe8-45e2-8ce5-cde5b6433c70)\n\n\u003cdiv align=\"center\"\u003e\n  \n![MongoDB](https://img.shields.io/badge/MongoDB-%234ea94b.svg?style=for-the-badge\u0026logo=mongodb\u0026logoColor=white)\n![NodeJS](https://img.shields.io/badge/node.js-6DA55F?style=for-the-badge\u0026logo=node.js\u0026logoColor=white)\n![Nodemon](https://img.shields.io/badge/NODEMON-%23323330.svg?style=for-the-badge\u0026logo=nodemon\u0026logoColor=%BBDEAD)\n![Express.js](https://img.shields.io/badge/express.js-%23404d59.svg?style=for-the-badge\u0026logo=express\u0026logoColor=%2361DAFB)\n![NPM](https://img.shields.io/badge/NPM-%23CB3837.svg?style=for-the-badge\u0026logo=npm\u0026logoColor=white)\n![Visual Studio Code](https://img.shields.io/badge/Visual%20Studio%20Code-0078d7.svg?style=for-the-badge\u0026logo=visual-studio-code\u0026logoColor=white)\n![JavaScript](https://img.shields.io/badge/javascript-%23323330.svg?style=for-the-badge\u0026logo=javascript\u0026logoColor=%23F7DF1E)\n![Jest](https://img.shields.io/badge/-jest-%23C21325?style=for-the-badge\u0026logo=jest\u0026logoColor=white)\n![Git](https://img.shields.io/badge/git-%23F05033.svg?style=for-the-badge\u0026logo=git\u0026logoColor=white)\n![GitHub](https://img.shields.io/badge/github-%23121011.svg?style=for-the-badge\u0026logo=github\u0026logoColor=white)\n\n\u003c/div\u003e\n\n## Sobre\n\nO BlogList API permite aos usuários salvar informações sobre blogs interessantes que encontram pela internet. Com o BlogList, você pode criar sua própria biblioteca pessoal de blogs favoritos, mantendo o controle de autores, títulos, URLs e a quantidade de votos positivos de outros usuários da aplicação.\n\n## Rodando localmente\n\nClone o projeto\n\n```bash\n  git clone https://github.com/patrickmps/bloglist.git\n```\n\nEntre no diretório do projeto\n\n```bash\n  cd bloglist\n```\n\nInstale as dependências\n\n```bash\n  npm install\n```\n\nInicie o servidor\n\n```bash\n  npm start\n```\n\n## Variáveis de Ambiente\n\nPara rodar esse projeto, você vai precisar adicionar as seguintes variáveis de ambiente no seu .env\n\n`MONGODB_URI` - uri do banco MongoDB\n\n`PORT` - porta na qual irá rodar o server, por padrão está 3001\n\n`TEST_MONGODB_URI` - uri do banco MongoDB para testes\n\n`SECRET` - string usada para gerar o token JWT\n\n## Documentação da API\n\n### Blogs\n\n#### Retorna todos os blogs\n\n```http\n  GET /api/blogs\n```\n\n- Response 200 (application/json)\n\n      [\n        {\n          \"title\": \"React patterns\",\n          \"author\": \"Michael Chan\",\n          \"url\": \"https://reactpatterns.com/\",\n          \"likes\": 7,\n          \"user\": {\n            \"username\": \"root\",\n            \"name\": \"Superuser\",\n            \"id\": \"65232e0901ea275e5bc8531b\"\n          },\n          \"id\": \"6523554c0aa5a2931c23e086\"\n        },\n        {\n          \"title\": \"React patterns\",\n          \"author\": \"Michael Chan\",\n          \"url\": \"https://reactpatterns.com/\",\n          \"likes\": 7,\n          \"user\": {\n            \"username\": \"root\",\n            \"name\": \"Superuser\",\n            \"id\": \"65232e0901ea275e5bc8531b\"\n          },\n          \"id\": \"652359374dd34402dbb0321c\"\n        },\n      ...\n      ]\n\n#### Adiciona um blog\n\n```http\n  POST /api/blogs\n```\n\n- Request (application/json)\n\n  - Headers\n\n          Authorization: Bearer [access_token]\n\n  - Body\n\n        {\n          \"title\": \"Tulio Calil Dev\",\n          \"author\": \"Tulio Calil\",\n          \"url\": \"https://tuliocalil.com\",\n          \"likes\": 29\n        }\n\n- Response 201 (application/json)\n\n      {\n        \"title\": \"Tulio Calil Dev\",\n        \"author\": \"Tulio Calil\",\n        \"url\": \"https://tuliocalil.com\",\n        \"likes\": 29,\n        \"user\": \"652be8b022111afd709708b5\",\n        \"id\": \"652d7c3d3839ac5b34e1d3ad\"\n      }\n\n#### Retorna um blog\n\n```http\n  GET /api/blogs/${id}\n```\n\n| Parâmetro | Tipo     | Descrição                                   |\n| :-------- | :------- | :------------------------------------------ |\n| `id`      | `string` | **Obrigatório**. O ID do blog que você quer |\n\n- Response 200 (application/json)\n\n      {\n        \"title\": \"Tulio Calil Dev\",\n        \"author\": \"Tulio Calil\",\n        \"url\": \"https://tuliocalil.com\",\n        \"likes\": 29,\n        \"user\": \"652be8b022111afd709708b5\",\n        \"id\": \"652d7c3d3839ac5b34e1d3ad\"\n      }\n\n#### Atualiza um blog\n\n```http\n  PUT /api/blogs/${id}\n```\n\n| Parâmetro | Tipo     | Descrição                                   |\n| :-------- | :------- | :------------------------------------------ |\n| `id`      | `string` | **Obrigatório**. O ID do blog que você quer |\n\n- Request (application/json)\n\n  - Body\n\n        {\n          \"likes\": 35\n        }\n\n- Response 200 (application/json)\n\n      {\n        \"title\": \"Tulio Calil Dev\",\n        \"author\": \"Tulio Calil\",\n        \"url\": \"https://tuliocalil.com\",\n        \"likes\": 35,\n        \"user\": \"652be8b022111afd709708b5\",\n        \"id\": \"652d7c3d3839ac5b34e1d3ad\"\n      }\n\n#### Deleta um blog\n\n```http\n  DEL /api/blogs/${id}\n```\n\n| Parâmetro | Tipo     | Descrição                                   |\n| :-------- | :------- | :------------------------------------------ |\n| `id`      | `string` | **Obrigatório**. O ID do blog que você quer |\n\n**Obs.:** para deletar um blog é preciso ser o usuário que o adicionou.\n\n- Request (application/json)\n\n  - Headers\n\n          Authorization: Bearer [access_token]\n\n- Response 204\n\n### Users\n\n#### Retorna todos os usuários\n\n```http\n  GET /api/users\n```\n\n- Response 200 (application/json)\n\n      [\n        {\n          \"username\": \"root\",\n          \"name\": \"Superuser\",\n          \"blogs\": [\n            {\n              \"title\": \"React patterns\",\n              \"author\": \"Michael Chan\",\n              \"url\": \"https://reactpatterns.com/\",\n              \"likes\": 7,\n              \"id\": \"652359374dd34402dbb0321c\"\n            }\n          ]\n        },\n        {\n          \"username\": \"superroot\",\n          \"name\": \"Superuser\",\n          \"blogs\": [],\n          \"id\": \"652c592fe49c2dc01a25c681\"\n        }\n      ]\n\n#### Cria um usuário\n\n```http\n  POST /api/users\n```\n\n- Request (application/json)\n\n  - Body\n\n        {\n        \t\"username\": \"patrickmps\",\n        \t\"name\": \"Patrick Mota\",\n        \t\"password\": \"senha321\"\n        }\n\n- Response 201 (application/json)\n\n      {\n      \t\"username\": \"patrickmps\",\n      \t\"name\": \"Patrick Mota\",\n      \t\"blogs\": [],\n      \t\"id\": \"652d88d5b79d74c37e6ce558\"\n      }\n\n### Login\n\n#### Faz login na api\n\n```http\n  POST /api/login\n```\n\n- Request (application/json)\n\n  - Body\n\n        {\n        \t\"username\": \"patrickmps\",\n        \t\"password\": \"senha321\"\n        }\n\n- Response 201 (application/json)\n\n      {\n      \t\"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImthbGlsMzIiLCJpZCI6IjY1MmJlOGIwMjIxMTFhZmQ3MDk3MDhiNSIsImlhdCI6MTY5NzQ3OTYyMSwiZXhwIjoxNjk3NDgzMjIxfQ.xkOd_EdpfdIs_cbNJInwEWmrPKauLCOznyYL8zFnSII\",\n      \t\"username\": \"patrickmps\",\n      \t\"name\": \"Patrick Mota\"\n      }\n\n## Rodando os testes\n\nPara rodar os testes, rode o seguinte comando\n\n```bash\n  npm run test\n```\n\n## Licença\n\n[MIT](https://choosealicense.com/licenses/mit/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpatrickmps%2Fbloglist","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpatrickmps%2Fbloglist","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpatrickmps%2Fbloglist/lists"}