module Api module V1 class PracticeTransfersController < BaseController before_action { response.set_header("Cache-Control", "no-store") } before_action :require_secure_transfer def create payload = PracticeTransferExport.new(user: current_user, from: params[:from], to: params[:to], descriptions: ActiveModel::Type::Boolean.new.cast(params[:include_descriptions])).call encrypted = ProfessionalTransferEnvelope.encrypt(payload, params[:transfer_password]) response.set_header("Cache-Control", "no-store") response.set_header("X-Transfer-Skipped-Running", payload[:skipped_running].to_s) send_data encrypted, type: "application/octet-stream", disposition: "attachment", filename: "praktikum-praxis-#{Date.current.iso8601}.pcmtransfer" rescue PracticeTransferExport::Invalid => error render json: { error: error.message }, status: :unprocessable_entity rescue ProfessionalTransferEnvelope::Invalid => error message = error.message == "password" ? "Das Transferpasswort muss mindestens 12 Zeichen lang sein (höchstens 256 Bytes)." : "Der Export ist zu groß. Bitte den Zeitraum verkleinern." render json: { error: message }, status: :unprocessable_entity end private def require_secure_transfer if Rails.env.production? && !request.ssl? render json: { error: "Der Praxisexport ist nur über HTTPS erlaubt. Bitte die TLS-Proxy-Konfiguration prüfen." }, status: :upgrade_required end end end end end