{"id":20147944,"url":"https://github.com/ericrodriguesfer/estudo-nestjs-api","last_synced_at":"2025-09-21T08:31:38.879Z","repository":{"id":39788140,"uuid":"376666581","full_name":"ericrodriguesfer/estudo-nestjs-api","owner":"ericrodriguesfer","description":"Projeto implementado em forma de estudo e aprofundamento do NestJs, com módulo de Usuários, Autenticação e etc... o foco do projeto é praticar e aprofundar as boas práticas e fundamentos pregados pelo NestJs, sendo o mesmo utilizado em conjunto com TypeORM e PostgreSQL para a persitência de dados, SendGrid ou NodeMailer para envio de e-mails e JWT para gerenciamento de autenticação e autorização, projeto em desenvolvimento...","archived":false,"fork":false,"pushed_at":"2022-05-25T22:33:38.000Z","size":280,"stargazers_count":10,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-04T00:24:31.395Z","etag":null,"topics":["containers","docker","docker-compose","jwt","nestjs","nodejs","nodemailer","sendgrid","swagger","swagger-ui","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/ericrodriguesfer.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":"2021-06-14T00:26:14.000Z","updated_at":"2024-11-03T07:26:16.000Z","dependencies_parsed_at":"2022-08-27T19:21:26.722Z","dependency_job_id":null,"html_url":"https://github.com/ericrodriguesfer/estudo-nestjs-api","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ericrodriguesfer/estudo-nestjs-api","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericrodriguesfer%2Festudo-nestjs-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericrodriguesfer%2Festudo-nestjs-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericrodriguesfer%2Festudo-nestjs-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericrodriguesfer%2Festudo-nestjs-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ericrodriguesfer","download_url":"https://codeload.github.com/ericrodriguesfer/estudo-nestjs-api/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericrodriguesfer%2Festudo-nestjs-api/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":276211931,"owners_count":25604031,"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-09-21T02:00:07.055Z","response_time":72,"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":["containers","docker","docker-compose","jwt","nestjs","nodejs","nodemailer","sendgrid","swagger","swagger-ui","typescript"],"created_at":"2024-11-13T22:33:06.202Z","updated_at":"2025-09-21T08:31:38.437Z","avatar_url":"https://github.com/ericrodriguesfer.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"http://nestjs.com/\" target=\"blank\"\u003e\u003cimg src=\"https://nestjs.com/img/logo_text.svg\" width=\"320\" alt=\"Nest Logo\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n# PROJETO DE ESTUDO DE NESTJS\n\n##### Projeto em desenvolvimento...\n\n## SAIBA MAIS SOBRE O PROJETO\n\nEsse projeto consiste em um estudo e aprofundamento prático de NestJs, esse projeto inicialmente era o estudo baseado somente no que a documentação no NestJs oferece **[Doc NestJs](https://docs.nestjs.com/)**, onde basicamente foi ensinado a utilizar o básico dos recursos do NestJs com o banco de dados não relacional MongoDB, mas sem aplicar as melhores práticas que o NestJs prega, com isso resolvi pegar o mesmo projeto e o atualizar para um novo propósito, o anterior era basicamente um projeto onde um dono (owner) podia se cadastrar, e com isso ele podia cadastrar seus pets que em geral eram gatos, e listas todos os seus gatos e os atualizar de forma individual, para esse novo projeto foi reestruturado o mesmo completamente desde a estrutura arquitetural do projeto em si, até o banco de dados e o ORM que seria utilizado, hoje o projeto já tem a possibilidade de permitir o cadastro de um usuário na plataforma, o login do mesmo, e atualização do perfil do mesmo, o próximo passo será implementar o módulo de pets, onde permitirá o cadastro de vários pets, e posterior a isso, o módulo de finanças, onde vai permitir cadastrar os gastos tidos com cada pet, para favorecer a possibilidade de criação de estatísticas como: pet que mais gasta, a média de gasto com os pets por períodos e etc, sendo isso o último passo deste projeto de estudo.\n\n## ROADMAP\n\n- [x] Ajustar a estrutura do projeto para o padrão Nest com TypeORM.\n- [x] Integrar TypeORM ao projeto.\n- [x] Integrar o TypeORM ao PostgreSQL.\n- [x] Containerizar o banco de dados PostgreSQL do projeto com Docker (docker-compose).\n- [x] Criar e implementar os módulos de Usuário e Autenticação.\n- [x] Implementar a autenticação do usuário.\n- [x] Implementar a interceptação de rotas mediante login/auth feito.\n- [x] Implementar envio de e-mail mediante algumas ações como: cadastro de novo usuário na plataforma, requisição de token para recuperação de senha e redefinição de senha feita com sucesso.\n- [x] Implementar o envio de sms mediante algumas ações como: requisição de token para recuperação de senha e redefinição de senha de acesso, e sms de notificação quando o perfil do usuário é atualizado.\n- [x] Documentar o projeto ao menos de forma básica com [Swagger](https://swagger.io/).\n- [x] Criar e implementar o módulo de Pets.\n- [ ] Criar e implementar o módulo de Finança.\n- [ ] Melhorar a documentação do [Swagger](https://swagger.io/) ajustando a parte de auth na documentação do projeto.\n- [x] Implementar paginação dos resultados nas rotas/endpoints de método GET.\n\n## FEATURES\n\n* Usuários:\n\n  * Se cadastrar na plataforma:\n    * **OBS:** *É enviado um email para o email de registro deste dado usuário informando/confirmando que ele se registrou na plataforma.*\n  * Atualizar os próprios dados.\n  * Solicitar a listagem de seus dados.\n  * Logar na plataforma/Criar uma sessão de acesso.\n  * Solicitar a recuperação de senha:\n\n    * Solicitar o envio de um token para recuperação de senha (pode solicitar por e-mail ou sms):\n      * **OBS:** *É enviado um email para o email de registro deste dado usuário contendo o token que ele usará para redefinir sua senha perdida*\n      * **OBS:** *É enviado um sms para o número de telefone de registro deste dado usuário contendo o token que ele usará para redefinir sua senha perdida*\n    * Alterar sua senha com o token em posse\n      * **OBS:** *É enviado um email para o email, e um sms para o número de telefone de registro deste dado usuário informando/confirmando que a senha dele foi redefinida com sucesso*\n  \n* Pets:\n\n  * Cadastrar seus pets:\n     \n    * CRUD de um pet:\n      * **OBS:** *Ao ir realizar o cadastro deu um pet com suas devidas informações (nome e idade), também é repassado junto com o mesmo a raça do pet em forma de string, caso seja uma raça que já esteja cadastrada no banco de dados, apenas referenciamos este novo pet a ela, caso não, a criamos no banco de dados e após isso criamos o pet o referenciando com a sua raça que foi recem cadastrada.*\n      * **OBS:** *A raça de um pet não pode ser editada, somente nome e idade de forma opcional.*\n    * CRUD de uma raça:\n      * **OBS:** *As raças são cadastradas por meio do cadastro de um pet.*\n\n## OBSERVAÇÕES DO PROJETO\n\nO projeto possui duas formas de envio de e-mail, uma utilizando o [SendGrid](https://sendgrid.com/) uma plataforma/ferramenta de envio de email da [Twilio](https://www.twilio.com/pt-br/), por ser um serviço a questão do envio de e-mails com a mesma é mais fácil e rápida de \"configurar\", sendo feita algumas poucas configurações dentro da plataforma mesmo da ferramenta, como criação do template que será utilizado no envio de e-mail (existe inúmeros modelos prontos), o cadastro na plataforma do e-mail que será o responsável ou o enviante dos e-mails e a obtenção de uma key de uso do pŕoprio SendGrid, no projeto em si, a configuração basicamente é importar o módulo do SendGrid ao projeto e passar ao mesmo a key que foi obtida na plataforma, pois é ela quem valida tudo que está configurado na plataforma como e-mails cadastrados como *senders* e os templates que serão utilizados.\n\nA outra forma de enviar e-mail foi a última configurada no projeto e a que está em uso no momento, que é o envio de e-mails com o [NodeMailer](https://nodemailer.com/about/), que basicamente é um módulo do NodeJs que permite realizar o envio de e-mails, neste cenário é um pouco mais complexto de configurar do que o com uso do SendGrid, mas particularmente, gostei mais deste com o NodeMailer, como ele é totalmente configurado no projeto via código mesmo, deste a integração com um serviço SMTP de envio de e-mail, login no e-mail que será o enviante dos e-mails do projeto/plataforma, como a criação dos modelos/templates que serão utilizandos para enviar os e-mails, neste caso foi utilizado o [Handlebars](https://handlebarsjs.com/) em conjunto com CSS para enviar um e-mail estilizado que seja mais bonito e agradável ao usuário, neste caso deste projeto seguindo os padrões do NestJs implementei um módulo apenas para isso, configuração e envio de e-mails, módulo esse que pode ser usado pelos demais módulos do projeto/aplicação, e por ser algo totalmente configurado no projeto, temos mais domínio e controle para o alterar como melhor desejarmos e necessitarmos para o projeto.\n\nE um grande diferencial do NodeMailer ao SendGrid é que o mesmo é gratuito, o SendGrid é um serviço pago com uma cota de uso gratuita que limita um total de envios de e-mails diários e passado o limite máximo gratuito de envios, para continuar usando o mesmo terá que ser adquirido o seriviço, o NodeMailer nesse ponto e ilimitado e totalmente configurável e customizável.\n\nO projeto possui a nova funcionalidade de envio de SMS, utilizando a biblioteca [Nestjs Twilio](https://www.npmjs.com/package/nestjs-twilio) em conjunto com o serviço de sms da própria plataforma Twilio, para prover a feature de envio de sms pela API para com seus usuários.\n\n## TECNOLOGIAS QUE FORAM UTILIZADAS NO PROJETO\n* NodeJs\n* ExpressJs\n* NestJs\n* TypeORM\n* Docker\n* SendGrid\n* NodeMailer\n* NestJs Twilio (SMS)\n* Handlebars\n* PostgreSQL\n* Jwt\n* Swagger\n* Date fns\n* BCrypt\n* Class Transformer e Class Validator\n* NestJs TypeORM Paginate\n* Entre outros\n\n## CASO QUEIRA SABER MAIS SOBRE O PROJETO\n\nPode entrar em contato comigo pelo seguinte email: ericdesenvolvedor7@gmail.com\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fericrodriguesfer%2Festudo-nestjs-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fericrodriguesfer%2Festudo-nestjs-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fericrodriguesfer%2Festudo-nestjs-api/lists"}