zammad/zammad

View on GitHub
lib/notification_factory.rb

Summary

Maintainability
A
0 mins
Test Coverage
# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/

module NotificationFactory
  TEMPLATE_PATH_STRING = Rails.root.join('app/views/%{type}/%{template}/%{filename}').to_s.freeze
  APPLICATION_TEMPLATE_PATH_STRING = Rails.root.join('app/views/%{type}/application.%{format}.erb').to_s.freeze

=begin

  result = NotificationFactory.template_read(
    template: 'password_reset',
    locale: 'en-us',
    format: 'html',
    type: 'mailer',
  )

or

  result = NotificationFactory.template_read(
    template: 'ticket_update',
    locale: 'en-us',
    format: 'md',
    type: 'messaging',
  )

returns

  {
    subject: 'some subject',
    body: 'some body',
  }

=end

  class FileNotFoundError < StandardError; end

  def self.template_read(data)
    template_path = template_path(data)

    template = File.readlines(template_path)

    { subject: template.shift, body: template.join }
  end

  def self.template_path(data)
    candidates = template_filenames(data)
      .map { |filename| data.merge(filename: filename) }
      .map { |data_hash| TEMPLATE_PATH_STRING % data_hash }

    found = candidates.find { |candidate| File.exist?(candidate) }

    raise FileNotFoundError, "Missing template files #{candidates}!" if !found

    found
  end
  private_class_method :template_path

  def self.template_filenames(data)
    locale = data[:locale] || Locale.default

    [locale, locale[0, 2], 'en']
      .uniq
      .map { |locale_code| "#{locale_code}.#{data[:format]}.erb" }
      .map { |basename| ["#{basename}.custom", basename] }.flatten
  end
  private_class_method :template_filenames

=begin

  string = NotificationFactory.application_template_read(
    format: 'html',
    type: 'mailer',
  )

or

  string = NotificationFactory.application_template_read(
    format: 'md',
    type: 'messaging',
  )

returns

  'some template'

=end

  def self.application_template_read(data)
    File.read(APPLICATION_TEMPLATE_PATH_STRING % data)
  end

end