# frozen_string_literal: true

module ActiveStorage
  class DirectUploadsController < CustomBaseController
    before_action :check_file_size, only: :create

    def create
      blob = ActiveStorage::Blob.create_before_direct_upload!(**blob_args)
      render json: direct_upload_json(blob)
    end

    private

    def blob_args
      args = params.require(:blob)
                   .permit(:filename, :byte_size, :checksum, :content_type, metadata: {})
                   .to_h
                   .symbolize_keys
      args[:content_type] = 'application/octet-stream' if args[:content_type].blank?
      args
    end

    def direct_upload_json(blob)
      blob.as_json(root: false, methods: :signed_id)
          .merge(direct_upload: { url: blob.service_url_for_direct_upload,
                                  headers: blob.service_headers_for_direct_upload })
    end

    def check_file_size
      render_403 if blob_args[:byte_size] > Rails.configuration.x.file_max_size_mb.megabytes
    end
  end
end