68 lines
1.6 KiB
Ruby
68 lines
1.6 KiB
Ruby
class ApiDebugConsoleLogsController < ApiController
|
|
require 'fileutils'
|
|
|
|
def create
|
|
return render(json: {error: 'disabled'}, status: 404) unless log_to_server_enabled?
|
|
|
|
label = sanitized_label(params[:label])
|
|
timestamp = Time.now.strftime('%Y%m%d-%H%M%S')
|
|
file_name = "#{timestamp}-#{label}.log"
|
|
dir = Rails.root.join('tmp', 'console-logs')
|
|
path = dir.join(file_name)
|
|
|
|
FileUtils.mkdir_p(dir)
|
|
|
|
payload = {
|
|
generated_at: Time.now.utc.iso8601,
|
|
user_id: current_user&.id,
|
|
email: current_user&.email,
|
|
user_agent: request.user_agent,
|
|
remote_ip: request.remote_ip,
|
|
label: label,
|
|
logs: normalize_payload(params[:logs])
|
|
}
|
|
|
|
File.write(path, JSON.pretty_generate(payload))
|
|
|
|
render json: {ok: true, file_name: file_name}, status: :created
|
|
end
|
|
|
|
private
|
|
|
|
def log_to_server_enabled?
|
|
ENV['LOG_TO_SERVER'].to_s == '1'
|
|
end
|
|
|
|
def sanitized_label(raw)
|
|
value = raw.to_s.strip.gsub(/\s+/, '')
|
|
value = 'log' if value.blank?
|
|
value
|
|
end
|
|
|
|
def normalize_payload(value)
|
|
if value.is_a?(ActionController::Parameters)
|
|
normalize_payload(value.to_unsafe_h)
|
|
elsif value.is_a?(Array)
|
|
value.map { |v| normalize_payload(v) }
|
|
elsif value.is_a?(Hash)
|
|
value.each_with_object({}) do |(k, v), memo|
|
|
memo[k] = normalize_payload(v)
|
|
end
|
|
elsif value.is_a?(String)
|
|
try_parse_json(value)
|
|
else
|
|
value
|
|
end
|
|
end
|
|
|
|
def try_parse_json(value)
|
|
stripped = value.to_s.strip
|
|
return value if stripped.empty?
|
|
return value unless stripped.start_with?('{', '[')
|
|
|
|
JSON.parse(stripped)
|
|
rescue StandardError
|
|
value
|
|
end
|
|
end
|