Module: JSONAPI::ActsAsResourceController

Included in:
ResourceController, YourModelsController
Defined in:
lib/jsonapi/acts_as_resource_controller.rb

Defined Under Namespace

Modules: ClassMethods

Constant Summary collapse

MEDIA_TYPE_MATCHER =
/.+".+"[^,]*|[^,]+/
ALL_MEDIA_TYPES =
'*/*'

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#jsonapi_requestObject (readonly)

Returns the value of attribute jsonapi_request.



18
19
20
# File 'lib/jsonapi/acts_as_resource_controller.rb', line 18

def jsonapi_request
  @jsonapi_request
end

#response_documentObject (readonly)

Returns the value of attribute response_document.



18
19
20
# File 'lib/jsonapi/acts_as_resource_controller.rb', line 18

def response_document
  @response_document
end

Class Method Details

.included(base) ⇒ Object



10
11
12
13
14
15
16
# File 'lib/jsonapi/acts_as_resource_controller.rb', line 10

def self.included(base)
  base.extend ClassMethods
  base.include Callbacks
  base.cattr_reader :server_error_callbacks
  base.define_jsonapi_resources_callbacks :process_operations,
                                          :transaction
end

Instance Method Details

#createObject



32
33
34
# File 'lib/jsonapi/acts_as_resource_controller.rb', line 32

def create
  process_request
end

#create_relationshipObject



36
37
38
# File 'lib/jsonapi/acts_as_resource_controller.rb', line 36

def create_relationship
  process_request
end

#destroyObject



48
49
50
# File 'lib/jsonapi/acts_as_resource_controller.rb', line 48

def destroy
  process_request
end

#destroy_relationshipObject



52
53
54
# File 'lib/jsonapi/acts_as_resource_controller.rb', line 52

def destroy_relationship
  process_request
end

#execute_requestObject



106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'lib/jsonapi/acts_as_resource_controller.rb', line 106

def execute_request
  process_operations(jsonapi_request.transactional?) do
    run_callbacks :process_operations do
      jsonapi_request.operations.each do |op|
        op.options[:serializer] = resource_serializer_klass.new(
          op.resource_klass,
          include_directives: op.options[:include_directives],
          fields: op.options[:fields],
          base_url: base_url,
          key_formatter: key_formatter,
          route_formatter: route_formatter,
          serialization_options: serialization_options,
          controller: self
        )
        op.options[:cache_serializer_output] = !JSONAPI.configuration.resource_cache.nil?

        process_operation(op)
      end
    end
    if response_document.has_errors?
      raise ActiveRecord::Rollback
    end
  end
end


64
65
66
67
68
69
70
# File 'lib/jsonapi/acts_as_resource_controller.rb', line 64

def get_related_resource
  # :nocov:
  JSONAPI::CompatibilityHelper.deprecation_warn("In #{self.class.name} you exposed a `get_related_resource`"\
                                  " action. Please use `show_related_resource` instead.")
  show_related_resource
  # :nocov:
end


72
73
74
75
76
77
78
# File 'lib/jsonapi/acts_as_resource_controller.rb', line 72

def get_related_resources
  # :nocov:
  JSONAPI::CompatibilityHelper.deprecation_warn("In #{self.class.name} you exposed a `get_related_resources`"\
                                  " action. Please use `index_related_resources` instead.")
  index_related_resources
  # :nocov:
end

#indexObject



20
21
22
# File 'lib/jsonapi/acts_as_resource_controller.rb', line 20

def index
  process_request
end


60
61
62
# File 'lib/jsonapi/acts_as_resource_controller.rb', line 60

def index_related_resources
  process_request
end

#parse_requestObject



97
98
99
100
101
102
103
104
# File 'lib/jsonapi/acts_as_resource_controller.rb', line 97

def parse_request
  @jsonapi_request = JSONAPI::Request.new(
    params,
    context: context,
    key_formatter: key_formatter,
    server_error_callbacks: (self.class.server_error_callbacks || []))
  fail JSONAPI::Exceptions::Errors.new(@jsonapi_request.errors) if @jsonapi_request.errors.any?
end

#process_operation(operation) ⇒ Object



147
148
149
150
# File 'lib/jsonapi/acts_as_resource_controller.rb', line 147

def process_operation(operation)
  result = operation.process
  response_document.add_result(result, operation)
end

#process_operations(transactional) ⇒ Object



131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/jsonapi/acts_as_resource_controller.rb', line 131

def process_operations(transactional)
  if transactional
    run_callbacks :transaction do
      ActiveRecord::Base.transaction do
        yield
      end
    end
  else
    begin
      yield
    rescue ActiveRecord::Rollback
      # Can't rollback without transaction, so just ignore it
    end
  end
end

#process_requestObject



80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/jsonapi/acts_as_resource_controller.rb', line 80

def process_request
  begin
    setup_response_document
    verify_content_type_header
    verify_accept_header
    parse_request
    execute_request
  rescue => e
    handle_exceptions(e)
  end
  render_response_document
end

#setup_response_documentObject



93
94
95
# File 'lib/jsonapi/acts_as_resource_controller.rb', line 93

def setup_response_document
  @response_document = create_response_document
end

#showObject



24
25
26
# File 'lib/jsonapi/acts_as_resource_controller.rb', line 24

def show
  process_request
end


56
57
58
# File 'lib/jsonapi/acts_as_resource_controller.rb', line 56

def show_related_resource
  process_request
end

#show_relationshipObject



28
29
30
# File 'lib/jsonapi/acts_as_resource_controller.rb', line 28

def show_relationship
  process_request
end

#updateObject



44
45
46
# File 'lib/jsonapi/acts_as_resource_controller.rb', line 44

def update
  process_request
end

#update_relationshipObject



40
41
42
# File 'lib/jsonapi/acts_as_resource_controller.rb', line 40

def update_relationship
  process_request
end