crowdAI/crowdai

View on GitHub
app/mailers/email_digest_mailer.rb

Summary

Maintainability
A
35 mins
Test Coverage
class EmailDigestMailer < ApplicationMailer

  def sendmail(participant_id,digest_type)
    participant = Participant.find(participant_id)

    start_dttm = set_start_dttm(digest_type)
    comments = comments(participant,start_dttm)
    submissions = submissions(participant,start_dttm)
    topics = topics(participant,start_dttm)
    unless participant.admin?
      return if comments.blank? && submissions.blank? && topics.blank?
    end

    subject = build_subject(digest_type)
    body = build_body(
      participant,
      digest_type,
      comments,
      submissions,
      topics)
    options = format_options(participant,subject,body)

    @model_id = nil
    mandrill_send(options)
  end

  def set_start_dttm(digest_type)
    start_dttm = Time.now - 24.hours if digest_type == 'daily'
    start_dttm = Time.now - 7.days if digest_type == 'weekly'
    return start_dttm
  end

  def build_subject(digest_type)
    "[crowdAI] #{digest_type.capitalize} digest"
  end

  def build_body(participant,digest_type,comments,submissions,topics)
    body = body_header(digest_type) << '<br/>'
    if participant.admin?
      body << render_sign_ups
    end
    body << render_comments(comments) << '<br/>'
    body << render_submissions(submissions) << '<br/>'
    body << render_topics(topics) << '<br/>'
    return "<div>#{body}</div>"
  end

  def body_header(digest_type)
    "<div>Here's a #{digest_type} summary of activity in crowdAI.</div>"
  end

  def topics(participant,start_dttm)
    topic_ids = TopicsDigestQuery.new(participant,start_dttm).call
    topics = Topic.where(id: topic_ids).order('created_at DESC')
  end

  def comments(participant,start_dttm)
    comment_ids = CommentsDigestQuery.new(participant,start_dttm).call
    comments = Comment.where(id: comment_ids).order('created_at DESC')
  end

  def submissions(participant,start_dttm)
    return Submission.none if !participant.admin?
    submissions = Submission.where('created_at >= ?',start_dttm).order('created_at DESC')
  end

  def render_sign_ups
    sign_ups = ParticipantSignUpsQuery.new.call
    body = render(partial: 'mailers/sign_ups', locals: { sign_ups: sign_ups })
    return body
  end

  def render_topics(topics)
    if topics.any?
      body = render(partial: "mailers/topics_digest", locals: { comments: comments })
    else
      body = "<span></span>"
    end
    return body
  end

  def render_comments(comments)
    if comments.any?
      body = render(partial: "mailers/comments_digest", locals: { comments: comments })
    else
      body = "<span></span>"
    end
    return body
  end

  def render_submissions(submissions)
    if submissions.any?
      body = render(partial: "mailers/submissions_digest", locals: { submission: submissions })
    else
      body = "<span></span>"
    end
    return body
  end

  def format_options(participant,subject,body)
    options = {
      participant_id:   participant.id,
      subject:          subject,
      to:               participant.email,
      template:         "crowdAI Email Digest Template",
      global_merge_vars: [
        {
          name:           "NAME",
          content:        "#{participant.name}"
        },
        {
          name:           "BODY",
          content:        body
        },
        { name:           'EMAIL_PREFERENCES_LINK',
          content:        EmailPreferencesTokenService
                            .new(participant)
                            .email_preferences_link }
      ]
    }
  end

end