{"id":21894361,"url":"https://github.com/ludson96/project-blogs-api","last_synced_at":"2026-04-13T00:02:18.709Z","repository":{"id":65045990,"uuid":"581231546","full_name":"ludson96/project-blogs-api","owner":"ludson96","description":"Projeto para estudo de API RestFul com Node.js usando o pacote sequelize para fazer CRUD, e JWT para autenticação","archived":false,"fork":false,"pushed_at":"2024-04-10T13:35:04.000Z","size":344,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-03T04:31:54.712Z","etag":null,"topics":["crud","docker","docker-compose","express","javascript","jwt","jwt-authentication","mysql","node-js","nodejs","orm","sequelize"],"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/ludson96.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-12-22T16:11:07.000Z","updated_at":"2022-12-23T17:58:36.000Z","dependencies_parsed_at":"2023-02-04T11:17:00.068Z","dependency_job_id":null,"html_url":"https://github.com/ludson96/project-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/ludson96%2Fproject-blogs-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ludson96%2Fproject-blogs-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ludson96%2Fproject-blogs-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ludson96%2Fproject-blogs-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ludson96","download_url":"https://codeload.github.com/ludson96/project-blogs-api/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244902928,"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":["crud","docker","docker-compose","express","javascript","jwt","jwt-authentication","mysql","node-js","nodejs","orm","sequelize"],"created_at":"2024-11-28T13:22:10.993Z","updated_at":"2026-04-13T00:02:13.604Z","avatar_url":"https://github.com/ludson96.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Repositório do projeto Blogs API 📝\n ## Módulo: BACK-END\n \n  Repositório possui projeto desenvolvido no período que estive na \u003cb\u003eTrybe\u003c/b\u003e, abordando os conceitos de \u003cb\u003eRESTFul API\u003c/b\u003e com CRUD completo utilizando arquitetura Model-Service-Controller (MSC). \n## Informações de aprendizados\n- Este é um projeto desenvolvido para me ajudar a aprender sobre `sequelize` e `JWT`;\n- Meu primeiro projeto usando `sequelize` e `JWT`;\n- Utilizei o Cliente Rest `Thunder Client`, como extensão, para visualizar o retorno do meu acesso.\n## Linguagem usadas\n\n[![JavaScript][JavaScript-logo]][JavaScript-url]\n[![NodeJS][NodeJS-logo]][NodeJS-url]\n[![Express][Express-logo]][Express-url]\n[![MySQL][MySQL-logo]][MySQL-url]\n[![Sequelize][Sequelize-logo]][Sequelize-url]\n[![JWT][JWT-logo]][JWT-url]\n[![Docker][Docker-logo]][Docker-url]\n[![.ENV][.ENV-logo]][.ENV-url]\n[![Nodemon][Nodemon-logo]][Nodemon-url]\n[![ESLint][ESLint-logo]][ESLint-url]\n## O que foi desenvolvido\n\u003cp\u003e \n Uma API e um banco de dados, utilizando a arquitetura MSC (model-service-controller), para a produção de conteúdo para um blog! \u003cbr\u003e\n \n 1. Desenvolvi endpoints que estarão conectados ao banco de dados seguindo os princípios do REST;\u003cbr\u003e\n 2. Para fazer um post é necessário usuário e login, portanto foi trabalhada a relação entre user e post; \u003cbr\u003e\n 3. Será necessária a utilização de categorias para os posts, trabalhando, assim, a relação de posts para categories e de categories para posts. \u003cbr\u003e\n\u003c/p\u003e\n\n\u003e `docker-compose.yml`, `config.js` e `/seeders` arquivos providos pela Trybe.\n\n## Variáveis de Ambiente\n\nPara rodar esse projeto, atente-se as variáveis de ambiente no seu .env. Existe um arquivo `.env.example` com as informações para configuração.\n## Instruções para instalar e rodar\n\n1. Clone o repo:\n```\n  git clone git@github.com:Ludson96/project-blogs-api.git\n```\n2. Já existe um arquivo docker-compose.yml. Bastando usar o comando docker-compose up para rodar o MySQL e o Node pelo docker. Execute os services do docker: `node` e `db` \n```\n  docker-compose up -d\n```\n3. Inicie o container node (renomeado para blogs_api):\n```\n  docker exec -it blogs_api bash\n```\n4. Instale as suas dependências:\n```\n  npm install\n```\n5. Execute o servidor:\n\n```\n  npm start\n```\nOutra forma de executar é utilizando o `nodemom` (permite fazer alteração em tempo real sem precisar derrubar o servidor e iniciá-lo novamente):\n```\n  npm run debug\n```\n6. Utilizar alguma Plataforma de API para acessar os endpoints e fazer seus devidos experimentos. Exemplos: Postman e Insomnia. Ou uma extensão no VSCode, recomendo utilizar a thunder client.\n\n7. Uso\n\n- utilize o comando `npm run prestart`, ele criará o banco de dados e as tabelas de acordo com o que está em `/migrations` e `/seeders` .\n\n- Todas as rotas (exceto `post /login` e `post /user` ) requerem autenticação\n## Diagrama\n\n![Diagrama de relacionamentos das tabelas](diagrama.png)\n\n\u003e _Imagem disponibilizada pela Trybe_\n## Endpoints\n\n\u003cdetails\u003e\n\n###  Rota de Login\n\n####  POST `/login`\n- Entrar\n- O corpo deve ser o seguinte:\n```json\n{\n  \"email\" : \" exemplo@email.com \" ,\n  \"senha\" : \" 123456 \"\n}\n```\n  - Retorna um token se o login for concluído\n\n###  Rota do Usuário\n\n####  POST `/usuário`\n- Cria um novo usuário\n- O corpo deve ser o seguinte, onde:\n  -  `displayName` deve ter pelo menos 8 caracteres\n  -  `email` deve ter um formato válido\n  -  `password` deve ter pelo menos 6 caracteres\n  -  `imagem` é opcional\n```json\n{\n  \"displayName\" : \" John Doe \" ,\n  \"email\" : \" exemplo@email.com \" ,\n  \"senha\" : \" 123456 \" ,\n  \"image\" : \" https://cdn1.iconfinder.com/data/icons/users-solid-1/30/users-solid-profile-neutral-5-512.png \"\n}\n```\n- Se o usuário for criado com sucesso, um token é fornecido\n\n####  GET `/usuário`\n- Lista todos os usuários:\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####  GET `/user/:id`\n- Pega um parâmetro numérico, e se houver algum usuário com id correspondente, retorna:\n```json\n{\n  \"id\" : 3 ,\n  \"displayName\" : \" John Doe \" ,\n  \"email\" : \" exemplo@email.com \" ,\n  \"image\" : \" https://cdn1.iconfinder.com/data/icons/users-solid-1/30/users-solid-profile-neutral-5-512.png \"\n}\n```\n\n####  DELETE `/user/me`\n- Exclui o usuário atual\n- Se o usuário for excluído com sucesso, o status `204` é retornado\n\n###  Categorias Rota\n\n####  POST `/categorias`\n- Cria uma nova categoria\n- O corpo deve ser o seguinte:\n```json\n{\n  \"name\" : \" Truques de mágica \"\n}\n```\n\n####  GET `/categorias`\n- Lista todas as categorias:\n```json\n[\n  {\n      \"id\" : 1 ,\n      \"nome\" : \" Animais \"\n  },\n  {\n      \"id\" : 2 ,\n      \"nome\" : \" Livros \"\n  },\n  /* ... */\n]\n```\n\n###  Pós Rota\n\n####  POST `/post`\n- Cria uma nova postagem no blog\n- O corpo deve ser o seguinte:\n```json\n{\n  \"title\" : \" Resenha: A arte da columbofilia \" ,\n  \"content\" : \" Este é um ótimo livro sobre como os pombos podem ser treinados para se tornarem campeões! \" ,\n  \"categoryIds\" : [ 1 , 2 ]\n}\n```\n\n####  GET `/post`\n- Lista todas as postagens do blog:\n```json\n[\n  {\n    \"id\" : 1 ,\n    \"title\" : \" As melhores raças de cães para caça \" ,\n    \"content\" : \" Aqui estão os melhores companheiros de caça \" ,\n    \"userId\" : 1 ,\n    \"publicado\" : \" 2011-08-01T19:58:00.000Z \" ,\n    \"atualizado\" : \" 2011-08-01T19:58:51.000Z \" ,\n    \"usuário\" : {\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    \"categorias\" : [\n      {\n        \"id\" : 1 ,\n        \"nome\" : \" Animais \"\n      }\n    ]\n  },\n  \n  /* ... */\n]\n```\n\n####  GET `/post/:id`\n- Pega um parâmetro numérico, e se houver algum post com um id correspondente, retorna:\n```json\n{\n  \"id\" : 1 ,\n  \"title\" : \" As melhores raças de cães para caça \" ,\n  \"content\" : \" Aqui estão os melhores companheiros de caça \" ,\n  \"userId\" : 1 ,\n  \"publicado\" : \" 2011-08-01T19:58:00.000Z \" ,\n  \"atualizado\" : \" 2011-08-01T19:58:51.000Z \" ,\n  \"usuário\" : {\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  \"categorias\" : [\n      {\n          \"id\" : 1 ,\n          \"nome\" : \" Animais \"\n      }\n  ]\n}\n```\n\n####  GET `/post/search?q=:searchTerm`\n- Pesquisa postagens por título ou conteúdo, por exemplo:\n```json\n  // GET /post/search?q=silk\n  [\n    {\n      \"id\" : 2 ,\n      \"title\" : \" Ótimos livros sobre a Rota da Seda \" ,\n      \"content\" : \" Estes são alguns livros obrigatórios sobre a Rota da Seda \" ,\n      \"userId\" : 1 ,\n      \"publicado\" : \" 2011-08-01T19:58:00.000Z \" ,\n      \"atualizado\" : \" 2011-08-01T19:58:51.000Z \" ,\n      \"usuário\" : {\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      \"categorias\" : [\n        {\n          \"id\" : 2 ,\n          \"nome\" : \" Livros \"\n        }\n      ]\n    }\n  ]\n```\n- Se não houver parâmetro de consulta, retorna todos os posts:\n```json\n  // GET /post/search?q=\n  [\n    {\n      \"id\" : 1 ,\n      \"title\" : \" As melhores raças de cães para caça \" ,\n      \"content\" : \" Aqui estão os melhores companheiros de caça \" ,\n      \"userId\" : 1 ,\n      \"publicado\" : \" 2011-08-01T19:58:00.000Z \" ,\n      \"atualizado\" : \" 2011-08-01T19:58:51.000Z \" ,\n      \"usuário\" : {\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      \"categorias\" : [\n        {\n          \"id\" : 1 ,\n          \"nome\" : \" Cães \"\n        }\n      ]\n    },\n    \n    /* ... */\n  ]\n```\n\n####  COLOQUE `/post/:id`\n- Edita uma postagem existente\n- O corpo deve ser o seguinte, onde:\n  - não é possível alterar a categoria\n  - somente o **autor** pode editar a postagem\n```json\n{\n  \"title\" : \" Como fazer crescer as plantas da sua casa \" ,\n  \"content\" : \" Este é um guia passo a passo para melhorar o crescimento de plantas em ambientes internos \"\n}\n```\n\n####  APAGAR `/post/:id`\n- Exclui uma postagem existente\n- Somente o autor pode deletar o post\n- Se a postagem for excluída com sucesso, retorna o status `204`\n\n\u003c/details\u003e\n\n[JavaScript-logo]: https://img.shields.io/badge/javascript-%23323330.svg?style=for-the-badge\u0026logo=javascript\u0026logoColor=%23F7DF1E\n[JavaScript-url]: https://www.javascript.com/\n[NodeJS-logo]: https://img.shields.io/badge/node.js-6DA55F?style=for-the-badge\u0026logo=node.js\u0026logoColor=white\n[NodeJS-url]: https://nodejs.org/en/\n[Docker-logo]: https://img.shields.io/badge/docker-%230db7ed.svg?style=for-the-badge\u0026logo=docker\u0026logoColor=white\n[Docker-url]: https://www.docker.com\n[MySQL-logo]: https://img.shields.io/badge/mysql-%2300f.svg?style=for-the-badge\u0026logo=mysql\u0026logoColor=white\n[MySQL-url]: https://www.mysql.com\n[Express-logo]: https://img.shields.io/badge/express.js-%23404d59.svg?style=for-the-badge\u0026logo=express\u0026logoColor=%2361DAFB\n[Express-url]: https://expressjs.com\n[Sequelize-logo]: https://img.shields.io/badge/Sequelize-52B0E7?style=for-the-badge\u0026logo=Sequelize\u0026logoColor=white\n[Sequelize-url]: https://sequelize.org\n[JWT-logo]: https://img.shields.io/badge/JWT-black?style=for-the-badge\u0026logo=JSON%20web%20tokens\n[JWT-url]: https://jwt.io/  \n[Nodemon-logo]: https://img.shields.io/badge/Nodemon-76D04B?logo=nodemon\u0026logoColor=fff\u0026style=for-the-badge\n[Nodemon-url]: https://www.npmjs.com/package/nodemon\n[ESLint-logo]: https://img.shields.io/badge/ESLint-4B3263?style=for-the-badge\u0026logo=eslint\u0026logoColor=white\n[ESLint-url]: https://eslint.org/\n[.ENV-logo]: https://img.shields.io/badge/.ENV-ECD53F?logo=dotenv\u0026logoColor=000\u0026style=for-the-badge\n[.ENV-url]: https://www.npmjs.com/package/dotenv\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fludson96%2Fproject-blogs-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fludson96%2Fproject-blogs-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fludson96%2Fproject-blogs-api/lists"}