class ModelApi < ApplicationApi class << self def toggle_ids name self.class_eval %[ param :#{name}_id, Integer def toggle_#{name} message toggle!(@object, :#{name}_ids, @_#{name}_id) ? 'added' : 'removed' end ] end end # toggles value in postgre array field def toggle!(object, field, value) object[field] ||= [] if object[field].include?(value) object[field] -= [value] object.save false else object[field] += [value] object.save true end end ### def index raise 'No index method defiend' end def show error "Object not found" unless @object can? :read, @object @object.attributes end def create @object = @class_name.constantize.new @last = @class_name.constantize.my.last rescue @class_name.constantize.last if @last && @last[:name].present? && @last[:name] == @params[:name] error "#{@class_name} is same as last one created." end for k,v in @params @object.send("#{k}=", v) if @object.respond_to?(k.to_sym) end can? :create, @object @object.save if @object.valid? return if report_errros_if_any @object if @object.id @message = "#{@class_name.capitalize} created" else error 'object not created, error unknown' end @response[:path] = (@object.path rescue nil) @object.attributes end def update error "Object not found" unless @object for k,v in @params @object.send("#{k}=", v) if @object.respond_to?(k.to_sym) end can? :update, @object @object.save if @object.valid? report_errros_if_any @object @message = "#{@class_name} updated" @response[:path] = (@object.path rescue nil) @object.attributes end # if you put active boolean field to objects, then they will be unactivated on destroy def destroy error "Object not found" unless @object can? :delete, @object if @object.respond_to?(:is_active) @object.update is_active: false @message = 'Object deleted (exists in trashcan)' elsif @object.respond_to?(:active) @object.update active: false @message = 'Object deleted (exists in trashcan)' else @object.destroy @message = "#{@object.class.name} deleted" end report_errros_if_any @object @object.attributes end def undelete error "Object not found" unless @object can? :create, @object if @object.respond_to?(:is_active) @object.update :is_active=>true elsif @object.respond_to?(:active) @object.update :active=>true else error "No is_active, can't undelete" end @message = 'Object raised from the dead.' end def report_errros_if_any(obj) @response[:object] = obj.class.to_s.tableize.singularize @response[:objects] = obj.class.to_s.tableize if obj.errors.count > 0 @response[:error] = '' @response[:errors] = {} for k,v in obj.errors desc = v.join(', ') desc = "#{k} #{desc}" if desc.starts_with?('is ') @response[:errors][k] = desc @response[:error] += ', ' unless @response[:error].blank? @response[:error] += desc end Lux.page.status(400) return true end false end def can?(action, object) ModelPolicy.can?(action: action, model: object, user: Lux.page.var.user) do |err| msg = 'No %s permission for %s' % [action.to_s.sub('?',''), Lux.page.var.user ? Lux.page.var.user.email : :guests] msg += ' on %s' % object.class.name if object error msg end end end