121 lines
3.5 KiB
Ruby
121 lines
3.5 KiB
Ruby
# Service to convert legacy WhatsApp template parameter formats to enhanced format
|
|
#
|
|
# Legacy formats (deprecated):
|
|
# - Array: ["John", "Order123"] - positional parameters
|
|
# - Flat Hash: {"1": "John", "2": "Order123"} - direct key-value mapping
|
|
#
|
|
# Enhanced format:
|
|
# - Component-based: {"body": {"1": "John", "2": "Order123"}} - structured by template components
|
|
# - Supports header, body, footer, and button parameters separately
|
|
#
|
|
class Whatsapp::TemplateParameterConverterService
|
|
def initialize(template_params, template)
|
|
@template_params = template_params
|
|
@template = template
|
|
end
|
|
|
|
def normalize_to_enhanced
|
|
processed_params = @template_params['processed_params']
|
|
|
|
# Early return if already enhanced format
|
|
return @template_params if enhanced_format?(processed_params)
|
|
|
|
# Mark as legacy format before conversion for tracking
|
|
@template_params['format_version'] = 'legacy'
|
|
|
|
# Convert legacy formats to enhanced structure
|
|
# TODO: Legacy format support will be deprecated and removed after 2-3 releases
|
|
enhanced_params = convert_legacy_to_enhanced(processed_params, @template)
|
|
|
|
# Replace original params with enhanced structure
|
|
@template_params['processed_params'] = enhanced_params
|
|
|
|
@template_params
|
|
end
|
|
|
|
private
|
|
|
|
def enhanced_format?(processed_params)
|
|
return false unless processed_params.is_a?(Hash)
|
|
|
|
# Enhanced format has component-based structure
|
|
component_keys = %w[body header footer buttons]
|
|
has_component_structure = processed_params.keys.any? { |k| component_keys.include?(k) }
|
|
|
|
# Additional validation for enhanced format
|
|
if has_component_structure
|
|
validate_enhanced_structure(processed_params)
|
|
else
|
|
false
|
|
end
|
|
end
|
|
|
|
def validate_enhanced_structure(params)
|
|
valid_body?(params['body']) &&
|
|
valid_header?(params['header']) &&
|
|
valid_buttons?(params['buttons'])
|
|
end
|
|
|
|
def valid_body?(body)
|
|
body.nil? || body.is_a?(Hash)
|
|
end
|
|
|
|
def valid_header?(header)
|
|
header.nil? || header.is_a?(Hash)
|
|
end
|
|
|
|
def valid_buttons?(buttons)
|
|
return true if buttons.nil?
|
|
return false unless buttons.is_a?(Array)
|
|
|
|
buttons.all? { |b| b.is_a?(Hash) && b['type'] }
|
|
end
|
|
|
|
def convert_legacy_to_enhanced(legacy_params, _template)
|
|
# Legacy system only supported text-based templates with body parameters
|
|
# We only convert the parameter format, not add new features
|
|
|
|
enhanced = {}
|
|
|
|
case legacy_params
|
|
when Array
|
|
# Array format: ["John", "Order123"] → {body: {"1": "John", "2": "Order123"}}
|
|
body_params = convert_array_to_body_params(legacy_params)
|
|
enhanced['body'] = body_params unless body_params.empty?
|
|
when Hash
|
|
# Hash format: {"1": "John", "name": "Jane"} → {body: {"1": "John", "name": "Jane"}}
|
|
body_params = convert_hash_to_body_params(legacy_params)
|
|
enhanced['body'] = body_params unless body_params.empty?
|
|
when NilClass
|
|
# Templates without parameters (nil processed_params)
|
|
# Return empty enhanced structure
|
|
else
|
|
raise ArgumentError, "Unknown legacy format: #{legacy_params.class}"
|
|
end
|
|
|
|
enhanced
|
|
end
|
|
|
|
def convert_array_to_body_params(params_array)
|
|
return {} if params_array.empty?
|
|
|
|
body_params = {}
|
|
params_array.each_with_index do |value, index|
|
|
body_params[(index + 1).to_s] = value.to_s
|
|
end
|
|
|
|
body_params
|
|
end
|
|
|
|
def convert_hash_to_body_params(params_hash)
|
|
return {} if params_hash.empty?
|
|
|
|
body_params = {}
|
|
params_hash.each do |key, value|
|
|
body_params[key.to_s] = value.to_s
|
|
end
|
|
|
|
body_params
|
|
end
|
|
end
|