jam-cloud/web/app/controllers/api_debug_console_logs_cont...

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