Uma app web para publicação de posts feita com Ruby on Rails, PostgreSQL, Redis, Sidekiq e HTML/CSS/JS.
- Git
- Docker
- Ruby 3.3.0
- libpq-dev (para instalar o pg gem)
git clone https://github.com/hreis1/blog.git
cd blog
Execute o comando para subir as aplicações:
docker compose up -d
Com isso, será criado:
- Um container com o PostgreSQL rodando na porta 5432.
- Um container com o Redis
Comente as linhas 9 e 10 dos arquivos config/environments/development.rb
, config/environments/production.rb
:
#user_name: Rails.application.credentials.gmail[:email],
#password: Rails.application.credentials.gmail[:password]
Apague o arquivo config/credentials.yml.enc
e crie um novo arquivo de credenciais:
rm config/credentials.yml.enc
Adicione as credenciais do Gmail no arquivo
gmail:
email: '[email protected]'
password: 'senha'
O password é a senha gerada pelo Gmail para aplicativos menos seguros. Para gerar a senha, acesse https://myaccount.google.com/apppasswords e crie uma senha para o app.
Logo após, descomente as linhas e execute o comando para criar o banco de dados e rodar as migrações:
bin/setup
Com a execução desse comando as tabelas do banco de dados serão criadas. Em seguida, execute o comando para iniciar o servidor e o Sidekiq:
bundle exec sidekiq & rails s
Acesse a aplicação em http://localhost:3000
.
Com o servidor criado, execute o comando para rodar os testes:
bundle exec rspec
Os testes do backend são feitos com RSpec e após a execução, um relatório de cobertura é gerado na pasta coverage
. Acesse o arquivo index.html
para visualizar a cobertura dos testes.
A aplicação web é uma aplicação Rails que fornece as seguintes funcionalidades:
- Área deslogada onde é possível:
- Ver os posts publicados por todos os usuários ordenados do mais novo para o mais antigo.
- Fazer comentários anônimos.
- Cadastrar um novo usuário.
- Fazer login com um usuário cadastrado.
- Recuperar a senha do usuário, enviando um email com um link para redefinição da senha.
- Área logada onde é possível:
- Redigir e publicar um post.
- Fazer comentários identificados através do login.
- Editar e apagar posts já publicados pelo próprio usuário loggado.
- Editar o seu cadastro de usuário.
- Alterar a senha do usuário loggado.
- Os posts publicados têm paginação ao atingirem 3 publicações, onde o 4º post irá para a página 2 e daí em diante, ou seja, cada página tem até 3 posts.
- Internacionalização. Onde é possível mudar o idioma da aplicação para português ou inglês.
- Tags. É possível adicionar tags aos posts e filtrar os posts por tags.
- Upload de arquivo TXT para criação de um ou mais posts. O arquivo deve seguir o formato:
O arquivo deve ser enviado na página de criação de posts.
Título do post Conteúdo do post tag1, tag2, tag3 Título do post 2 Conteúdo do post 2 tag1, tag2
O Sidekiq é um serviço que processa os jobs de envio de email. Ele é utilizado para criar publicações que são enviadas através da opção 'publicar de um arquivo .txt' em segundo plano, evitando que a aplicação fique travada enquanto os posts são criados. É possível visualizar o status dos jobs em http://localhost:3000/sidekiq
com o usuário admin
e senha admin
.
O Redis é um banco de dados em memória que é utilizado pelo Sidekiq para armazenar os jobs.
O banco de dados utilizado é o PostgreSQL.
As tabelas do banco de dados foram modeladas de acordo com o diagrama de entidade-relacionamento a seguir:
Com o servidor criado, execute o script para popular o banco de dados com dados de teste:
bin/rails db:seed
A aplicação está hospedada no Render e pode ser acessada em www.pauloh.tech. O deploy não foi feito no fly.io por não ter planos gratuitos disponíveis e os meus créditos já terem sido utilizados. O render possui plano gratuito mas a aplição pode demorar 50s para responder a primeira requisição, pois o servidor é desativado por inatividade.
- Foto de perfil.
- Página de perfil do usuário.
- Visualizar posts de outros usuários.
- Apagar comentários.
- Menu lateral na homepage com tags mais utilizadas.
- Busca por conteúdo dos posts.
- Explicação sobre formato publicação via arquivo TXT.
- Adicionar CI/CD.
A aplicação foi desenvolvida utilizando TDD, onde os testes são escritos antes da implementação do código. Isso garante que a aplicação está funcionando corretamente e que novas funcionalidades não quebram as existentes. Também foi utilizado o RSpec para testes de integração e unitários. Além disso, foi utilizado o SimpleCov para gerar um relatório de cobertura de testes. Com isso, é possível visualizar a porcentagem de código coberto pelos testes. Foi utilizado o FactoryBot para criação de objetos de teste e o Faker para gerar dados aleatórios. Eles são organizados em contextos, onde cada contexto utiliza a metodologia AAA (Arrange, Act, Assert) e representa um cenário de teste autocontido para garantir a legibilidade, organização e manutenibilidade dos testes.
Foi implementada a funcionalidade de upload de arquivo TXT para criação de um ou mais posts. O arquivo deve seguir o formato:
Título do post
Conteúdo do post
tag1, tag2, tag3
Título do post 2
Conteúdo do post 2
tag1, tag2
O arquivo deve ser enviado na página de criação de posts. A funcionalidade tem o seguinte fluxo:
- O usuário acessa a página de criação de posts.
- O usuário clica no botão 'Publicar de um arquivo .txt'.
- O usuário seleciona o arquivo TXT com os posts.
- É feita a validação do arquivo e o usuário é notificado caso o arquivo não esteja no formato correto.
- É criado um job no Sidekiq para processar a criação dos posts em segundo plano.
- O usuário é recebido com uma mensagem de sucesso informando que os posts estão sendo criados.
Para testar a funcionalidade é possível utilizar o arquivo
spec/support/posts.txt
que contém 4 posts de exemplo. Caso queira testar a funcionalidade, basta enviar o arquivo na página de criação de posts. Se quiser um arquivo com mais posts, use o arquivospec/support/posts_large.txt
que contém 260 posts de exemplo.
Foi utilizado duas branches para desenvolver a aplicação: main
e prod
. Também foi utilizado o padrão de commits convencionais para facilitar a leitura do histórico de commits. A aplicação foi desenvolvida utilizando o Rails Way para seguir as convenções do framework. Foi utilizado o Rubocop para manter a consistência do código. As views foram estilizadas usando css puro para desenvolver habilidades de front-end e com isso ela pode ser acessada pelo celular que se adapta ao tamanho da tela. A aplicação foi desenvolvida com o objetivo de ser simples e funcional, sem muitas complexidades.