Module: ApiVersioning::ActionControllerExtension::InstanceMethods

Defined in:
app/controllers/api_versioning/action_controller_extension.rb

Instance Method Summary collapse

Instance Method Details

#api_versionObject



10
11
12
# File 'app/controllers/api_versioning/action_controller_extension.rb', line 10

def api_version
	@api_version ||= detect_api_version
end

#api_version_filter(version) ⇒ Object



26
27
28
29
30
# File 'app/controllers/api_versioning/action_controller_extension.rb', line 26

def api_version_filter(version)
	return nil if version.nil?
	matches = version.match(Api::BaseApi::API_VERSION_REGEX)
	matches.nil? ? nil : matches[0].to_sym
end

#detect_api_versionObject



14
15
16
# File 'app/controllers/api_versioning/action_controller_extension.rb', line 14

def detect_api_version
	extract_api_version_from_param || extract_api_version_from_header
end

#extract_api_version_from_headerObject



22
23
24
# File 'app/controllers/api_versioning/action_controller_extension.rb', line 22

def extract_api_version_from_header
	api_version_filter(request.headers["HTTP_X_API_VERSION"])
end

#extract_api_version_from_paramObject



18
19
20
# File 'app/controllers/api_versioning/action_controller_extension.rb', line 18

def extract_api_version_from_param
	api_version_filter(params['api_version'])
end

#render_api_error(message, status = 400, exception = nil) ⇒ Object



82
83
84
85
86
87
# File 'app/controllers/api_versioning/action_controller_extension.rb', line 82

def render_api_error(message, status=400, exception=nil)
	notify_api_error(exception) unless exception.nil?
	status_code = Rack::Utils.status_code(status)
	status_description = Rack::Utils::HTTP_STATUS_CODES[status_code]
	render :status => status, :json => { status_code: status_code, status_description: status_description, message: message }.to_json
end

#render_cached_json(caching_keys, expires_in, presenters, status = 200) ⇒ Object



45
46
47
48
49
50
51
52
53
# File 'app/controllers/api_versioning/action_controller_extension.rb', line 45

def render_cached_json(caching_keys, expires_in, presenters, status=200)

	results = Rails.cache.fetch(caching_keys, expires_in: expires_in) do 
		render_presenters(presenters)
	end

	render_results results

end

#render_json(presenters, status = 200) ⇒ Object



77
78
79
80
# File 'app/controllers/api_versioning/action_controller_extension.rb', line 77

def render_json(presenters, status=200)
	results = render_presenters(presenters)			
	render_results results
end

#render_presenters(presenters) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
# File 'app/controllers/api_versioning/action_controller_extension.rb', line 32

def render_presenters(presenters)

	results = []
	
			presenters.each do |key, value|
				presenter = Api.const_get("#{key.to_s.camelize}Api").new(api_version)
				results << presenter.render(value)
			end

			results.join(',')

end

#render_results(results) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'app/controllers/api_versioning/action_controller_extension.rb', line 55

def render_results(results)

	begin

		render status: status, json: results, callback: params[:callback]				
     
       rescue NameError => e
       	if Rails.production? || Rails.test? 
			render_api_error "Unknown Presenter", 400, e
		else
			raise e
		end
     		rescue Exception => e
       	if Rails.production? || Rails.test? 
			render_api_error "Bad API Request", 400, e
		else
			raise e
		end
     		end

end