Skip to content

Commit 93aae3f

Browse files
authored
Merge branch 'main' into feat/protege-rotas-premium
2 parents e472719 + 449e065 commit 93aae3f

28 files changed

+333
-60
lines changed

Procfile.dev

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
web: env RUBY_DEBUG_OPEN=true bin/rails server
22
js: yarn build --watch
33
css: yarn watch:css
4+
job: bundle exec rake solid_queue:start

README.md

+14
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ O Portfoliorrr é uma rede social com funcionalidades de portfólio para pessoas
66

77
- [Informações técnicas](https://github.com/TreinaDev/td11-portfoliorrr?tab=readme-ov-file#informa%C3%A7%C3%B5es-t%C3%A9cnicas)
88
- [Como configurar a aplicação](https://github.com/TreinaDev/td11-portfoliorrr?tab=readme-ov-file#como-configurar-a-aplica%C3%A7%C3%A3o)
9+
- [Ver emails enviados em ambiente de desenvolvimento](https://github.com/TreinaDev/td11-portfoliorrr?tab=readme-ov-file#ver-emails-enviados-em-ambiente-de-desenvolvimento)
910
- [Como visualizar a aplicação no navegador](https://github.com/TreinaDev/td11-portfoliorrr?tab=readme-ov-file#como-visualizar-a-aplica%C3%A7%C3%A3o-no-navegador)
1011
- [Documentação da API](https://github.com/TreinaDev/td11-portfoliorrr?tab=readme-ov-file#documenta%C3%A7%C3%A3o-da-api)
1112

@@ -27,6 +28,19 @@ O Portfoliorrr é uma rede social com funcionalidades de portfólio para pessoas
2728
- Rode o comando `bin/dev`;
2829
- Acesse a aplicação através do endereço `http://localhost:4000/`
2930

31+
## Ver emails enviados em ambiente de desenvolvimento
32+
33+
- Siga as instruções de configuração da aplicação;
34+
- Instale localmente a gem `mailcatcher` executando o comando abaixo:
35+
```shell
36+
gem install mailcatcher
37+
```
38+
- Execute o comando abaixo para iniciar o `mailcatcher`
39+
```shell
40+
mailcatcher
41+
```
42+
- Acesse o MailCatcher através do endereço `http://localhost:1080`. Todos e-mails enviados serão mostrados nessa página, que emula uma caixa de entrada.
43+
3044
## Como rodar os testes da aplicação
3145

3246
- Siga as instruções de configuração da aplicação

api_doc.md

+1
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,7 @@ Corpo da requisição:
305305
{
306306
"invitation": {
307307
"profile_id": 3,
308+
"project_id": 5,
308309
"project_title": "Projeto Cola?Bora!",
309310
"project_description": "Projeto Legal",
310311
"project_category": "Tecnologia",

app/controllers/api/v1/invitations_controller.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def update
2121
private
2222

2323
def invite_params
24-
invitation_params = :profile_id, :project_title,
24+
invitation_params = :profile_id, :project_id, :project_title,
2525
:project_description, :project_category,
2626
:colabora_invitation_id, :message,
2727
:expiration_date

app/controllers/reports_controller.rb

+9-2
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ class ReportsController < ApplicationController
33
before_action :set_reportable_for_new, only: :new
44
before_action :set_reportable_for_create, only: :create
55
before_action :redirect_unless_published_post
6-
before_action :authorize!, only: %i[index show]
76
before_action :redirect_if_self_report, only: :create
8-
before_action :set_report, only: %i[reject show remove_content]
7+
before_action :authorize!, only: %i[index show reject remove_content remove_profile]
8+
before_action :set_report, only: %i[reject show remove_content remove_profile]
99

1010
def new
1111
set_offences
@@ -37,6 +37,13 @@ def remove_content
3737
redirect_to @report, notice: t('.success')
3838
end
3939

40+
def remove_profile
41+
@report.reportable.update removed: true
42+
@report.reportable.inactive!
43+
@report.granted!
44+
redirect_to @report, notice: t('.success')
45+
end
46+
4047
private
4148

4249
def set_reportable_for_new

app/models/invitation.rb

+7-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ class Invitation < ApplicationRecord
22
belongs_to :profile
33
has_one :notification, as: :notifiable, dependent: :destroy
44

5-
validates :profile_id, :project_title, :project_description,
5+
validates :profile_id, :project_id, :project_title, :project_description,
66
:project_category, :colabora_invitation_id, presence: true
77

88
validate :expiration_date_cannot_be_in_the_past
@@ -11,6 +11,7 @@ class Invitation < ApplicationRecord
1111

1212
after_create :set_status
1313
after_create :create_notification
14+
after_create :validate_and_approve_pending_request
1415

1516
def set_status
1617
self.status = 'pending'
@@ -31,4 +32,9 @@ def truncate_description
3132
def create_notification
3233
Notification.create(profile:, notifiable: self)
3334
end
35+
36+
def validate_and_approve_pending_request
37+
pending_invitation_request = InvitationRequest.pending.find_by(profile_id:, project_id:)
38+
pending_invitation_request&.accepted!
39+
end
3440
end

app/models/invitation_request.rb

+4
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ class InvitationRequest < ApplicationRecord
77

88
after_create :queue_request_invitation_job
99

10+
def accepted!
11+
super if pending?
12+
end
13+
1014
def process_colabora_api_response(response)
1115
response = json_treated_response(response)
1216
if response.keys.first == 'data'

app/models/user.rb

+8
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,14 @@ def delete_user_data
7878
destroy
7979
end
8080

81+
def active_for_authentication?
82+
super && !profile.removed?
83+
end
84+
85+
def inactive_message
86+
I18n.t('reports.removed_account')
87+
end
88+
8189
private
8290

8391
def subscribe_likes_mailer_job

app/services/invitation_request_service.rb

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
module InvitationRequestService
22
COLABORA_PROJECTS_URL = 'http://localhost:3000/api/v1/projects'.freeze
3+
COLABORA_INVITATIONS_BASE_URL = 'http://localhost:3000/api/v1/invitations'.freeze
34

45
class ColaboraProject
56
def self.send

app/views/invitations/index.html.erb

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@
44
<h2 class="text-center"><%= Invitation.model_name.human(count: 2) %></h2>
55

66
<div class="nav-scroller border-bottom mb-4">
7-
<nav class="d-flex nav nav-underline">
7+
<nav class="d-flex nav nav-underline">
88
<%= link_to t('all'), invitations_path, class: "nav-item col nav-link link-body-emphasis" %>
99
<%= link_to t('.pending'), invitations_path(status: :pending), class: "nav-item nav-link col link-body-emphasis #{'active' if params[:status] == 'pending'}" %>
1010
<%= link_to t('.accepted'), invitations_path(status: :accepted), class: "nav-item nav-link col link-body-emphasis #{'active' if params[:status] == 'accepted'}" %>
1111
<%= link_to t('.declined'), invitations_path(status: :declined), class: "nav-item nav-link col link-body-emphasis #{'active' if params[:status] == 'declined'}" %>
1212
<%= link_to t('.expired'), invitations_path(status: :expired), class: "nav-item nav-link col link-body-emphasis #{'active' if params[:status] == 'expired'}" %>
13+
<%= link_to t('.cancelled'), invitations_path(status: :cancelled), class: "nav-item nav-link col link-body-emphasis #{'active' if params[:status] == 'cancelled'}" %>
1314
</nav>
1415
</div>
1516

app/views/reports/show.html.erb

+17-5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
<div class="container">
2+
<%= link_to t('return_btn'), reports_path, class: 'btn btn-secondary' %>
3+
</div>
14
<div class="d-flex">
25
<div class="container d-flex flex-column w-50">
36
<div class="mt-3">
@@ -35,22 +38,31 @@
3538
<p class="card-text"><%= @report.message %></p>
3639

3740
<p class="card-subtitle mb-2 text-muted">
38-
<%= I18n.t('.reporting_profile') %>: <%= link_to @report.profile.full_name, profile_path(@report.profile) %>
41+
<%= t('.reporting_profile') %>: <%= link_to @report.profile.full_name, profile_path(@report.profile) %>
3942
</p>
4043
<% if @report.pending? %>
4144
<div class="d-flex flex-row justify-content-center mt-5 gap-5">
42-
<% unless @report.reportable.is_a? Profile %>
43-
<%= button_to t('.remove_content_btn'), remove_content_report_path(@report), class:'card-btn flex-column btn btn-danger btn-lg' %>
45+
<% if @report.reportable.is_a? Profile %>
46+
<%= button_to t('.remove_profile_btn'), remove_profile_report_path(@report),
47+
class:'card-btn flex-column btn btn-danger btn-lg',
48+
data: { turbo_confirm: t('.remove_profile_warning') } %>
49+
<% else %>
50+
<%= button_to t('.remove_content_btn'), remove_content_report_path(@report),
51+
class:'card-btn flex-column btn btn-danger btn-lg',
52+
data: { turbo_confirm: t('.remove_content_warning') } %>
4453
<% end %>
4554
<%= button_to t('.reject_btn'), reject_report_path(@report), class:'card-btn flex-column btn btn-secondary btn-lg ml-2' %>
4655
</div>
4756
<% else %>
4857
<div class="d-flex flex-row justify-content-center mt-5">
4958
<h4 class= "card-subtitle mb-2 text-dark">
50-
<%= I18n.t('reports.index.rejected') if @report.rejected? %>
59+
<%= t('reports.index.rejected') if @report.rejected? %>
5160
</h4>
5261
<h4 class= "card-subtitle mb-2 text-danger">
53-
<%= I18n.t('reports.index.granted') if @report.granted? %>
62+
<% if @report.granted? %>
63+
<%= t('.profile_removed') if @report.reportable.is_a? Profile %>
64+
<%= t('.content_removed') unless @report.reportable.is_a? Profile %>
65+
<% end %>
5466
</h4>
5567
</div>
5668
<% end %>

app/views/settings/index.html.erb

+2-2
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
<%= form_with(url: deactivate_profile_path, method: :patch) do |form| %>
2929
<%= form.submit t('.arquive_btn'),
3030
class: "btn btn-danger",
31-
data: { turbo_confirm: I18n.t('.turbo_arquive_warning') }
31+
data: { turbo_confirm: I18n.t('settings.index.turbo_arquive_warning') }
3232
%>
3333
<% end %>
3434
</div>
@@ -37,7 +37,7 @@
3737
<%= form_with(url: delete_account_path, method: :delete) do |form| %>
3838
<%= form.submit t('.delete_btn'),
3939
class: "btn btn-danger",
40-
data: { turbo_confirm: I18n.t('.turbo_delete_warning') }
40+
data: { turbo_confirm: I18n.t('settings.index.turbo_delete_warning') }
4141
%>
4242
<% end %>
4343
</div>

config/environments/development.rb

+4-2
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,12 @@
3838
config.active_storage.service = :local
3939

4040
# Don't care if the mailer can't send.
41-
config.action_mailer.raise_delivery_errors = false
4241

4342
config.action_mailer.perform_caching = false
43+
config.action_mailer.default_url_options = { host: 'localhost', port: 4000 }
44+
config.action_mailer.delivery_method = :smtp
45+
config.action_mailer.smtp_settings = { :address => '127.0.0.1', :port => 1025 }
46+
config.action_mailer.raise_delivery_errors = false
4447

4548
# Print deprecation notices to the Rails logger.
4649
config.active_support.deprecation = :log
@@ -75,7 +78,6 @@
7578
# Raise error when a before_action's only/except options reference missing actions
7679
config.action_controller.raise_on_missing_callback_actions = true
7780

78-
config.action_mailer.default_url_options = { host: 'localhost', port: 4000 }
7981

8082
# Use a real queuing backend for Active Job (and separate queues per environment).
8183
config.active_job.queue_adapter = :solid_queue

config/locales/models/invitation.pt-BR.yml

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ pt-BR:
2222
accepted: Aceitos
2323
declined: Recusados
2424
expired: Expirados
25+
cancelled: Cancelados
2526
date_error: deve ser maior que a data atual
2627
accepted_status: Aceito
2728
expired_status: Expirado

config/locales/models/reports.pt-BR.yml

+9
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ pt-BR:
1111
offence_type: Tipo de ofensa
1212
reports:
1313
report_btn: Denunciar
14+
removed_account: Sua conta foi removida pelos adminitradores
1415
create:
1516
self_report: Você não pode denunciar sí mesmo ou o próprio conteúdo.
1617
success: Sua denúncia foi registrada
@@ -21,12 +22,19 @@ pt-BR:
2122
success: Denúncia rejeitada com sucesso
2223
remove_content:
2324
success: Conteúdo removido com sucesso
25+
remove_profile:
26+
success: Perfil removido com sucesso
2427
comment:
2528
see_post: Ver publicação
2629
show:
2730
reporting_profile: Denunciado por
2831
reject_btn: Rejeitar denúncia
2932
remove_content_btn: Remover conteúdo
33+
remove_profile_btn: Remover perfil
34+
remove_profile_warning: O usuário perderá o acesso à conta dele permanentemente. Tem certeza que deseja continuar?
35+
remove_content_warning: Esse conteúdo será deletado. Tem certeza que deseja continuar?
36+
profile_removed: Perfil removido
37+
content_removed: Conteúdo removido
3038
index:
3139
pending: Pendente
3240
granted: Conteúdo removido
@@ -43,3 +51,4 @@ pt-BR:
4351
spam: Spam
4452
disturbin_content: Conteúdo pertubador
4553
harassment: Abuso/Perseguição
54+

config/routes.rb

+5-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,11 @@
2424
resources :subscriptions, only: %i[index update]
2525

2626
resources :reports, only: %i[index new create show] do
27-
post 'reject', 'remove_content', on: :member
27+
member do
28+
post 'reject'
29+
post 'remove_content'
30+
post 'remove_profile'
31+
end
2832
end
2933

3034
resources :posts, only: %i[] do
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class AddProjectIdToInvitations < ActiveRecord::Migration[7.1]
2+
def change
3+
add_column :invitations, :project_id, :integer, null: false
4+
end
5+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class AddRemovedToProfile < ActiveRecord::Migration[7.1]
2+
def change
3+
add_column :profiles, :removed, :boolean, default: false
4+
end
5+
end

db/schema.rb

+4-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

spec/factories/invitations.rb

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
FactoryBot.define do
22
factory :invitation do
33
profile
4+
project_id { 1 }
45
project_title { 'Projeto Cola?Bora!' }
56
project_description { 'Um projeto muito legal' }
67
project_category { 'Ruby on Rails' }

spec/models/invitation_request_spec.rb

+46
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,50 @@
1818
expect(successful_request).to be_valid
1919
end
2020
end
21+
22+
describe '#accepted!' do
23+
it 'muda o status para accepted quando o atual é pending' do
24+
invitation_request = create(:invitation_request, status: :pending)
25+
26+
invitation_request.accepted!
27+
28+
expect(invitation_request.reload.status).to eq 'accepted'
29+
end
30+
31+
it 'não muda o status para accepted quando o atual é processing' do
32+
invitation_request = create(:invitation_request, status: :processing)
33+
34+
invitation_request.accepted!
35+
36+
expect(invitation_request.reload.status).not_to eq 'accepted'
37+
expect(invitation_request.status).to eq 'processing'
38+
end
39+
40+
it 'não muda o status para accepted quando o atual é refused' do
41+
invitation_request = create(:invitation_request, status: :refused)
42+
43+
invitation_request.accepted!
44+
45+
expect(invitation_request.reload.status).not_to eq 'accepted'
46+
expect(invitation_request.status).to eq 'refused'
47+
end
48+
49+
it 'não muda o status para accepted quando o atual é error' do
50+
invitation_request = create(:invitation_request, status: :error)
51+
52+
invitation_request.accepted!
53+
54+
expect(invitation_request.reload.status).not_to eq 'accepted'
55+
expect(invitation_request.status).to eq 'error'
56+
end
57+
58+
it 'não muda o status para accepted quando o atual é aborted' do
59+
invitation_request = create(:invitation_request, status: :aborted)
60+
61+
invitation_request.accepted!
62+
63+
expect(invitation_request.reload.status).not_to eq 'accepted'
64+
expect(invitation_request.status).to eq 'aborted'
65+
end
66+
end
2167
end

0 commit comments

Comments
 (0)