Class: Traim::Router

Inherits:
Object
  • Object
show all
Defined in:
lib/traim.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(resources) ⇒ Router

Returns a new instance of Router.



147
148
149
150
151
# File 'lib/traim.rb', line 147

def initialize(resources) 
  @status    = nil
  @resources = resources
  @headers   = {}
end

Class Method Details

.resourcesObject



153
# File 'lib/traim.rb', line 153

def self.resources; @resources ||= {} end

Instance Method Details

#action(name) ⇒ Object



212
213
214
215
216
217
# File 'lib/traim.rb', line 212

def action(name)
  raise NotImplementedError unless action = @resource.actions[name] 

  action[:block] = default_actions[name] if action[:block].nil?
  action
end

#create(&block) ⇒ Object



160
# File 'lib/traim.rb', line 160

def create(&block);  @resource.action(:create,  &block) end

#createdObject



140
# File 'lib/traim.rb', line 140

def created;   @status = 201 end

#default_actionsObject



219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
# File 'lib/traim.rb', line 219

def default_actions
  @default_actions ||= begin 
    actions = {}
    delegator = @resource.model_delegator
    actions["POST"] = lambda do |params|
      delegator.create(params["payload"])
    end
    actions["GET"] = lambda do |params|
      delegator.show(params["id"])
    end
    actions["PUT"] = lambda do |params|
      result = delegator.update(params["id"], params["payload"])
      result
    end
    actions["DELETE"] = lambda do |params|
      delegator.delete(@id)
    end
    actions
  end
end

#destory(&block) ⇒ Object



162
# File 'lib/traim.rb', line 162

def destory(&block); @resource.action(:destory, &block) end

#headers(key, value) ⇒ Object



143
144
145
# File 'lib/traim.rb', line 143

def headers(key, value)
  @headers[key] = value 
end

#loggerObject



136
# File 'lib/traim.rb', line 136

def logger; Traim.logger  end

#modelObject



240
# File 'lib/traim.rb', line 240

def model;  @resource.model end

#no_cotentObject



141
# File 'lib/traim.rb', line 141

def no_cotent; @status = 204 end

#okObject

status code sytax suger



139
# File 'lib/traim.rb', line 139

def ok;        @status = 200 end

#recordObject



241
# File 'lib/traim.rb', line 241

def record; @record; end

#render(request) ⇒ Object



243
244
245
246
247
248
249
250
251
252
253
254
255
256
# File 'lib/traim.rb', line 243

def render(request)
  method_block = action(request.request_method)
  payload = request.params
  if (method_block[:options][:permit])
    if not_permmited_payload = payload.detect { |key, value| !method_block[:options][:permit].include?(key) }  
      raise BadRequestError.new(message: "Not permitted payload: #{not_permmited_payload}") 
    end
  end
  params = {"payload" => payload}
  params["id"] = @id unless @id.nil?
  @result = @resource.execute(params, &method_block[:block])

  [status, @headers, [to_json]]
end

#resources(name) ⇒ Object



155
156
157
# File 'lib/traim.rb', line 155

def resources(name)
  @resources[name]
end

#run(seg, inbox) ⇒ Object



164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
# File 'lib/traim.rb', line 164

def run(seg, inbox)  
  begin
    segment = inbox[:segment].to_sym

    if @resource.nil?
      raise BadRequestError unless @resource = resources(segment)
      next
    end 

    if @id.nil? && !defined?(@collection_name)
      if collection = @resource.collections[segment]
        @collection_name = segment
        return instance_eval(&collection)
      else
        @id = segment.to_s.to_i
        @record = @resource.model_delegator.show(@id)
        next 
      end
    end

    if !defined?(@member_name)
      if member = @resource.members[segment]
        @member_name = segment
        return instance_eval(&member)
      end
    end

    raise BadRequestError 
  end while seg.capture(:segment, inbox) 
end

#show(&block) ⇒ Object



159
# File 'lib/traim.rb', line 159

def show(&block);    @resource.action(:show,    &block) end

#statusObject



135
# File 'lib/traim.rb', line 135

def status; @status || ok end

#to_jsonObject



195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
# File 'lib/traim.rb', line 195

def to_json
  if @result.kind_of?(ActiveRecord::Relation)
    hash = @result.map do |object|
      @resource.to_hash(object, @resources) 
    end
    JSON.dump(hash)
  else
    new_hash = {}
    if @result.errors.size == 0
      new_hash = @resource.to_hash(@result, @resources)
    else
      new_hash = @result.errors.messages
    end
    JSON.dump(new_hash)
  end
end

#update(&block) ⇒ Object



161
# File 'lib/traim.rb', line 161

def update(&block);  @resource.action(:update,  &block) end