From ac486ee6f39d30030113c64105aec31432da81a3 Mon Sep 17 00:00:00 2001 From: Sai Pavan Marlakunta <34048837+smarlaku820@users.noreply.github.com> Date: Tue, 30 May 2023 04:59:28 +0530 Subject: [PATCH] Enabling SMTP feature to send emails via ActionMailer (#584) * Enabling SMTP feature to send emails via ActionMailer * fixing rubocop offenses - TrailingEmptyLines * Linting Issues on .Vue files * SMTP controller logic modified to welcome project,component users; Created Instance Variables to Avoid DB Model access from views * Removed project reference as this is related to a component * reduced db round trips --------- Co-authored-by: Sai Pavan Marlakunta --- app/controllers/application_controller.rb | 9 ++ app/controllers/memberships_controller.rb | 2 + app/controllers/reviews_controller.rb | 15 +- .../components/rules/RuleEditorHeader.vue | 2 +- app/mailers/user_mailer.rb | 128 ++++++++++++++++++ app/views/user_mailer/_shared_styles.html.erb | 44 ++++++ app/views/user_mailer/approve_review.html.erb | 21 +++ app/views/user_mailer/request_review.html.erb | 21 +++ .../request_review_changes.html.erb | 21 +++ app/views/user_mailer/revoke_review.html.erb | 21 +++ .../welcome_component_member.html.erb | 18 +++ .../welcome_project_member.html.erb | 18 +++ config/initializers/smtp_settings.rb | 2 + 13 files changed, 319 insertions(+), 3 deletions(-) create mode 100644 app/mailers/user_mailer.rb create mode 100644 app/views/user_mailer/_shared_styles.html.erb create mode 100644 app/views/user_mailer/approve_review.html.erb create mode 100644 app/views/user_mailer/request_review.html.erb create mode 100644 app/views/user_mailer/request_review_changes.html.erb create mode 100644 app/views/user_mailer/revoke_review.html.erb create mode 100644 app/views/user_mailer/welcome_component_member.html.erb create mode 100644 app/views/user_mailer/welcome_project_member.html.erb diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 5709b900..5789c0bd 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -104,6 +104,15 @@ def slack_notification_params(notification_type, object) } end + def send_smtp_notification(mailer, action, *args) + mailer.request_review(*args).deliver_now if action == 'request_review' + mailer.approve_review(*args).deliver_now if action == 'approve' + mailer.revoke_review(*args).deliver_now if action == 'revoke_review_request' + mailer.request_review_changes(*args).deliver_now if action == 'request_changes' + mailer.welcome_project_member(*args).deliver_now if action == 'project_user' + mailer.welcome_component_member(*args).deliver_now if action == 'component_user' + end + private def helpful_errors(exception) diff --git a/app/controllers/memberships_controller.rb b/app/controllers/memberships_controller.rb index e545bedb..070b2f44 100644 --- a/app/controllers/memberships_controller.rb +++ b/app/controllers/memberships_controller.rb @@ -30,8 +30,10 @@ def create flash.notice = 'Successfully created membership.' case membership.membership_type when 'Project' + send_smtp_notification(UserMailer, 'project_user', current_user, membership) if Settings.smtp.enabled send_membership_notification(:create_project_membership, membership) when 'Component' + send_smtp_notification(UserMailer, 'component_user', current_user, membership) if Settings.smtp.enabled send_membership_notification(:create_component_membership, membership) end redirect_to membership.membership diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 4fa771b3..946e5ed5 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -10,8 +10,19 @@ class ReviewsController < ApplicationController before_action :authorize_author_project def create - review = Review.new(review_params.merge({ user: current_user, rule: @rule })) + review_params_without_component_id = review_params.except('component_id') + review = Review.new(review_params_without_component_id.merge({ user: current_user, rule: @rule })) if review.save + if Settings.smtp.enabled + send_smtp_notification( + UserMailer, + review_params[:action], + current_user, + review_params[:component_id], + review_params[:comment], + @rule + ) + end render json: { toast: 'Successfully added review.' } else render json: { @@ -81,6 +92,6 @@ def set_project end def review_params - params.require(:review).permit(:action, :comment) + params.require(:review).permit(:component_id, :action, :comment) end end diff --git a/app/javascript/components/rules/RuleEditorHeader.vue b/app/javascript/components/rules/RuleEditorHeader.vue index 34c6734e..390e62b3 100644 --- a/app/javascript/components/rules/RuleEditorHeader.vue +++ b/app/javascript/components/rules/RuleEditorHeader.vue @@ -163,7 +163,6 @@ required /> - e + Rails.logger.error("Error delivering welcome email to user #{@user.name}: #{e.message}") + end + end + + def welcome_component_member(*args) + parse_mailer_welcome_user_args(*args) + begin + mail( + to: @user.email, + cc: @project_admins, + subject: "Vulcan Component Access - #{@component.name}", + from: Settings.smtp.settings.user_name + ) + rescue StandardError => e + Rails.logger.error("Error delivering welcome email to user #{@user.name}: #{e.message}") + end + end + + def request_review(*args) + parse_mailer_review_args(*args) + begin + mail( + to: @project_admins, + cc: @current_user.email, + subject: "Review Requested - #{@stig_id}", + from: Settings.smtp.settings.user_name + ) + rescue StandardError => e + Rails.logger.error("Error delivering request_review by user #{@current_user.name}: #{e.message}") + end + end + + def approve_review(*args) + parse_mailer_review_args(*args) + @latest_review_user = find_latest_request_review(@rule, @component_id) + begin + mail( + to: @latest_review_user.email, + cc: @project_admins, + subject: "Review Approved - #{@stig_id}", + from: Settings.smtp.settings.user_name + ) + rescue StandardError => e + Rails.logger.error("Error delivering approve_review by user #{@current_user.name}: #{e.message}") + end + end + + def revoke_review(*args) + parse_mailer_review_args(*args) + @latest_review_user = find_latest_request_review(@rule, @component_id) + begin + mail( + to: @latest_review_user.email, + cc: @project_admins, + subject: "Review Revoked - #{@stig_id}", + from: Settings.smtp.settings.user_name + ) + rescue StandardError => e + Rails.logger.error("Error delivering revoke_review_request by user #{@current_user.name}: #{e.message}") + end + end + + def request_review_changes(*args) + parse_mailer_review_args(*args) + @latest_review_user = find_latest_request_review(@rule, @component_id) + begin + mail( + to: @latest_review_user.email, + cc: @project_admins, + subject: "Requesting Changes on the Review - #{@stig_id}", + from: Settings.smtp.settings.user_name + ) + rescue StandardError => e + Rails.logger.error("Error delivering request_review_changes by user #{@current_user.name}: #{e.message}") + end + end + + private + + def get_project_admins(project_id) + Project.find(project_id).users.where(memberships: { role: 'admin' }).pluck(:email) + end + + def parse_mailer_review_args(*args) + @current_user, @component_id, @comment, @rule = args + @stig_id = "#{Component.find(@component_id).prefix}-#{@rule.rule_id}" + @project_id = Component.find(@component_id).project.id + @project_admins = get_project_admins(@project_id) + end + + def parse_mailer_welcome_user_args(*args) + @current_user, @membership = args + case @membership.membership_type + when 'Project' + @project_id = @membership.membership_id + @project = Project.find(@project_id) + when 'Component' + @component_id = @membership.membership_id + @component = Component.find(@component_id) + @project_id = @component.project_id + end + @project_admins = get_project_admins(@project_id) + @user = User.find(@membership.user_id) + @role_assigned = @membership.role.to_s + end + + def find_latest_request_review(rule, component_id) + latest_review = Review.where( + rule_id: Rule.find_by(rule_id: rule.rule_id.to_s, component_id: component_id).id, + action: 'request_review' + ).order(updated_at: :desc).first + latest_review.user + end +end diff --git a/app/views/user_mailer/_shared_styles.html.erb b/app/views/user_mailer/_shared_styles.html.erb new file mode 100644 index 00000000..543aeff3 --- /dev/null +++ b/app/views/user_mailer/_shared_styles.html.erb @@ -0,0 +1,44 @@ + + + + + diff --git a/app/views/user_mailer/approve_review.html.erb b/app/views/user_mailer/approve_review.html.erb new file mode 100644 index 00000000..10bc244f --- /dev/null +++ b/app/views/user_mailer/approve_review.html.erb @@ -0,0 +1,21 @@ + + + <%= render 'user_mailer/shared_styles' %> + +

Hi <%=@latest_review_user.name %>,

+ <% if Settings.app_url.present? %> +

<%= @current_user.name %> approved review on <%= link_to @stig_id, "#{Settings.app_url}/components/#{@component_id}/#{@stig_id}" %> .

+ <% else %> +

<%= @current_user.name %> approved review on <%= @stig_id %>.

+ <% end %> +

The approved comments are:

+
+ <%= @comment %> +
+
+
+

Thank you,

+

Vulcan Support

+ + + diff --git a/app/views/user_mailer/request_review.html.erb b/app/views/user_mailer/request_review.html.erb new file mode 100644 index 00000000..5ea8bb5e --- /dev/null +++ b/app/views/user_mailer/request_review.html.erb @@ -0,0 +1,21 @@ + + + <%= render 'user_mailer/shared_styles' %> + +

Hello ProjectAdmins,

+ <% if Settings.app_url.present? %> +

<%= @current_user.name %> requested review on <%= link_to @stig_id, "#{Settings.app_url}/components/#{@component_id}/#{@stig_id}" %> .

+ <% else %> +

<%= @current_user.name %> requested review on <%= @stig_id %>.

+ <% end %> +

The review comment is:

+
+ <%= @comment %> +
+
+
+

Thank you,

+

Vulcan Support

+ + + diff --git a/app/views/user_mailer/request_review_changes.html.erb b/app/views/user_mailer/request_review_changes.html.erb new file mode 100644 index 00000000..8a437fe2 --- /dev/null +++ b/app/views/user_mailer/request_review_changes.html.erb @@ -0,0 +1,21 @@ + + + <%= render 'user_mailer/shared_styles' %> + +

Hi <%=@latest_review_user.name %>,

+ <% if Settings.app_url.present? %> +

<%= @current_user.name %> requested changes on the review <%= link_to @stig_id, "#{Settings.app_url}/components/#{@component_id}/#{@stig_id}" %> .

+ <% else %> +

<%= @current_user.name %> requested changes on the review <%= @stig_id %>.

+ <% end %> +

The comments are:

+
+ <%= @comment %> +
+
+
+

Thank you,

+

Vulcan Support

+ + + diff --git a/app/views/user_mailer/revoke_review.html.erb b/app/views/user_mailer/revoke_review.html.erb new file mode 100644 index 00000000..87e9bfc9 --- /dev/null +++ b/app/views/user_mailer/revoke_review.html.erb @@ -0,0 +1,21 @@ + + + <%= render 'user_mailer/shared_styles' %> + +

Hi <%=@latest_review_user.name %>,

+ <% if Settings.app_url.present? %> +

<%= @current_user.name %> revoked review on <%= link_to @stig_id, "#{Settings.app_url}/components/#{@component_id}/#{@stig_id}" %> .

+ <% else %> +

<%= @current_user.name %> revoked review on <%= @stig_id %>.

+ <% end %> +

The revoked comments are:

+
+ <%= @comment %> +
+
+
+

Thank you,

+

Vulcan Support

+ + + diff --git a/app/views/user_mailer/welcome_component_member.html.erb b/app/views/user_mailer/welcome_component_member.html.erb new file mode 100644 index 00000000..abf9f01a --- /dev/null +++ b/app/views/user_mailer/welcome_component_member.html.erb @@ -0,0 +1,18 @@ + + + <%= render 'user_mailer/shared_styles' %> + +

Vulcan Component Access

+

Hi <%= @user.name %>,

+

You have been added to the <%= @role_assigned %> role in the <%= @component.name %> component.

+ <% if Settings.app_url.present? %> +

You can access the component at <%= link_to @component.name, "#{Settings.app_url}/components/#{@component_id}" %> .

+ <% else %> +

You can access the component "<%= @component.name %>".

+ <% end %> +
+
+

Thank you,

+

Vulcan Support

+ + diff --git a/app/views/user_mailer/welcome_project_member.html.erb b/app/views/user_mailer/welcome_project_member.html.erb new file mode 100644 index 00000000..09d11ef5 --- /dev/null +++ b/app/views/user_mailer/welcome_project_member.html.erb @@ -0,0 +1,18 @@ + + + <%= render 'user_mailer/shared_styles' %> + +

Vulcan Project Access

+

Hi <%= @user.name %>,

+

You have been added to the <%= @role_assigned %> role in the <%= @project.name %> project.

+ <% if Settings.app_url.present? %> +

You can access the project at <%= link_to @project.name, "#{Settings.app_url}/projects/#{@project_id}" %> .

+ <% else %> +

You can access the project "<%= @project.name %>".

+ <% end %> +
+
+

Thank you,

+

Vulcan Support

+ + diff --git a/config/initializers/smtp_settings.rb b/config/initializers/smtp_settings.rb index 6e72e88d..e6eb594b 100644 --- a/config/initializers/smtp_settings.rb +++ b/config/initializers/smtp_settings.rb @@ -6,6 +6,8 @@ if Rails.env.production? && Settings.smtp.enabled Rails.application.config.action_mailer.delivery_method = :smtp + Rails.application.config.action_mailer.perform_deliveries = true + Rails.application.config.action_mailer.raise_delivery_errors = true ActionMailer::Base.delivery_method = :smtp ActionMailer::Base.smtp_settings = Settings.smtp.settings.transform_keys(&:to_sym)