{"id":23119021,"url":"https://github.com/vbss-io/express-api-for-blogs","last_synced_at":"2026-04-12T09:08:57.169Z","repository":{"id":244780899,"uuid":"530814105","full_name":"vbss-io/express-api-for-blogs","owner":"vbss-io","description":"Este projeto é uma de API seguindo princípios REST para um blog, onde o usuário pode criar, ler, atualizar e deletar posts, fazer login, criar cadastro, categorias e consulta-los.","archived":false,"fork":false,"pushed_at":"2022-08-31T20:06:55.000Z","size":391,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-09T14:19:36.051Z","etag":null,"topics":["api","api-rest","crud","dotenv","express","joi-validation","jwt","jwt-authentication","msc-project","mysql","nodejs","nodemon","nodemon-express","rest","sequelize","trybe","trybe-projects"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":false,"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/vbss-io.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-08-30T20:11:24.000Z","updated_at":"2024-11-19T11:29:40.000Z","dependencies_parsed_at":"2024-06-17T12:18:35.297Z","dependency_job_id":"56f8574d-a268-48ef-baab-dbcf3b7acc2e","html_url":"https://github.com/vbss-io/express-api-for-blogs","commit_stats":null,"previous_names":["vitorbss12/api-for-blogs-with-express-sequelize-mysql","vbss-io/express-api-for-blogs"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vbss-io%2Fexpress-api-for-blogs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vbss-io%2Fexpress-api-for-blogs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vbss-io%2Fexpress-api-for-blogs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vbss-io%2Fexpress-api-for-blogs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vbss-io","download_url":"https://codeload.github.com/vbss-io/express-api-for-blogs/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247109799,"owners_count":20885140,"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":["api","api-rest","crud","dotenv","express","joi-validation","jwt","jwt-authentication","msc-project","mysql","nodejs","nodemon","nodemon-express","rest","sequelize","trybe","trybe-projects"],"created_at":"2024-12-17T05:31:09.679Z","updated_at":"2026-04-12T09:08:57.134Z","avatar_url":"https://github.com/vbss-io.png","language":"JavaScript","readme":"# Blogs Api - Node.js, Express, JWT, Sequelize e MySQL\n\n[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=vitorbss12_API-for-Blogs-with-Express-Sequelize-MySQL\u0026metric=alert_status)](https://sonarcloud.io/summary/new_code?id=vitorbss12_API-for-Blogs-with-Express-Sequelize-MySQL)\n[![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=vitorbss12_API-for-Blogs-with-Express-Sequelize-MySQL\u0026metric=reliability_rating)](https://sonarcloud.io/summary/new_code?id=vitorbss12_API-for-Blogs-with-Express-Sequelize-MySQL)\n[![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=vitorbss12_API-for-Blogs-with-Express-Sequelize-MySQL\u0026metric=security_rating)](https://sonarcloud.io/summary/new_code?id=vitorbss12_API-for-Blogs-with-Express-Sequelize-MySQL)\n[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=vitorbss12_API-for-Blogs-with-Express-Sequelize-MySQL\u0026metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=vitorbss12_API-for-Blogs-with-Express-Sequelize-MySQL)\n\nEste projeto é uma de `API` seguindo princípios `REST` para um blog, onde o usuário pode criar, ler, atualizar e deletar posts, fazer login, criar cadastro, categorias e consulta-los. O projeto foi desenvolvido em `Node.js`, `Express`, `JWT`, `Sequelize`, `MySQL`, além de outras ferramentas. Consiste em um `CRUD` de postagens com arquitetura MSC (`Model`, `Service`, `Controller`) e rotas bem definidas. O projeto foi desenvolvido em ambiente de desenvolvimento utilizando containers `Docker`, onde o banco de dados `MySQL` é criado e populado utilizando `Sequelize`.\n\n## Conteúdo\n\n- [Blogs Api - Node.js, Express, JWT, Sequelize e MySQL](#blogs-api---nodejs-express-jwt-sequelize-e-mysql)\n  - [Conteúdo](#conteúdo)\n- [**Arquitetura**](#arquitetura)\n    - [**Arquitetura de Camadas MSC**](#arquitetura-de-camadas-msc)\n    - [**Estrutura do Diretório**](#estrutura-do-diretório)\n- [**API Endpoints**](#api-endpoints)\n    - [**``POST /api/login``**](#post-apilogin)\n    - [**``GET /api/users``**](#get-apiusers)\n    - [**``GET /api/users/:id``**](#get-apiusersid)\n    - [**``POST /api/users``**](#post-apiusers)\n    - [**``DELETE /api/users/me``**](#delete-apiusersme)\n    - [**``GET /api/categories``**](#get-apicategories)\n    - [**``POST /api/categories``**](#post-apicategories)\n    - [**``GET /api/posts``**](#get-apiposts)\n    - [**``GET /api/posts/:id``**](#get-apipostsid)\n    - [**``GET /api/posts/search?q=searchTerm``**](#get-apipostssearchqsearchterm)\n    - [**``POST /api/posts``**](#post-apiposts)\n    - [**``PUT /api/posts/:id``**](#put-apipostsid)\n    - [**``DELETE /api/posts/:id``**](#delete-apipostsid)\n- [**Instruções**](#instruções)\n    - [**Instalação e Execução**](#instalação-e-execução)\n    - [**Local**](#local)\n    - [**Docker**](#docker)\n- [**Ferramentas**](#ferramentas)\n- [**Observações**](#observações)\n\n# **Arquitetura**\n\n### **Arquitetura de Camadas MSC**\n\nO projeto possui arquitetura de camadas MSC (`Model`, `Service`, `Controller`), onde cada camada é responsável por uma única funcionalidade.\n\n### **Estrutura do Diretório**\n````\nsrc\n  ├── api.js            definições de middlewares e rotas da API\n  ├── server.js         inicialização da API\n  ├── /controllers      camada de controller - requisição do cliente para a API\n  ├── /database         conexão com o banco de dados\n    ├── /config         config sequelize\n    ├── /migrations     migrations do banco de dados\n    ├── /models         camada de model - conexão com o banco de dados\n    ├── /seeders        população do banco de dados\n  ├── /middlewares      Validação e autenticação de dados\n    ├── /schemas        esquemas de validação para o JOI\n  ├── /routes           rotas para cada endpoint\n  ├── /services         camada de service - regras de negócio\n  ````\n\n# **API Endpoints**\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cstrong\u003eLogin\u003c/strong\u003e\u003c/summary\u003e\n\n  ### **``POST /api/login``**\n\n  Body:\n  ````\n  {\n    \"email\": \"exemplo@gmail.com\",\n    \"password\": \"123456\"\n  }\n  ````\n  - Só é possível fazer login com email e senha válidos. Caso login seja feito com sucesso um token é gerado utilizando o JWT.\n  \u003cbr /\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cstrong\u003eUsers\u003c/strong\u003e\u003c/summary\u003e\n\n  ### **``GET /api/users``**\n\n  - Retorna todos os usuários cadastrados.\n  - Necessita do Authorization header com o token gerado pelo login/sign-up.\n\n  ### **``GET /api/users/:id``**\n\n  - Retorna um usuário específico pelo id.\n  - Necessita do Authorization header com o token gerado pelo login/sign-up.\n\n  ### **``POST /api/users``**\n  Body:\n  ````\n  {\n    \"displayName\": \"Exemplo\",\n    \"email\": \"exemplo@email.com\",\n    \"password\": \"123456\",\n    \"image\": \"exemplo.png\"\n  }\n  ````\n  - Só é possível criar usuários com email que não estejam cadastrados no banco de dados e os demais dados válidos.\n  - Esse endpoint não necessita do Authorization header.\n  - Caso usuário seja criado com sucesso, um token é gerado utilizando o JWT.\n\n  ### **``DELETE /api/users/me``**\n\n  - Deleta um usuário com base no token.\n  - Necessita do Authorization header com o token gerado pelo login/sign-up.\n\n  \u003cbr /\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cstrong\u003eCategories\u003c/strong\u003e\u003c/summary\u003e\n\n  ### **``GET /api/categories``**\n\n  - Retorna todas as categorias cadastradas.\n  - Necessita do Authorization header com o token gerado pelo login/sign-up.\n\n  ### **``POST /api/categories``**\n\n  Body:\n  ````\n  {\n    \"name\": \"Exemplo\"\n  }\n  ````\n\n  - Só é possível criar categorias com nome que não estejam cadastradas no banco de dados.\n  - Necessita do Authorization header com o token gerado pelo login/sign-up.\n\n  \u003cbr /\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cstrong\u003ePosts\u003c/strong\u003e\u003c/summary\u003e\n\n  ### **``GET /api/posts``**\n\n  - Retorna todos os posts cadastrados.\n  - Necessita do Authorization header com o token gerado pelo login/sign-up.\n\n  ### **``GET /api/posts/:id``**\n\n  - Retorna um post específico pelo id.\n  - Necessita do Authorization header com o token gerado pelo login/sign-up.\n\n  ### **``GET /api/posts/search?q=searchTerm``**\n\n  - Retorna todos os posts que contenham o termo de busca no titulo ou no conteúdo.\n  - Necessita do Authorization header com o token gerado pelo login/sign-up.\n\n  ### **``POST /api/posts``**\n\n  Body:\n  ````\n  {\n    \"title\": \"Exemplo\",\n    \"content\": \"Exemplo\",\n    \"categoryIds\": [1, 2],\n  }\n  ````\n\n  - Só é possível criar posts com título, conteúdo e categorias válidos.\n  - Necessita do Authorization header com o token gerado pelo login/sign-up.\n  - O cadastro de posts no banco de dados é feito através de Managed Transactions no Sequelize.\n\n  ### **``PUT /api/posts/:id``**\n\n  Body:\n  ````\n  {\n    \"title\": \"Exemplo\",\n    \"content\": \"Exemplo\",\n  }\n  ````\n\n  - Só é possível atualizar posts com título e conteúdo válidos.\n  - Só é possível atualizar posts do usuário que o criou.\n  - Necessita do Authorization header com o token gerado pelo login/sign-up.\n\n  ### **``DELETE /api/posts/:id``**\n\n  - Deleta um post com base no id.\n  - Só é possível deletar posts do usuário que o criou.\n  - Necessita do Authorization header com o token gerado pelo login/sign-up.\n\n  \u003cbr /\u003e\n\u003c/details\u003e\n\n# **Instruções**\n\n### **Instalação e Execução**\n\nA instalação e execução vai depender do ambiente (`Local` ou `Docker`) que você está utilizando. É necessário ter o `Node.js` instalado na máquina. Cada particularidade será explicada a seguir.\n\n`Scrips` de instalação e execução:\n####\n**Instalar dependências:**\n````\nnpm install\n````\n\n**Criar o banco de dados:**\n````\nnpm run prestart\n````\n\n**População do banco de dados:**\n````\nnpm run seed\n````\n\n**Excluir o banco de dados:**\n````\nnpm run drop\n````\n\n**Executar o servidor:**\n````\nnpm start\n````\n\n**Executar o servidor com `Nodemon`:**\n````\nnpm run debug\n````\n\n### **Local**\n\nPara execução do ambiente local é necessário ter o `MySQL` instalado e rodar o `scripts` anteriores.\n\n### **Docker**\n\nPara execução do ambiente docker é necessário ter o `Docker` e `docker-compose` instalado.\n\n**Iniciar os containers:**\n````\ndocker-compose up -d\n````\nEsse comando inicia os containers do node e do mysql.\n\n**Acessar CLI do Container:**\n````\ndocker exec -it blogs_api bash\n````\nCaso opte por usar o Docker os `scripts` de instalação e execução **DEVERÃO** ser executados dentro do container.\n\n# **Ferramentas**\n\n**Linter**\n\nEste projeto foi desenvolvido utilizando o linter `ESLint` seguindo as boas práticas definidas na [Trybe](https://www.betrybe.com/).\n\n  - Para executar o linter, basta executar o comando:\n````\nnpm run lint\n````\n\n**Node**\n\nPara executar as funções deste projeto, é necessário ter o [Node](https://nodejs.org/en/) instalado.\n\n**Express**\n\n`Express` é uma biblioteca para criação de aplicações web.\n\n**Docker**\n\n`Docker` é um ambiente de execução de aplicações que permite a criação de containers para execução de aplicações.\n\n**Nodemon**\n\n`Nodemon` é um serviço que monitora alterações no código e reinicia o servidor automaticamente.\n\n**MySQL**\n\n`MySQL` é um banco de dados relacional, e foi utilizado para a criação do banco de dados deste projeto.\n\n**Sequelize**\n\nSequelize é uma biblioteca `ORM` para o banco de dados. É utilizado para a criação do banco de dados deste projeto, populando o banco e utilizado para o desenvolvimento das funções da camada `Model`. A estrutura do `Sequelize` pode ser encontrada na pasta `/database`.\n\n**JWT**\n\n`JWT` é uma biblioteca para criação de tokens. É utilizado para geração de tokens para autenticação de usuários da api. Foi utilização na maior parte das requisição, sua configuração está na pasta `/middlewares`.\n\n**Joi**\n\n`Joi` é uma biblioteca para validação de dados. É utilizado para validação de dados de entrada da api. Seu uso pode ser encontrado nos middlewares de validação e schemas em `/middlewares`.\n\n**dotenv**\n\n`dotenv` é uma biblioteca para leitura de arquivos de configuração. É utilizado para leitura de variáveis de ambiente.\n\n# **Observações**\n\n- Este é um projeto de estudo desenvolvido durante minha formação na [Trybe](https://www.betrybe.com/). :rocket:\n\n- Este repositório está sendo monitorado pelo [SonarCloud](https://sonarcloud.io/) para avaliação de qualidade.\n\n- Quer saber mais sobre mim? Veja o meu [LinkedIn](https://www.linkedin.com/in/vitorbss/).","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvbss-io%2Fexpress-api-for-blogs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvbss-io%2Fexpress-api-for-blogs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvbss-io%2Fexpress-api-for-blogs/lists"}