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