Executando verificação de segurança...
9

Acabei de finalizar um CRUD completo usando Fastify, PrismaORM e PostgreSQL, tudo rodando via Docker Compose!

Estou compartilhando um projeto especial que desenvolvi para sair de uma pequena zona de conforto: um CRUD completo usando Fastify, PrismaORM e PostgreSQL, tudo rodando em Docker Compose.
Sou programador backend e "trabalho" com Node.js há 2 anos, mas nunca tinha usado Fastify antes. Foi algo interessante e também uma ótima oportunidade de aprendizado!
Também nunca tinha subido dois containers para uma única aplicação. Sem dúvida, isso ampliou meus conhecimentos com Docker e Docker Compose.

O objetivo desse projeto foi justamente experimentar novas ferramentas, entender como elas se integram e fortalecer meu conhecimento em arquitetura de APIs modernas.
Durante o desenvolvimento, enfrentei alguns obstáculos (principalmente na configuração do Prisma e do Docker).

https://github.com/Kadu-H/FastDockerCrud#

Se você puder dar uma olhada no repositório, ficarei muito feliz com qualquer feedback, seja sobre organização, boas práticas, performance ou até dicas de como evoluir o projeto e a programação em si.
Acredito muito na troca de experiências e pretendo adquirir uma gama de conhecimentos para, enfim, conquistar minha primeira vaga como desenvolvedor.

Carregando publicação patrocinada...
7

Dicas pra melhorar seu build no Dockerfile e docker-compose.

Sempre coloque a versão do node.
Em prod use hash pra travar a versão.

Ao invés de copiar todos dos arquivos copie os arquivos que o prisma precisa faça o generate e depois copie os demais arquivos.

Troque usuário root (padrão) pra usuário node com menos privilégios.

Faça migrate do banco no ci/cd e não ao subir a aplicação. Outra opção é utilizar uma cópia da aplicação como serviço apenas pra subir as migrations.

Cuidado ao usar imagens derivadas. Bitnami não é imagem oficial do PostgreSQL.

Imagens de prod deveriam usar npm ci pra instalar pacotes. Sim vai quebrar o prisma generate. Pesquise por stage build.

Inclua um health check no banco.

Desculpe o tom impositivo. Espero ter ajudado

2
1

Pretendo fazer isso tambem!
Dividi o meu aprendizado nesse projeto em partes, agora estou focando em entender o docker, posteriormente vou para o prisma e sua comunicação com o banco.
Mas valeu pela dica, vou aplica-la logo!

1

Implementei quase tudo que você mencionou, mas confesso que acho que muita coisa foi na base da gambiarra.
Pesquisei um pouco sobre stage build e health check no banco, e ainda pretendo implementar nesse projeto.
Valeu mesmo pelo feedback, ajudou bastante! Se tiver mais dicas, tô aceitando.

1

Não tinha tido tempo de olhar o código.
Sobre a controller faça validações de entrada. Ex: Verifique se é o id é numérico.
Inclua uma paginação.
Na paginação possibilite o usuário filtrar por nome, informar quantidade de itens por página e pagina que ele quer ver.
Inclua um limite máximo na paginação.
Utilize valores default caso o usuário não informe nada.
Retorne na resposta quantidade total de itens, página retornada e tamanho da página retornada. Entenda porque retornar essas informações.
Não permita itens estranhos no nome como coisas diferentes de letras e números se for o caso.

Sugestões para estudo:

  • Inclua um createAt e um updateAt para entender como trabalhar com datas no banco/prisma.
  • Inclua uma flag de publicado ou um soft delete para entender como funciona no prisma.
  • Inclua um range date de validade para apresentação daquele item.
  • Inclua filtros na sua paginação para o range date e ou publicado.
  • Faça um prisma separado com banco em memória para testes teste os range dates com datas mockadas e ou via injeção de dependencia
  • Crie issues para tarefas, documente a necessidade e o motivo, resolva as issues com commit
  • Estude se o fastify tem cache, rate limite/ou implemente um cache com Redis, utilize padrão notification para invalidar o cache e aprender sobre o padrão.
  • Estude conventional commit

Veja o que faz sentido e o que vai te agregar valor.
Boa sorte

2
1

Obrigado pela dica, li sobre e gostei do objetivo da ferramenta!
É incrivel oque ele pode fazer com um Schema, acho que vou usar como inspiração para construir as minhas APIs.

2

Ficou muito bom! Esse tipo de projetinho basico é bom pra trazer confiança principalmente em tecnologias que nunca usamos ou nao dominamos.

Alguns pontos que seriam interessante de vc implementar e aumentar o conhecimento tambem:

  • deixar um .env.example, da pra ver que a conexão é feita com uma variável DATABASE_URL, seria interessante ter ela mesmo que vazia no arquivo, e tambem uma variável de ambiente "PORT" para setar a porta da aplicação
  • Levar o projeto para Typescript, hoje em dia vem se tornando mais padrão usar o Typescript ao inves do Javascript "puro", traz tipagem e confiabilidade maior para o projeto
  • Nome da pasta "routers", essa parte é mais questão de convenção, mas ao meu ver é mais comum o nome ser "routes" de rotas do que "routers" que no ingles seria algo mais como "roteadores"

São só dicas e sugestões, mas o projeto está legal, parabéns!

1

Show, valeu!
O projeto é basico mesmo, inclusive penso em por algum objetivo para ele, inclusive mudar o dado que é fornecido pela api, que atualmente é um "item".

Segui sua dica de renomear a pasta de rotas e deixar um .env.example no repositorio, inclusive retirei as variaveis de ambiente do docker

Sobre o Typescript, eu não gosto de usar ele, por mais que exista algumas vantagens em usa-lo, eu não me sinto confortavel em usar, pode ser que seja só o habito de usar Javascript, ou eu realmente não precise do Typescript nos meus projetos.
Você acha que devo encarar como um desafio e praticar com Typescript?

2
1

Vou implementar o swagger logo logo.
Obrigado pela dica, inclusive a do redis, já que nunca usei ele, vou aplicar nesse projeto.
Alguma outra dica de como implementar o redis da melhor forma para esse projeto?

1
1

Haha, valeu!
Nos dias de hoje é muito comum se tornar dependente de alguma IA!

Mas engano seu, usei uma IA para gerar o readme, mesmo que modifiquei ele quase todo. Tambem usei para consertar um erro no meu arquivo shell que espera o banco ficar pronto para rodar a aplicação.