Sha256: 2a148fa9a52350ead793d0715ef8f3b4a55442fc604ecbeeb1633e47a8aa7a4b

Contents?: true

Size: 1.83 KB

Versions: 1

Compression:

Stored size: 1.83 KB

Contents

# frozen_string_literals: true

require "aws-sdk-s3"
require "mail"
require "shoryuken"

module Jobshop
  module Mailroom
    # Jobshop::Mailroom::Postmaster
    #
    # Reponsible for processing incoming email and dispatching it to its handler.
    class Postmaster
      include Shoryuken::Worker

      shoryuken_options queue: Jobshop.configuration.aws.incoming_email_queue

      def perform(sqs_msg, *)
        @event = S3EventMessage.new(sqs_msg.body) || return
        tempfile = Tempfile.new
        s3.get_object({ bucket: @event.bucket, key: @event.key }, target: tempfile)
        message = Mail.new(File.read(tempfile))
        handler = Mailman.handler_for(message)

        if handler.process
          copy_to(handler.archive_prefix)
          delete_original
          sqs_msg.delete
        end

      ensure
        @event = nil
        tempfile.close
        tempfile.unlink
      end

      def s3
        @s3 ||= Aws::S3::Client.new
      end

      def copy_to(prefix)
        key = prefix + "/" + @event.key.split("/").last

        s3.copy_object({
          copy_source: @event.bucket + "/" + @event.key,
          bucket: Jobshop.configuration.aws.s3_bucket,
          key: key
        }) || raise("Could not copy incoming rfq to processed folder")
      end

      def delete_original
        s3.delete_object({
          bucket: @event.bucket, key: @event.key
        }) || raise("Could not delete original email")
      end

      class S3EventMessage
        def initialize(message)
          @message = JSON.parse(message)

          return false unless records
        end

        def records
          @records ||= @message["Records"] || []
        end

        def bucket
          records.first.dig "s3", "bucket", "name"
        end

        def key
          records.first.dig "s3", "object", "key"
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
jobshop-0.0.167 lib/jobshop/mailroom/postmaster.rb