Class: FactoryBurgers::Middleware::Build

Inherits:
Object
  • Object
show all
Defined in:
lib/factory_burgers/middleware/build.rb

Overview

Build a requested resource and return data for follow-up actions TODO: extract controller methods into controller-like classes

Instance Method Summary collapse

Instance Method Details

#attribute_overrides(attribute_items) ⇒ Object



39
40
41
42
43
44
# File 'lib/factory_burgers/middleware/build.rb', line 39

def attribute_overrides(attribute_items)
  return [] if attribute_items.nil?

  attribute_items = attribute_items.select { |attr| attr["name"].present? }
  return attribute_items.to_h { |attr| [attr["name"], attr["value"]] }
end

#build(env) ⇒ Object



22
23
24
25
26
27
28
29
# File 'lib/factory_burgers/middleware/build.rb', line 22

def build(env)
  params = paramters(env)
  factory = params.fetch("factory")
  traits = params["traits"]&.keys
  attributes = attribute_overrides(params["attributes"])
  owner = get_resource_owner(params["owner_type"], params["owner_id"])
  return FactoryBurgers::Builder.new(owner).build(factory, traits, attributes, as: params["owner_association"])
end

#call(env) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
# File 'lib/factory_burgers/middleware/build.rb', line 9

def call(env)
  resource = build(env)
  object_data = FactoryBurgers::Models::FactoryOutput.new(resource).data
  response_data = {ok: true, data: object_data}
  return [200, {"Content-Type" => "application/json"}, [JSON.dump(response_data)]]
rescue ActiveRecord::RecordInvalid => err
  log_error(err)
  return [422, {"Content-Type" => "application/json"}, [JSON.dump({ok: false, error: err.message})]]
rescue StandardError => err
  log_error(err)
  return [500, {"Content-Type" => "application/json"}, [JSON.dump({ok: false, error: err.message})]]
end

#get_resource_owner(owner_type, owner_id) ⇒ Object



46
47
48
49
50
51
52
53
# File 'lib/factory_burgers/middleware/build.rb', line 46

def get_resource_owner(owner_type, owner_id)
  return nil if owner_type.blank? || owner_id.blank?

  klass = owner_type.constantize
  invalid_resource(klass) if !valid_resource?(klass)

  return klass.find(owner_id)
end

#log_error(error) ⇒ Object



55
56
57
# File 'lib/factory_burgers/middleware/build.rb', line 55

def log_error(error)
  logger.error("#{error.class}: #{error.message}\n" + error.backtrace&.join("\n").to_s)
end

#loggerObject



59
60
61
# File 'lib/factory_burgers/middleware/build.rb', line 59

def logger
  @logger ||= Logger.new($stdout)
end

#paramters(env) ⇒ Object



35
36
37
# File 'lib/factory_burgers/middleware/build.rb', line 35

def paramters(env)
  request(env).params
end

#request(env) ⇒ Object



31
32
33
# File 'lib/factory_burgers/middleware/build.rb', line 31

def request(env)
  Rack::Request.new(env)
end