Initial commit: Add logistics and order_detail message types
Some checks failed
Lock Threads / action (push) Has been cancelled
Mark stale issues and pull requests / stale (push) Has been cancelled
Publish Chatwoot EE docker images / build (linux/amd64, ubuntu-latest) (push) Has been cancelled
Publish Chatwoot EE docker images / build (linux/arm64, ubuntu-22.04-arm) (push) Has been cancelled
Publish Chatwoot EE docker images / merge (push) Has been cancelled
Publish Chatwoot CE docker images / build (linux/amd64, ubuntu-latest) (push) Has been cancelled
Publish Chatwoot CE docker images / build (linux/arm64, ubuntu-22.04-arm) (push) Has been cancelled
Publish Chatwoot CE docker images / merge (push) Has been cancelled
Run Chatwoot CE spec / lint-backend (push) Has been cancelled
Run Chatwoot CE spec / lint-frontend (push) Has been cancelled
Run Chatwoot CE spec / frontend-tests (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (0, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (1, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (10, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (11, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (12, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (13, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (14, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (15, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (2, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (3, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (4, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (5, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (6, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (7, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (8, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (9, 16) (push) Has been cancelled
Run Linux nightly installer / nightly (push) Has been cancelled
Some checks failed
Lock Threads / action (push) Has been cancelled
Mark stale issues and pull requests / stale (push) Has been cancelled
Publish Chatwoot EE docker images / build (linux/amd64, ubuntu-latest) (push) Has been cancelled
Publish Chatwoot EE docker images / build (linux/arm64, ubuntu-22.04-arm) (push) Has been cancelled
Publish Chatwoot EE docker images / merge (push) Has been cancelled
Publish Chatwoot CE docker images / build (linux/amd64, ubuntu-latest) (push) Has been cancelled
Publish Chatwoot CE docker images / build (linux/arm64, ubuntu-22.04-arm) (push) Has been cancelled
Publish Chatwoot CE docker images / merge (push) Has been cancelled
Run Chatwoot CE spec / lint-backend (push) Has been cancelled
Run Chatwoot CE spec / lint-frontend (push) Has been cancelled
Run Chatwoot CE spec / frontend-tests (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (0, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (1, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (10, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (11, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (12, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (13, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (14, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (15, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (2, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (3, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (4, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (5, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (6, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (7, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (8, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (9, 16) (push) Has been cancelled
Run Linux nightly installer / nightly (push) Has been cancelled
- Add Logistics component with progress tracking - Add OrderDetail component for order information - Support data-driven steps and actions - Add blue color scale to widget SCSS - Fix node overflow and progress bar rendering issues - Add English translations for dashboard components Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
130
app/services/whatsapp/template_processor_service.rb
Normal file
130
app/services/whatsapp/template_processor_service.rb
Normal file
@@ -0,0 +1,130 @@
|
||||
class Whatsapp::TemplateProcessorService
|
||||
pattr_initialize [:channel!, :template_params, :message]
|
||||
|
||||
def call
|
||||
return [nil, nil, nil, nil] if template_params.blank?
|
||||
|
||||
process_template_with_params
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def process_template_with_params
|
||||
[
|
||||
template_params['name'],
|
||||
template_params['namespace'],
|
||||
template_params['language'],
|
||||
processed_templates_params
|
||||
]
|
||||
end
|
||||
|
||||
def find_template
|
||||
channel.message_templates.find do |t|
|
||||
t['name'] == template_params['name'] &&
|
||||
t['language']&.downcase == template_params['language']&.downcase &&
|
||||
t['status']&.downcase == 'approved'
|
||||
end
|
||||
end
|
||||
|
||||
def processed_templates_params
|
||||
template = find_template
|
||||
return if template.blank?
|
||||
|
||||
# Convert legacy format to enhanced format before processing
|
||||
converter = Whatsapp::TemplateParameterConverterService.new(template_params, template)
|
||||
normalized_params = converter.normalize_to_enhanced
|
||||
|
||||
process_enhanced_template_params(template, normalized_params['processed_params'])
|
||||
end
|
||||
|
||||
def process_enhanced_template_params(template, processed_params = nil)
|
||||
processed_params ||= template_params['processed_params']
|
||||
components = []
|
||||
|
||||
components.concat(process_header_components(processed_params))
|
||||
components.concat(process_body_components(processed_params, template))
|
||||
components.concat(process_footer_components(processed_params))
|
||||
components.concat(process_button_components(processed_params))
|
||||
|
||||
@template_params = components
|
||||
end
|
||||
|
||||
def process_header_components(processed_params)
|
||||
return [] if processed_params['header'].blank?
|
||||
|
||||
header_params = build_header_params(processed_params['header'])
|
||||
header_params.present? ? [{ type: 'header', parameters: header_params }] : []
|
||||
end
|
||||
|
||||
def build_header_params(header_data)
|
||||
header_params = []
|
||||
header_data.each do |key, value|
|
||||
next if value.blank?
|
||||
|
||||
if media_url_with_type?(key, header_data)
|
||||
media_name = header_data['media_name']
|
||||
media_param = parameter_builder.build_media_parameter(value, header_data['media_type'], media_name)
|
||||
header_params << media_param if media_param
|
||||
elsif key != 'media_type' && key != 'media_name'
|
||||
header_params << parameter_builder.build_parameter(value)
|
||||
end
|
||||
end
|
||||
header_params
|
||||
end
|
||||
|
||||
def media_url_with_type?(key, header_data)
|
||||
key == 'media_url' && header_data['media_type'].present?
|
||||
end
|
||||
|
||||
def process_body_components(processed_params, template)
|
||||
return [] if processed_params['body'].blank?
|
||||
|
||||
body_params = processed_params['body'].filter_map do |key, value|
|
||||
next if value.blank?
|
||||
|
||||
parameter_format = template['parameter_format']
|
||||
if parameter_format == 'NAMED'
|
||||
parameter_builder.build_named_parameter(key, value)
|
||||
else
|
||||
parameter_builder.build_parameter(value)
|
||||
end
|
||||
end
|
||||
|
||||
body_params.present? ? [{ type: 'body', parameters: body_params }] : []
|
||||
end
|
||||
|
||||
def process_footer_components(processed_params)
|
||||
return [] if processed_params['footer'].blank?
|
||||
|
||||
footer_params = processed_params['footer'].filter_map do |_, value|
|
||||
next if value.blank?
|
||||
|
||||
parameter_builder.build_parameter(value)
|
||||
end
|
||||
|
||||
footer_params.present? ? [{ type: 'footer', parameters: footer_params }] : []
|
||||
end
|
||||
|
||||
def process_button_components(processed_params)
|
||||
return [] if processed_params['buttons'].blank?
|
||||
|
||||
button_params = processed_params['buttons'].filter_map.with_index do |button, index|
|
||||
next if button.blank?
|
||||
|
||||
if button['type'] == 'url' || button['parameter'].present?
|
||||
{
|
||||
type: 'button',
|
||||
sub_type: button['type'] || 'url',
|
||||
index: index,
|
||||
parameters: [parameter_builder.build_button_parameter(button)]
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
button_params.compact
|
||||
end
|
||||
|
||||
def parameter_builder
|
||||
@parameter_builder ||= Whatsapp::PopulateTemplateParametersService.new
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user