{"id":22514056,"url":"https://github.com/gui-lfm/api-blogs-sequelize","last_synced_at":"2026-05-08T05:05:20.978Z","repository":{"id":184327352,"uuid":"669939212","full_name":"Gui-lfm/api-blogs-sequelize","owner":"Gui-lfm","description":"API for blog content production using sequelize.","archived":false,"fork":false,"pushed_at":"2024-06-26T19:29:17.000Z","size":231,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-28T01:44:33.968Z","etag":null,"topics":["crud-application","express","mvc","mysql","nodejs","rest-api","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/Gui-lfm.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":"2023-07-23T23:19:22.000Z","updated_at":"2024-06-26T19:29:20.000Z","dependencies_parsed_at":"2024-06-26T23:40:40.979Z","dependency_job_id":"ff56fcb6-5311-4267-9a88-7820ae2b63dd","html_url":"https://github.com/Gui-lfm/api-blogs-sequelize","commit_stats":null,"previous_names":["gui-lfm/api-blogs-sequelize"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Gui-lfm/api-blogs-sequelize","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Gui-lfm%2Fapi-blogs-sequelize","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Gui-lfm%2Fapi-blogs-sequelize/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Gui-lfm%2Fapi-blogs-sequelize/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Gui-lfm%2Fapi-blogs-sequelize/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Gui-lfm","download_url":"https://codeload.github.com/Gui-lfm/api-blogs-sequelize/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Gui-lfm%2Fapi-blogs-sequelize/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261766772,"owners_count":23206687,"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-application","express","mvc","mysql","nodejs","rest-api","sequelize"],"created_at":"2024-12-07T03:15:45.494Z","updated_at":"2026-05-08T05:05:15.911Z","avatar_url":"https://github.com/Gui-lfm.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"## 🖥 Sobre o projeto:\n\n\u003cp align=\"justify\"\u003eProjeto desenvolvido durante o módulo de backend do curso de desenvolvimento web da @betrybe, realizado em Maio de 2023. Trata-se de uma API REST e um banco de dados para a produção de conteúdo para um blog, sendo possível realizar todas as operações CRUD para as postagens e fazendo uso da autenticação de usuários para editar e publicar posts. \u003c/p\u003e\n\n## 🛠 Tecnologias e libs utilizadas:\n\u003cp\u003eAs seguintes ferramentas foram utilizadas na construção do projeto:\u003c/p\u003e\n\n- [Sequelize](https://sequelize.org/)\n- [Mysql](https://www.mysql.com/)\n- [Docker](https://www.docker.com/)\n- [node.js](https://nodejs.org/en)\n- [express](https://expressjs.com/pt-br/)\n- [JWT](https://jwt.io/)\n\n## ↗️ Endpoints:\n### Login (credenciais de acesso)\n```\n/login\n```\n- Utiliza o método POST, recebe as informações de acesso no corpo da requisição.\n- Se a requisição não tiver todos os campos devidamente preenchidos, retorna uma mensagem de erro, com um status http `400`.\n- Se a requisição receber um par de `email` e `password` errados/inexistentes, retorna uma mensagem de erro, com um status http `400`.\n- Se o login foi feito com sucesso, retorna um token com um status http `200`. O token será necessário em requisições nos endpoints de User, Categories e Post.\n\n### User\n```\n/user\n```\n- Usando o método GET:\n  - Retorna todos os usuários presentes no banco de dados.\n  - É necessária a presença de um token válido, que deve estar presente no cabeçalho da requisição.\n  - Em caso de sucesso, retorna uma lista contendo os usuários, com um status http `200`:\n \n- Usando o método POST:\n  - Adiciona um novo usuário ao banco de dados, as informações de nome, email e senha devem estar presentes no corpo da requisição:\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    // a imagem não é obrigatória\n  }\n  ```\n  - Se a requisição não tiver o campo `displayName` devidamente preenchido com 8 caracteres ou mais, retorna uma mensagem de erro com um status http `400`.\n  - Se a requisição não tiver o campo `email` devidamente preenchido com o formato `\u003cprefixo@dominio\u003e`, retorna uma mensagem de erro com um status http `400`.\n  - Se a requisição não tiver o campo `password` devidamente preenchido com 6 caracteres ou mais, retorna uma mensagem de erro com um status http `400`.\n  - Se a requisição enviar o campo `email` com um email que já existe, retorna uma mensagem de erro com um status http `409`.\n  - Caso o usuário seja criado com sucesso, retorna um token com um status http `201`.\n\n```\n/user/id\n```\n- Usando o método GET, retorna o usuário especificado pelo id, caso ele exista no banco de dados.\n- É necessária a presença de um token válido, que deve estar presente no cabeçalho da requisição.\n- Em caso de sucesso, retorna o usuário encontrado, com um status http `200`.\n- Se o usuário for inexistente, retorna uma mensagem de erro, com um status http `404`.\n\n```\n/user/me\n```\n- Utiliza o método DELETE, deleta o usuário atualmente logado, com base no id presente no token.\n- Como dito acima, é necessária a presença de um token valido no cabeçalho da requisição.\n- Se o usuário for deletado com sucesso, retorna apenas um status http `204`.\n\n### Categories\n```\n/categories\n```\n- Usando o método GET:\n  - Retorna todas as categorias presentes no banco de dados.\n  - É necessária a presença de um token válido, que deve estar presente no cabeçalho da requisição.\n  - Caso não possua um token ou se ele for inválido, retorna uma mensagem de erro com o código `401`\n  - Ao listar categorias com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http `200`:\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- Usando o método POST:\n  - Adiciona uma nova categoria na tabela no banco de dados. O nome da nova categoria deve estar presente no corpo da requisição.\n  - Em caso de sucesso, retorna um objeto contendo o id e o nome da categoria criada, com um status http `201`.\n  - É necessária a presença de um token válido.\n  - Se a requisição não tiver o campo `name` devidamente preenchidos(não pode haver campo em branco), deve retornar uma mensagem de erro, com um status http `400`.\n\n### Post\n```\n/post\n```\n- Usando o método GET:\n  - Retorna uma lista contendo todos os blog posts presentes no banco de dados, cada blog post contendo informações como o autor e categorias do post.\n  - É necessária a presença de um token válido, que deve estar presente no cabeçalho da requisição.\n  - Em caso de sucesso, retorna a lista com um status http `200`.\n- Usando o método POST:\n  - Adiciona um novo blog post e vincula-o às categorias em suas presentes no banco de dados.\n  - É necessária a presença de um token válido, que deve estar presente no cabeçalho da requisição.\n  - Corpo da requisição deve obedecer o seguinte formato:\n  ```json\n  {\n    \"title\": \"Latest updates, August 1st\",\n    \"content\": \"The whole text for the blog post goes here in this key\",\n    \"categoryIds\": [1, 2]\n  }\n  ```\n  - Se a requisição não tiver todos os campos devidamente preenchidos, retorna uma mensagem de erro, com um status http `400`.\n  - Se a requisição não tiver o campo `categoryIds` devidamente preenchido com um array com todas as categorias existentes, retorna um erro , com um status http `400`.\n  - Se o blog post for criado com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http `201`:\n  ```json\n  {\n    \"id\": 3,\n    \"title\": \"Latest updates, August 1st\",\n    \"content\": \"The whole text for the blog post goes here in this key\",\n    \"userId\": 1,\n    \"updated\": \"2022-05-18T18:00:01.196Z\",\n    \"published\": \"2022-05-18T18:00:01.196Z\"\n  }\n  ```\n \n```\n/post/id\n```\n- Usando o método GET:\n  - Retorna o blog post especificado pelo id, caso ele exista no banco de dados.\n  - É necessária a presença de um token válido, que deve estar presente no cabeçalho da requisição.\n  - Em caso de sucesso, retorna o blog post encontrado, com um status http `200`.\n  - Se o blog post for inexistente, retorna uma mensagem de erro, com um status http `404`.\n\n- Usando o método PUT:\n  - Modifica um blog post, caso ele exista, com as informações presentes no corpo da requisição.\n  - É necessária a presença de um token válido, que deve estar presente no cabeçalho da requisição.\n  - Só será permitida a alteração do blog post caso a pessoa usuária seja a autora dele. Isso será validado pelo token inserido.\n  - Somente os campos title e content poderão ser alterados.\n  - O corpo da requisição deve ter o seguinte formato:\n   ```json\n   {\n     \"title\": \"Latest updates, August 1st\",\n     \"content\": \"The whole text for the blog post goes here in this key\"\n   }\n   ```\n  - Se o blog post for alterado com sucesso, retorna o blog post alterado, com um status http `200`.\n\n- Usando o método DELETE:\n  - Remove o blog post especificado pelo id, caso ele exista.\n  - Só será permitida a remoção do blog post caso a pessoa usuária seja a autora dele. Isso será validado pelo token inserido.\n  - É necessária a presença de um token válido, que deve estar presente no cabeçalho da requisição.\n  - Se o post for inexistente, retorna uma mensagem de erro, com um status http `404`.\n  - Em caso de sucesso, não retorna nenhuma resposta, apenas um status http `204`.\n\n## 👾Autor\n\n \u003ca href=\"https://github.com/Gui-lfm\"\u003e\n \u003cimg style=\"border-radius: 50%;\" src=\"https://avatars.githubusercontent.com/u/72154970?v=4\" width=\"100px;\" alt=\"\"/\u003e\n \u003cbr /\u003e\n \u003csub\u003e\u003cb\u003eGuilherme Lucena\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\n \n ### ✉contato:\n\u003cdiv\u003e\n  \u003ca href=\"mailto:guilherme.lucena17@gmail.com\" target=\"_blank\"\u003e\u003cimg src=\"https://img.shields.io/badge/Gmail-D14836?style=for-the-badge\u0026logo=gmail\u0026logoColor=white\" target=\"_blank\"/\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.linkedin.com/in/guilherme-lucena-fm94/\" target=\"_blank\"\u003e\u003cimg src=\"https://img.shields.io/badge/LinkedIn-0077B5?style=for-the-badge\u0026logo=linkedin\u0026logoColor=white\" target=\"_blank\"/\u003e\u003c/a\u003e\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgui-lfm%2Fapi-blogs-sequelize","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgui-lfm%2Fapi-blogs-sequelize","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgui-lfm%2Fapi-blogs-sequelize/lists"}