{"id":22746506,"url":"https://github.com/jonathanprojetos/blogs-api","last_synced_at":"2026-04-12T14:54:21.058Z","repository":{"id":144527458,"uuid":"532533771","full_name":"JonathanProjetos/Blogs-Api","owner":"JonathanProjetos","description":"Nesta aplicação foi desenvolvido uma API e um banco de dados, com intuito de produzir conteúdo para um blog.","archived":false,"fork":false,"pushed_at":"2022-10-08T14:57:57.000Z","size":297,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-05T07:29:02.807Z","etag":null,"topics":["dotenv","eslint","express","express-async-errors","joi","jsonwebtoken","mysql","mysql2","nodejs","nodemon","sequelize","sequelize-cli"],"latest_commit_sha":null,"homepage":"","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/JonathanProjetos.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":"2022-09-04T12:27:41.000Z","updated_at":"2022-10-09T00:36:32.000Z","dependencies_parsed_at":null,"dependency_job_id":"dfbdaea1-e83c-4df0-851b-7bd44767a614","html_url":"https://github.com/JonathanProjetos/Blogs-Api","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JonathanProjetos%2FBlogs-Api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JonathanProjetos%2FBlogs-Api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JonathanProjetos%2FBlogs-Api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JonathanProjetos%2FBlogs-Api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JonathanProjetos","download_url":"https://codeload.github.com/JonathanProjetos/Blogs-Api/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246278798,"owners_count":20751832,"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":["dotenv","eslint","express","express-async-errors","joi","jsonwebtoken","mysql","mysql2","nodejs","nodemon","sequelize","sequelize-cli"],"created_at":"2024-12-11T02:13:32.124Z","updated_at":"2026-04-12T14:54:16.034Z","avatar_url":"https://github.com/JonathanProjetos.png","language":"JavaScript","readme":"# Blogs-Api\n\n# Contexto\n\nNesta aplicação foi desenvolvido uma API e um banco de dados, com intuito de produzir conteúdo para um blog.  A aplicação segue os princípios REST.  Para acessar os endereços da aplicação, é necessário fazer autenticação e quando autenticado a API responderá  trazendo um token no corpo da requisição. O token deverá ser inserido no cabeçalho de cada requisição privada, com  o intuito de autenticação. A arquitetura da aplicação  se baseia em relações entre usuário por postagem  e de postagem por categorias.  Dentro do projeto existe um diagrama exemplificando estas ligações.\n\n## Importante:\n\n- E aconselhável o uso de softwares de envio de requisições REST como:\n- [Insomia](https://insomnia.rest/)\n- [Postman](https://www.postman.com/)\n- [Httpie](https://httpie.io/)\n\n## Detalhes das rotas\n\n#### Verbo Post : /login\n\n##### Esperado\n - O corpo da requisição deverá seguir o formato abaixo:\n \n ```json\n \n {\n  \"email\": \"lewishamilton@gmail.com\",\n  \"password\": \"123456\"\n }\n \n ```\n - Se o login foi feito com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http 200\n \n ```json\n \n {\n  \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXlsb2FkIjp7ImlkIjo1LCJkaXNwbGF5TmFtZSI6InVzdWFyaW8gZGUgdGVzdGUiLCJlbWFpbCI6InRlc3RlQGVtYWls\n   LmNvbSIsImltYWdlIjoibnVsbCJ9LCJpYXQiOjE2MjAyNDQxODcsImV4cCI6MTYyMDY3NjE4N30.Roc4byj6mYakYqd9LTCozU1hd9k_Vw5IWKGL4hcCVG8\"\n }\n \n ```\n    \n#### Verbo Post : /user\n\n##### Esperado\n\n - O corpo da requisição deverá seguir o formato abaixo:\n\n  ```json\n{\n   \"displayName\": \"Brett Wiltshire\",\n   \"email\": \"brett@email.com\",\n   \"password\": \"123456\",\n   \"image\": \"http://4.bp.blogspot.com/_YA50adQ-7vQ/S1gfR_6ufpI/AAAAAAAAAAk/1ErJGgRWZDg/S45/brett.png\"\n}\n     \n ```\n - Se o user for criado com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http 201:\n \n ```json\n   \n {\n    \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXlsb2FkIjp7ImlkIjo1LCJkaXNwbGF5TmFtZSI6InVzdWFyaW8gZGUgdGVzdGUiLCJlbWFpbCI6InRlc3RlQGVtYWls\n    LmNvbSIsImltYWdlIjoibnVsbCJ9LCJpYXQiOjE2MjAyNDQxODcsImV4cCI6MTYyMDY3NjE4N30.Roc4byj6mYakYqd9LTCozU1hd9k_Vw5IWKGL4hcCVG8\"\n }\n \n ```\n    \n#### Verbo Get : /user\n\n##### Esperado\n\n- Ao listar usuários com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http 200.\n\n  ```json\n  [\n    {\n      \"id\": 1,\n      \"displayName\": \"Lewis Hamilton\",\n      \"email\": \"lewishamilton@gmail.com\",\n      \"image\": \"https://upload.wikimedia.org/wikipedia/commons/1/18/Lewis_Hamilton_2016_Malaysia_2.jpg\"\n    },\n\n    /* ... */\n  ]\n  ```\n\n#### Verbo Get : /user/:id\n\n##### Esperado\n\n- Ao listar um usuário com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http 200:\n\u003e exemplo id: 1\n\n ```json\n  {\n    \"id\": 1,\n    \"displayName\": \"Lewis Hamilton\",\n    \"email\": \"lewishamilton@gmail.com\",\n    \"image\": \"https://upload.wikimedia.org/wikipedia/commons/1/18/Lewis_Hamilton_2016_Malaysia_2.jpg\"\n  }\n ```   \n\n#### Verbo Post : /categories\n\n##### Esperado\n\n- O corpo da requisição deverá seguir o formato abaixo:\n\n  ```json\n  {\n     \"name\": \"Blogs\"\n  }\n\n  ```\n\n#### Verbo Get : /categories\n\n##### Esperado\n\n - O endpoint traz todas as caretorias existentes no banco.\n\n```json\n [\n  {\n      \"id\": 1,\n      \"name\": \"Inovação\"\n  },\n  {\n      \"id\": 2,\n      \"name\": \"Escola\"\n  },\n\n  /* ... */\n]\n``` \n#### Verbo Post : /post\n\n##### Esperado\n\n- O endpoint deve ser capaz de adicionar um novo blog post e vinculá-lo às categorias em suas tabelas no banco de dados.\n- O corpo da requisição deverá seguir o formato abaixo:\n\n ```json\n{\n  \"title\": \"guia\",\n  \"content\": \"A todo momento procuramos maneiras de diversificar nossas postagens\",\n  \"categoryIds\": [1, 2]\n}\n```\n    \n#### Verbo Get : /post\n\n##### Esperado\n\n- Ao listar posts com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http 200:\n\n\n ```json\n [\n   {\n     \"id\": 1,\n     \"title\": \"Post do Ano\",\n     \"content\": \"Melhor post do ano\",\n     \"userId\": 1,\n     \"published\": \"2011-08-01T19:58:00.000Z\",\n     \"updated\": \"2011-08-01T19:58:51.000Z\",\n     \"user\": {\n       \"id\": 1,\n       \"displayName\": \"Lewis Hamilton\",\n       \"email\": \"lewishamilton@gmail.com\",\n       \"image\": \"https://upload.wikimedia.org/wikipedia/commons/1/18/Lewis_Hamilton_2016_Malaysia_2.jpg\"\n     },\n     \"categories\": [\n       {\n         \"id\": 1,\n         \"name\": \"Inovação\"\n       }\n     ]\n   },\n  \n   /* ... */\n ]\n  ```\n#### Verbo Get : /post/:id\n\n##### Esperado\n\n- O endpoint deve ser capaz de trazer o blog post baseado no id do banco de dados se ele existir;\n\u003e exemplo id: 1\n\n ```json\n {\n  \"id\": 1,\n  \"title\": \"Post do Ano\",\n  \"content\": \"Melhor post do ano\",\n  \"userId\": 1,\n  \"published\": \"2011-08-01T19:58:00.000Z\",\n  \"updated\": \"2011-08-01T19:58:51.000Z\",\n  \"user\": {\n      \"id\": 1,\n      \"displayName\": \"Lewis Hamilton\",\n      \"email\": \"lewishamilton@gmail.com\",\n      \"image\": \"https://upload.wikimedia.org/wikipedia/commons/1/18/Lewis_Hamilton_2016_Malaysia_2.jpg\"\n  },\n  \"categories\": [\n      {\n          \"id\": 1,\n          \"name\": \"Inovação\"\n      }\n   ]\n }\n  ```\n#### Verbo Put : /post/:id\n\n##### Esperado\n\n- O endpoint deve ser capaz de alterar um post do banco de dados, se ele existir;\n- O corpo da requisição deverá seguir o formato abaixo:\n\n\u003e exemplo id: 1\n\n ```json\n \n  {\n    \"title\": \"Novidade\",\n    \"content\": \"Aqui sempre fez história\"\n  }\n\n ```\n#### Verbo Delete : /post/:id\n\n##### Esperado\n\n- O endpoint deve ser capaz de deletar um blog post baseado no id do banco de dados se ele existir;\n\n\u003e exemplo id: 1\n\n- Se o blog post for deletado com sucesso não deve ser retornada nenhuma resposta, apenas um status http 204:\n\n \n#### Verbo Delete http://localhost:3000/user/me\n\n##### Esperado\n\n- O endpoint deve ser capaz de deletar você do banco de dados.\n\n- Se o user for deletado com sucesso não deve ser retornada nenhuma resposta, apenas um status http 204.\n\n\n#### Verbo Get : /post/search?q=searchTerm\n\n##### Esperado\n\n- O endpoint deve ser capaz de trazer os blogs post baseados no q do banco de dados, se ele existir.\n\n- O query params da requisição deverá seguir o formato abaixo:\n\n```json\n  http://localhost:PORT/post/search?q=vamos\n```\n- Se a buscar for pelo title o resultado retornado deverá ser conforme exibido abaixo, com um status http 200.\n\n```json\n// GET /post/search?q=Vamos que vamos\n\n[\n  {\n    \"id\": 2,\n    \"title\": \"Vamos que vamos\",\n    \"content\": \"Foguete não tem ré\",\n    \"userId\": 1,\n    \"published\": \"2011-08-01T19:58:00.000Z\",\n    \"updated\": \"2011-08-01T19:58:51.000Z\",\n    \"user\": {\n      \"id\": 1,\n      \"displayName\": \"Lewis Hamilton\",\n      \"email\": \"lewishamilton@gmail.com\",\n      \"image\": \"https://upload.wikimedia.org/wikipedia/commons/1/18/Lewis_Hamilton_2016_Malaysia_2.jpg\"\n    },\n    \"categories\": [\n      {\n        \"id\": 2,\n        \"name\": \"Escola\"\n      }\n    ]\n  }\n]\n\n```\n- Se a buscar for pelo content o resultado retornado deverá ser conforme exibido abaixo, com um status http 200.\n\n```json\n\n   // GET /post/search?q=Foguete não tem ré\n\n  [\n    {\n      \"id\": 2,\n      \"title\": \"Vamos que vamos\",\n      \"content\": \"Foguete não tem ré\",\n      \"userId\": 1,\n      \"published\": \"2011-08-01T19:58:00.000Z\",\n      \"updated\": \"2011-08-01T19:58:51.000Z\",\n      \"user\": {\n        \"id\": 1,\n        \"displayName\": \"Lewis Hamilton\",\n        \"email\": \"lewishamilton@gmail.com\",\n        \"image\": \"https://upload.wikimedia.org/wikipedia/commons/1/18/Lewis_Hamilton_2016_Malaysia_2.jpg\"\n      },\n      \"categories\": [\n        {\n          \"id\": 2,\n          \"name\": \"Escola\"\n        }\n      ]\n    }\n  ]\n\n```\n\n## Técnologias usadas\n\n\u003e Desenvolvido em nodejs.\n\n\u003e ORM : Sequelize\n\n\u003e Framework utilizado: Express.\n\n\u003e Libs: nodemon, eslint, express-async-errors, dotenv, joi, jsonwebtoken, mysql2, sequelize-cli\n\n## Instalando Dependências\n\n## Docker\n```\ncd Blogs-Api/\ndocker-compose up -d\ndocker exec -it blogs_api bash\nnpm install\nnpm start\n```\n## Sem o docker\n```\ncd Blogs-Api/src/\nnpm install\nnpm start\n```\n## Comandos auxiliares\n```bash\ncd Blogs-Api/src/\nnpm run drop \"dropa a tabela\"\nnpm run seed \"Alimenta a tabela com dados pré-definidos\"\n```\n\n## Aviso Importante \nCaso queira roda a aplicação via docker deverá ter o docker instalado no dispositivo, caso não esteja instalado você pode encontra como instalar neste [link](https://docs.docker.com/engine/install/ubuntu/) site oficial \n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjonathanprojetos%2Fblogs-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjonathanprojetos%2Fblogs-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjonathanprojetos%2Fblogs-api/lists"}