lib/ckeditor/backend/active_storage.rb



# frozen_string_literal: true

module Ckeditor
  module Backend
    module ActiveStorage
      def self.included(base)
        base.send(:include, Rails.application.routes.url_helpers)
        base.send(:include, InstanceMethods)
        base.send(:extend, ClassMethods)
      end

      module ClassMethods
        def self.extended(base)
          base.class_eval do
            before_save :apply_data
            validate do
              if data.nil? || file.nil?
                errors.add(:data, :not_data_present, message: "data must be present")
              end
            end
          end
        end
      end

      module InstanceMethods
        def url
          rails_blob_path(self.storage_data, only_path: true)
        end

        def path
          rails_blob_path(self.storage_data, only_path: true)
        end

        def styles
        end

        def content_type
          self.storage_data.content_type
        end
        def content_type=(_content_type)
          self.storage_data.content_type = _content_type
        end
        protected

        def file
          @file ||= storage_data
        end

        def blob
          @blob ||= ::ActiveStorage::Blob.find(file.attachment.blob_id)
        end

        def apply_data
          if data.is_a?(Ckeditor::Http::QqFile)
            storage_data.attach(io: data, filename: data.original_filename)
          else
            storage_data.attach(data)
          end

          self.data_file_name = storage_data.blob.filename
          self.data_content_type = storage_data.blob.content_type
          self.data_file_size = storage_data.blob.byte_size
        end

      end
    end
  end
end