Restructure omni services and add Chatwoot research snapshot

This commit is contained in:
Ruslan Bakiev
2026-02-21 11:11:27 +07:00
parent edea7a0034
commit b73babbbf6
7732 changed files with 978203 additions and 32 deletions

View File

@@ -0,0 +1,41 @@
class Cloudflare::BaseCloudflareZoneService
BASE_URI = 'https://api.cloudflare.com/client/v4'.freeze
private
def headers
{
'Authorization' => "Bearer #{api_token}",
'Content-Type' => 'application/json'
}
end
def api_token
InstallationConfig.find_by(name: 'CLOUDFLARE_API_KEY')&.value
end
def zone_id
InstallationConfig.find_by(name: 'CLOUDFLARE_ZONE_ID')&.value
end
def update_portal_ssl_settings(portal, data)
verification_record = data['ownership_verification_http']
ssl_record = data['ssl']
verification_errors = data['verification_errors']&.first || ''
# Start with existing settings to preserve verification data if it exists
ssl_settings = portal.ssl_settings || {}
# Only update verification fields if they exist in the response (during initial setup)
if verification_record.present?
ssl_settings['cf_verification_id'] = verification_record['http_url'].split('/').last
ssl_settings['cf_verification_body'] = verification_record['http_body']
end
# Always update SSL status and errors from current response
ssl_settings['cf_status'] = ssl_record&.dig('status')
ssl_settings['cf_verification_errors'] = verification_errors
portal.update(ssl_settings: ssl_settings)
end
end

View File

@@ -0,0 +1,23 @@
class Cloudflare::CheckCustomHostnameService < Cloudflare::BaseCloudflareZoneService
pattr_initialize [:portal!]
def perform
return { errors: ['Cloudflare API token or zone ID not found'] } if api_token.blank? || zone_id.blank?
return { errors: ['No custom domain found'] } if @portal.custom_domain.blank?
response = HTTParty.get(
"#{BASE_URI}/zones/#{zone_id}/custom_hostnames?hostname=#{@portal.custom_domain}", headers: headers
)
return { errors: response.parsed_response['errors'] } unless response.success?
data = response.parsed_response['result']
if data.present?
update_portal_ssl_settings(@portal, data.first)
return { data: data }
end
{ errors: ['Hostname is missing in Cloudflare'] }
end
end

View File

@@ -0,0 +1,37 @@
class Cloudflare::CreateCustomHostnameService < Cloudflare::BaseCloudflareZoneService
pattr_initialize [:portal!]
def perform
return { errors: ['Cloudflare API token or zone ID not found'] } if api_token.blank? || zone_id.blank?
return { errors: ['No hostname found'] } if @portal.custom_domain.blank?
response = create_hostname
return { errors: response.parsed_response['errors'] } unless response.success?
data = response.parsed_response['result']
if data.present?
update_portal_ssl_settings(@portal, data)
return { data: data }
end
{ errors: ['Could not create hostname'] }
end
private
def create_hostname
HTTParty.post(
"#{BASE_URI}/zones/#{zone_id}/custom_hostnames",
headers: headers,
body: {
hostname: @portal.custom_domain,
ssl: {
method: 'http',
type: 'dv'
}
}.to_json
)
end
end