You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

31 lines
1.5 KiB

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