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
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
|