diff --git a/app/controllers/collections_controller.rb b/app/controllers/collections_controller.rb index 5a9afb47d..9a3371798 100644 --- a/app/controllers/collections_controller.rb +++ b/app/controllers/collections_controller.rb @@ -115,8 +115,7 @@ def leave def share_message user = User.find_by(email: params[:user]) - text = t('collections.share_message.text', user: current_user.name, collection: @collection.title, locale: :en) - Message.new(sender: current_user, recipient: user, param_type: 'collection', param_id: @collection.id, text:) + Message.new(sender: current_user, recipient: user, param_type: 'collection', param_id: @collection.id) end def push_exercises diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index 9921d7396..d91d2040e 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -61,7 +61,7 @@ def leave def request_access flash[:notice] = t('.success_notice') @group.admins.each do |admin| - send_access_request_message(admin, @group) + send_message(admin, :group_requested) AccessRequestMailer.send_access_request(current_user, admin, @group).deliver_now end @@ -77,7 +77,7 @@ def remove_task def grant_access @group.grant_access(@user) - send_grant_access_messages(@user, @group) + send_message(@user, :group_accepted) Message.where(sender: @user, recipient: current_user, param_type: 'group', param_id: @group.id).destroy_all redirect_to @group, notice: t('.success_notice') @@ -90,7 +90,7 @@ def delete_from_group def deny_access @group.users.delete(@user) - send_deny_access_message(@user, @group) + send_message(@user, :group_declined) Message.where(sender: @user, recipient: current_user, param_type: 'group', param_id: @group.id).destroy_all redirect_to @group, notice: t('.success_notice') @@ -108,30 +108,12 @@ def demote_admin private - def send_access_request_message(admin, group) + # type is one of [group_requested, group_accepted, group_declined] + def send_message(recipient, type) Message.create(sender: current_user, - recipient: admin, - text: t('groups.send_access_request_message.message', user: current_user.name, group: group.name), - param_type: 'group', - param_id: group.id, - sender_status: 'd') - end - - def send_deny_access_message(user, group) - Message.create(sender: current_user, - recipient: user, - text: t('groups.send_deny_access_message.message', user: current_user.name, group: group.name), - param_type: 'group_declined', - param_id: group.id, - sender_status: 'd') - end - - def send_grant_access_messages(user, group) - Message.create(sender: current_user, - recipient: user, - text: t('groups.send_grant_access_messages.message', user: current_user.name, group: group.name), - param_type: 'group_accepted', - param_id: group.id, + recipient:, + param_type: type, + param_id: @group.id, sender_status: 'd') end diff --git a/app/models/message.rb b/app/models/message.rb index c3b48dfca..726b1db73 100644 --- a/app/models/message.rb +++ b/app/models/message.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class Message < ApplicationRecord - validates :text, presence: true + validates :text, presence: true, unless: -> { %w[group_requested group_accepted group_declined collection].include?(param_type) } belongs_to :sender, class_name: 'User', inverse_of: :sent_messages belongs_to :recipient, class_name: 'User', inverse_of: :received_messages @@ -18,7 +18,7 @@ def mark_as_deleted(user) def text # rubocop:disable Metrics/AbcSize case param_type - when 'group' + when 'group_requested' I18n.t('groups.send_access_request_message.message', user: sender.name, group: Group.find(param_id).name) when 'group_accepted' I18n.t('groups.send_grant_access_messages.message', user: sender.name, group: Group.find(param_id).name) diff --git a/app/views/access_request_mailer/send_access_request.html.erb b/app/views/access_request_mailer/send_access_request.html.erb index 27e0abfec..c35034620 100644 --- a/app/views/access_request_mailer/send_access_request.html.erb +++ b/app/views/access_request_mailer/send_access_request.html.erb @@ -4,13 +4,13 @@ -

Hello <%= @admin.name %>

+

<%= t('groups.access_request_mailer.greeting', user: @admin.name) %>

- <%= @user.name %> asked to join your group "<%= @group.name %>"
- If you want to give your permission click on the link below.
- Otherwise ignore this Email.
+ <%= t('groups.access_request_mailer.message_line1', user: @user.name, group: @group.name) %>
+ <%= t('groups.access_request_mailer.message_line2') %>
+ <%= t('groups.access_request_mailer.message_line3') %>

- <%= link_to 'Confirm Request', group_url(@group)%> + <%= link_to t('groups.access_request_mailer.confirm_request'), group_url(@group)%>

diff --git a/app/views/access_request_mailer/send_access_request.text.erb b/app/views/access_request_mailer/send_access_request.text.erb index e4bb5334b..c71717b1e 100644 --- a/app/views/access_request_mailer/send_access_request.text.erb +++ b/app/views/access_request_mailer/send_access_request.text.erb @@ -1,6 +1,6 @@ -Hello <%= @admin.name %> +<%= t('groups.access_request_mailer.greeting', user: @admin.name) %> -<%= @user.name %> asked to join your group "<%= @group.name %>" -If you want to give your permission click on the link below. -Otherwise ignore this Email. +<%= t('groups.access_request_mailer.message_line1', user: @user.name, group: @group.name) %> +<%= t('groups.access_request_mailer.message_line2') %> +<%= t('groups.access_request_mailer.message_line3') %> <%= group_url(@group)%> diff --git a/app/views/access_request_mailer/send_contribution_request.html.erb b/app/views/access_request_mailer/send_contribution_request.html.erb index 6c852d408..4f1c06d04 100644 --- a/app/views/access_request_mailer/send_contribution_request.html.erb +++ b/app/views/access_request_mailer/send_contribution_request.html.erb @@ -4,13 +4,13 @@ -

Hello <%= @author.name %>

+

<%= t('tasks.access_request_mailer.greeting', user: @author.name) %>

- <%= @user.name %> asked to contribute to your Exercise "<%= @exercise.title %>". - If you want to make him a co-author or suggest Membership to a group click the link below. - Otherwise ignore this Email.
+ <%= t('tasks.access_request_mailer.message_line1', user: @user.name, task: @exercise.title) %>
+ <%= t('tasks.access_request_mailer.message_line2') %>
+ <%= t('tasks.access_request_mailer.message_line3') %>

- <%= link_to 'CodeHarbor', user_messages_url(@author)%> + <%= link_to t('common.app_name'), user_messages_url(@author)%>

diff --git a/app/views/access_request_mailer/send_contribution_request.text.erb b/app/views/access_request_mailer/send_contribution_request.text.erb index 4ce8ac114..0afe92e51 100644 --- a/app/views/access_request_mailer/send_contribution_request.text.erb +++ b/app/views/access_request_mailer/send_contribution_request.text.erb @@ -1,6 +1,7 @@ -Hello <%= @author.name %> +<%= t('tasks.access_request_mailer.greeting', user: @author.name) %> + +<%= t('tasks.access_request_mailer.message_line1', user: @user.name, task: @exercise.title) %> +<%= t('tasks.access_request_mailer.message_line2') %> +<%= t('tasks.access_request_mailer.message_line3') %> -<%= @user.name %> asked to contribute to your Exercise "<%= @exercise.title %>". -If you want to make him a co-author or suggest Membership to a group click the link below. -Otherwise ignore this Email. <%= user_messages_url(@author) %> diff --git a/config/locales/de/common.yml b/config/locales/de/common.yml index fd67167d0..9ae82f44f 100644 --- a/config/locales/de/common.yml +++ b/config/locales/de/common.yml @@ -1,6 +1,7 @@ --- de: common: + app_name: CodeHarbor button: abort: Abbrechen back: Zurück diff --git a/config/locales/de/views/groups.yml b/config/locales/de/views/groups.yml index 1bc064602..5f8827b93 100644 --- a/config/locales/de/views/groups.yml +++ b/config/locales/de/views/groups.yml @@ -1,6 +1,13 @@ --- de: groups: + access_request_mailer: + confirm_request: Anfrage annehmen + greeting: Hallo %{user} + message_line1: '%{user} möchte Ihrer Gruppe "%{group}" beitreten.' + message_line2: Sie können sie/ihn beitreten lassen, indem Sie auf den Link unten klicken. + message_line3: Ansonsten können Sie diese E-Mail ignorieren. + subject: '%{user} möchte Ihrer Grupper "%{group}" beitreten' form: button: save: Gruppe speichern diff --git a/config/locales/de/views/tasks.yml b/config/locales/de/views/tasks.yml index 86ba6d882..4772406ba 100644 --- a/config/locales/de/views/tasks.yml +++ b/config/locales/de/views/tasks.yml @@ -1,6 +1,12 @@ --- de: tasks: + access_request_mailer: + greeting: Hallo %{user} + message_line1: '%{user} möchte an Ihrer Aufgabe "%{task}" mitarbeiten.' + message_line2: Wenn Sie den/die Benutzer:in zum/zur Co-Autor:in ernennen oder in eine Gruppe einladen möchten, klicken Sie auf den Link unten. + message_line3: Ansonsten können Sie diese E-Mail ignorieren. + subject: '%{user} möchte an Ihrer Aufgabe "%{task}" mitarbeiten.' editor: button: extract_text: Text extrahieren diff --git a/config/locales/en/common.yml b/config/locales/en/common.yml index 1c2284d0b..c22288721 100644 --- a/config/locales/en/common.yml +++ b/config/locales/en/common.yml @@ -1,6 +1,7 @@ --- en: common: + app_name: CodeHarbor button: abort: Abort back: Back diff --git a/config/locales/en/views/groups.yml b/config/locales/en/views/groups.yml index 2690e7086..39e2d6b3f 100644 --- a/config/locales/en/views/groups.yml +++ b/config/locales/en/views/groups.yml @@ -1,6 +1,13 @@ --- en: groups: + access_request_mailer: + confirm_request: Confirm Request + greeting: Hello %{user} + message_line1: '%{user} asked to join your group "%{group}".' + message_line2: If you want to give your permission click on the link below. + message_line3: Otherwise ignore this Email. + subject: '%{user} wants to access your Group "%{group}"' form: button: save: Save Group diff --git a/config/locales/en/views/tasks.yml b/config/locales/en/views/tasks.yml index 14dc2c520..d87443a93 100644 --- a/config/locales/en/views/tasks.yml +++ b/config/locales/en/views/tasks.yml @@ -1,6 +1,12 @@ --- en: tasks: + access_request_mailer: + greeting: Hello %{user} + message_line1: '%{user} asked to contribute to your task "%{task}".' + message_line2: If you want to make them a co-author or suggest Membership to a group click the link below. + message_line3: Otherwise ignore this Email. + subject: '%{user} wants to contribute to your task "%{task}"' editor: button: extract_text: Extract text diff --git a/spec/controllers/groups_controller_spec.rb b/spec/controllers/groups_controller_spec.rb index 5d466bbda..d9481e439 100644 --- a/spec/controllers/groups_controller_spec.rb +++ b/spec/controllers/groups_controller_spec.rb @@ -5,7 +5,11 @@ RSpec.describe GroupsController do render_views - let(:user) { create(:user) } + let(:user) { create(:user, preferred_locale: user_locale) } + let(:group_admin) { create(:user, preferred_locale: admin_locale) } + + let(:user_locale) { :en } + let(:admin_locale) { :de } let(:valid_post_attributes) do attributes_for(:group, users: [user]) @@ -14,7 +18,7 @@ let(:invalid_attributes) do {name: ''} end - let(:group_memberships) { [build(:group_membership, :with_admin), build(:group_membership, user:)] } + let(:group_memberships) { [build(:group_membership, :with_admin, user: group_admin), build(:group_membership, user:)] } let!(:group) { create(:group, group_memberships:) } before { sign_in user } @@ -156,4 +160,62 @@ end end end + + describe 'POST #request_access' do + subject(:post_request) { post :request_access, params: {id: group.to_param} } + + let(:group_memberships) { [build(:group_membership, :with_admin, user: group_admin)] } + + it 'translates access request message into correct language for recipient' do + post_request + expect(I18n.with_locale(admin_locale) { group_admin.received_messages.find_by(param_type: 'group_requested').text }).to eq(I18n.t('groups.send_access_request_message.message', user: user.name, group: group.name, locale: admin_locale)) + end + + it 'sends mail in correct language for recipient' do + post_request + expect(ActionMailer::Base.deliveries.last.body.parts.first.body).to include(I18n.t('groups.access_request_mailer.message_line2', locale: admin_locale)) + end + end + + describe 'POST #grant_access' do + subject(:post_request) { post :grant_access, params: {id: group.to_param, user:} } + + let(:group_memberships) { [build(:group_membership, :with_admin, user: group_admin)] } + + before do + post :request_access, params: {id: group.to_param} + sign_in group_admin + end + + it 'adds user to group' do + post_request + expect(group.users).to include(user) + end + + it 'translates access granted message into correct language for recipient' do + post_request + expect(I18n.with_locale(user_locale) { user.received_messages.find_by(param_type: 'group_accepted').text }).to eq(I18n.t('groups.send_grant_access_messages.message', user: group_admin.name, group: group.name, locale: user_locale)) + end + end + + describe 'POST #deny_access' do + subject(:post_request) { post :deny_access, params: {id: group.to_param, user:} } + + let(:group_memberships) { [build(:group_membership, :with_admin, user: group_admin)] } + + before do + post :request_access, params: {id: group.to_param} + sign_in group_admin + end + + it 'does not add user to group' do + post_request + expect(group.users).not_to include(user) + end + + it 'translates access denied message into correct language for recipient' do + post_request + expect(I18n.with_locale(user_locale) { user.received_messages.find_by(param_type: 'group_declined').text }).to eq(I18n.t('groups.send_deny_access_message.message', user: group_admin.name, group: group.name, locale: user_locale)) + end + end end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index d99adb3a8..67ceb32df 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -120,7 +120,7 @@ context 'when message has type exercise', pending: 'messages and sharing permissions need to be reworked' do before do create(:message, sender: user, param_type: 'exercise') - create(:message, sender: user, param_type: 'group') + create(:message, sender: user, param_type: 'group_requested') create(:message, sender: user, param_type: 'collection') end