SpontaneousCMS/spontaneous

View on GitHub
lib/spontaneous/field.rb

Summary

Maintainability
A
1 hr
Test Coverage
# encoding: UTF-8

module Spontaneous
  module Field
    autoload :Base,         "spontaneous/field/base"
    autoload :FieldVersion, "spontaneous/field/field_version"
    autoload :Update,       "spontaneous/field/update"

    def self.type_map
      @type_map ||= {}
    end

    def self.register(klass, *labels)
      labels.each do |label|
        type_map[label.to_sym] = klass
      end
    end

    def self.[](label)
      type_map[label.to_sym] || String
    end

    def self.serialize_field(field)
      [field.schema_id.to_s, field.version, field.unprocessed_value, field.processed_values]
    end

    def self.deserialize_field(serialized_field)
      {id: serialized_field[0],
       version: serialized_field[1],
       unprocessed_value: serialized_field[2],
       processed_values: serialized_field[3]}
    end

    # Used to test for the validity of asynchronous updates.
    #
    # A to-the-second resolution would actually probably be fine as
    # real updates will come from the user in meat-space time but
    # why not use the full resolution available...
    def self.timestamp(time = Time.now)
      (time.to_f * 10000000).to_i
    end

    def self.update(site, content, params, user, asynchronous = false)
      fields = Hash[params.map { |sid, value| [content.fields.sid(sid), value] }]
      Update.perform(site, fields, user, asynchronous)
    end

    def self.update_asynchronously(site, content, params, user)
      update(site, content, params, user, true)
    end

    def self.set(site, field, value, user, asynchronous = false)
      Update.perform(site, {field => value}, user, asynchronous)
    end

    def self.set_asynchronously(site, field, value, user)
      set(site, field, value, user, true)
    end

    def self.find(content_model, *ids)
      fields = ids.map { |id| resolve_id(content_model, id) }.compact
      return fields.first if ids.length == 1
      fields
    end

    def self.resolve_id(content_model, id)
      content_id, box_sid, field_sid = id.split("/")
      field_sid, box_sid = box_sid, field_sid if field_sid.nil?
      content = target = content_model.get(content_id)
      return nil if target.nil?
      target  = content.boxes.sid(box_sid) if box_sid
      return nil if target.nil?
      target.fields.sid(field_sid)
    end
  end
end

[:string, :long_string, :html, :file, :image, :date, :markdown, :location, :webvideo, :select, :tags, :boolean].each do |type|
  require "spontaneous/field/#{type}"
end