api_helper 0.0.3 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/api_helper/includable.rb +2 -2
- data/lib/api_helper/multigettable.rb +26 -27
- data/lib/api_helper/paginatable.rb +64 -42
- data/lib/api_helper/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1adf4979040c0208985d4361607511531fb29f52
|
4
|
+
data.tar.gz: ceca06658f81cb44773d226dbda4f6961c7c864d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5dcc39614587391601e8537c9589377d00aea011b10d77dbd0b0aedc42235cef97fe85904a6d2a772a87f7775239a92b4168007c2ba25e4ded5aad56abcc473c
|
7
|
+
data.tar.gz: 69634679a2a32c1338e6bcd616f73e907cc33d02235adfc0ab34ea61f9c3979a9a01a4e013f030a9768ef88502194bbd42e54aeb99e0e3ad401af671cb4d1497
|
@@ -162,7 +162,7 @@ require 'active_support'
|
|
162
162
|
module APIHelper::Includable
|
163
163
|
extend ActiveSupport::Concern
|
164
164
|
|
165
|
-
# Gets the include parameters, organize them into a +@inclusion+ hash
|
165
|
+
# Gets the include parameters, organize them into a +@inclusion+ hash
|
166
166
|
#
|
167
167
|
# Params:
|
168
168
|
#
|
@@ -226,7 +226,7 @@ module APIHelper::Includable
|
|
226
226
|
end
|
227
227
|
end
|
228
228
|
|
229
|
-
# Getter for the inclusion data
|
229
|
+
# Getter for the inclusion data
|
230
230
|
#
|
231
231
|
# This method will act as a traditional getter of the inclusion data and
|
232
232
|
# returns a hash containing fields for each resource if no parameter is
|
@@ -1,16 +1,22 @@
|
|
1
1
|
require 'active_support'
|
2
2
|
|
3
|
-
# =
|
3
|
+
# = Multigettable
|
4
4
|
#
|
5
|
-
# A normal
|
5
|
+
# A normal RESTful API can let clients get one specified resource at a time:
|
6
6
|
#
|
7
7
|
# GET /posts/3
|
8
8
|
#
|
9
|
-
# If it's declared to be multigettable, then clients can
|
10
|
-
# specified
|
9
|
+
# If it's declared to be multigettable, then clients can get multiple
|
10
|
+
# specified resource like this:
|
11
11
|
#
|
12
12
|
# GET /posts/3,4,8,9
|
13
13
|
#
|
14
|
+
# An API may also support applying operations on multiple resource sith a
|
15
|
+
# single request using this approach
|
16
|
+
#
|
17
|
+
# PATCH /posts/3,4,8,9
|
18
|
+
# DELETE /posts/3,4,8,9
|
19
|
+
#
|
14
20
|
# == Usage
|
15
21
|
#
|
16
22
|
# Include this +Concern+ in your Action Controller:
|
@@ -22,50 +28,43 @@ require 'active_support'
|
|
22
28
|
# or in your Grape API class:
|
23
29
|
#
|
24
30
|
# class SampleAPI < Grape::API
|
25
|
-
#
|
31
|
+
# helpers APIHelper::Multigettable
|
26
32
|
# end
|
27
33
|
#
|
28
34
|
# then use the +multiget+ method like this:
|
29
35
|
#
|
30
|
-
#
|
31
|
-
# # ...
|
32
|
-
# get :id do
|
33
|
-
# @post = multiget(Post, find_by: :id, max: 12)
|
34
|
-
# # ...
|
35
|
-
# end
|
36
|
-
# end
|
36
|
+
# @post = multiget(Post, find_by: :id, param: :id, max: 12)
|
37
37
|
#
|
38
|
-
# <em>The +multiget+ method returns
|
38
|
+
# <em>The +multiget+ method returns an collection of or a single model, based
|
39
39
|
# directly from the requested URL.</em>
|
40
40
|
#
|
41
41
|
# There is also another helper method to determine whether the request is
|
42
42
|
# multigeting or not:
|
43
43
|
#
|
44
|
-
# multiget?(
|
44
|
+
# multiget?(param: id) # => true of false
|
45
45
|
#
|
46
|
-
# It can be used to interact with other condition and functionalities,
|
47
|
-
# like this:
|
48
|
-
#
|
49
|
-
# inclusion_for :post, root: true,
|
50
|
-
# default_includes: (multiget?(find_by: :id) ? [] : [:author])
|
51
46
|
module APIHelper::Multigettable
|
52
47
|
extend ActiveSupport::Concern
|
53
48
|
|
54
|
-
# Get multiple resources from
|
49
|
+
# Get multiple resources from the request by specifing ids split by ','
|
55
50
|
#
|
56
51
|
# Params:
|
57
52
|
#
|
58
53
|
# +resource+::
|
59
|
-
# +ActiveRecord::
|
60
|
-
# to find data from
|
54
|
+
# +ActiveRecord::Relation+ resource collection to find resources from
|
61
55
|
#
|
62
56
|
# +find_by+::
|
63
|
-
# +Symbol+ the attribute that is used to find
|
57
|
+
# +Symbol+ the attribute that is used to find resources, defaults to :id
|
58
|
+
#
|
59
|
+
# +param+::
|
60
|
+
# +Symbol+ the request parameter name used to find resources,
|
61
|
+
# defaults to :id
|
64
62
|
#
|
65
63
|
# +max+::
|
66
64
|
# +Integer+ maxium count of returning results
|
67
|
-
|
68
|
-
|
65
|
+
#
|
66
|
+
def multiget(resource, find_by: :id, param: :id, max: 10)
|
67
|
+
ids = params[param].split(',')
|
69
68
|
ids = ids[0..(max - 1)]
|
70
69
|
|
71
70
|
if ids.count > 1
|
@@ -76,7 +75,7 @@ module APIHelper::Multigettable
|
|
76
75
|
end
|
77
76
|
|
78
77
|
# Is the a multiget request?
|
79
|
-
def multiget?(
|
80
|
-
params[
|
78
|
+
def multiget?(param: :id)
|
79
|
+
params[param].present? && params[param].include?(',')
|
81
80
|
end
|
82
81
|
end
|
@@ -1,21 +1,21 @@
|
|
1
1
|
require 'active_support'
|
2
2
|
|
3
|
-
# =
|
3
|
+
# = Paginatable
|
4
4
|
#
|
5
|
-
# Paginating the requested items can avoid returning too much
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
5
|
+
# Paginating the requested items can avoid returning too much data in a single
|
6
|
+
# response. API clients can iterate over the results with pagination instead of
|
7
|
+
# rerteving all the data in one time, ruining the database connection or
|
8
|
+
# network.
|
9
9
|
#
|
10
|
-
# There are two
|
11
|
-
#
|
10
|
+
# There are two available URL parameters: +per_page+ and +page+. The former is
|
11
|
+
# used for setting how many resources will be returned in each page, there will
|
12
12
|
# be a maxium limit and default value for each API:
|
13
13
|
#
|
14
14
|
# GET /posts?per_page=10
|
15
15
|
#
|
16
|
-
# <em>The server will respond 10
|
16
|
+
# <em>The server will respond 10 resources in a request.</em>
|
17
17
|
#
|
18
|
-
# Use the +page+ parameter to specify which to
|
18
|
+
# Use the +page+ parameter to specify which to page get:
|
19
19
|
#
|
20
20
|
# GET /posts?page=5
|
21
21
|
#
|
@@ -30,6 +30,9 @@ require 'active_support'
|
|
30
30
|
#
|
31
31
|
# Which follows the proposed RFC 5988 standard.
|
32
32
|
#
|
33
|
+
# An aditional header, +X-Items-Count+, will also be set to the total pages
|
34
|
+
# count.
|
35
|
+
#
|
33
36
|
# == Usage
|
34
37
|
#
|
35
38
|
# Include this +Concern+ in your Action Controller:
|
@@ -41,85 +44,104 @@ require 'active_support'
|
|
41
44
|
# or in your Grape API class:
|
42
45
|
#
|
43
46
|
# class SampleAPI < Grape::API
|
44
|
-
#
|
47
|
+
# helpers APIHelper::Paginatable
|
45
48
|
# end
|
46
49
|
#
|
47
|
-
# then set the options for pagination in the grape method
|
50
|
+
# then set the options for pagination in the grape method, as the following as
|
51
|
+
# an example:
|
48
52
|
#
|
49
53
|
# resources :posts do
|
50
54
|
# get do
|
51
|
-
#
|
55
|
+
# collection = current_user.posts
|
56
|
+
# pagination collection.count, default_per_page: 25, maxium_per_page: 100
|
52
57
|
#
|
53
58
|
# # ...
|
54
59
|
# end
|
55
60
|
# end
|
56
61
|
#
|
57
|
-
# Then use the helper methods
|
62
|
+
# Then use the helper methods like this:
|
58
63
|
#
|
64
|
+
# # this example uses kaminari
|
59
65
|
# User.page(page).per(per_page)
|
60
66
|
#
|
61
|
-
# HTTP Link header will be automatically set.
|
67
|
+
# HTTP Link header will be automatically set by the way.
|
62
68
|
module APIHelper::Paginatable
|
63
69
|
extend ActiveSupport::Concern
|
64
70
|
|
65
|
-
|
71
|
+
# Set pagination for the request
|
72
|
+
#
|
73
|
+
# Params:
|
74
|
+
#
|
75
|
+
# +items_count+::
|
76
|
+
# +Symbol+ name of resource to receive the inclusion
|
77
|
+
#
|
78
|
+
# +default_per_page+::
|
79
|
+
# +Integer+ default per_page
|
80
|
+
#
|
81
|
+
# +maxium_per_page+::
|
82
|
+
# +Integer+ maximum results do return on a single page
|
83
|
+
#
|
84
|
+
def pagination(items_count, default_per_page: 20,
|
85
|
+
maxium_per_page: 100,
|
86
|
+
set_header: true)
|
66
87
|
items_count = items_count.count if items_count.respond_to? :count
|
67
88
|
|
68
|
-
@
|
69
|
-
@
|
70
|
-
@
|
89
|
+
@pagination_per_page = (params[:per_page] || default_per_page).to_i
|
90
|
+
@pagination_per_page = maxium_per_page if @pagination_per_page > maxium_per_page
|
91
|
+
@pagination_per_page = 1 if @pagination_per_page < 1
|
71
92
|
|
72
93
|
items_count = 0 if items_count < 0
|
73
|
-
pages_count = (items_count.to_f / @
|
94
|
+
pages_count = (items_count.to_f / @pagination_per_page).ceil
|
74
95
|
pages_count = 1 if pages_count < 1
|
75
96
|
|
76
|
-
@
|
77
|
-
@
|
78
|
-
@
|
97
|
+
@pagination_page = (params[:page] || 1).to_i
|
98
|
+
@pagination_page = pages_count if @pagination_page > pages_count
|
99
|
+
@pagination_page = 1 if @pagination_page < 1
|
79
100
|
|
80
|
-
|
101
|
+
if set_header
|
102
|
+
link_headers ||= []
|
81
103
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
if current_page > 1
|
87
|
-
link_headers << "<#{add_or_replace_uri_param(request.url, :page, (current_page > pages_count ? pages_count : current_page - 1))}>; rel=\"prev\""
|
88
|
-
link_headers << "<#{add_or_replace_uri_param(request.url, :page, 1)}>; rel=\"first\""
|
89
|
-
end
|
104
|
+
if current_page > 1
|
105
|
+
link_headers << "<#{add_or_replace_uri_param(request.url, :page, 1)}>; rel=\"first\""
|
106
|
+
link_headers << "<#{add_or_replace_uri_param(request.url, :page, (current_page > pages_count ? pages_count : current_page - 1))}>; rel=\"prev\""
|
107
|
+
end
|
90
108
|
|
91
|
-
|
109
|
+
if current_page < pages_count
|
110
|
+
link_headers << "<#{add_or_replace_uri_param(request.url, :page, current_page + 1)}>; rel=\"next\""
|
111
|
+
link_headers << "<#{add_or_replace_uri_param(request.url, :page, pages_count)}>; rel=\"last\""
|
112
|
+
end
|
113
|
+
|
114
|
+
link_header = link_headers.join(', ')
|
92
115
|
|
93
|
-
if set_header
|
94
116
|
if self.respond_to?(:header)
|
95
117
|
self.header('Link', link_header)
|
96
118
|
self.header('X-Items-Count', items_count.to_s)
|
119
|
+
self.header('X-Pages-Count', pages_count.to_s)
|
97
120
|
end
|
98
121
|
|
99
122
|
if defined?(response) && response.respond_to?(:headers)
|
100
123
|
response.headers['Link'] = link_header
|
101
124
|
response.headers['X-Items-Count'] = items_count.to_s
|
125
|
+
response.headers['X-Pages-Count'] = pages_count.to_s
|
102
126
|
end
|
103
127
|
end
|
104
|
-
|
105
|
-
link_header
|
106
128
|
end
|
107
129
|
|
108
130
|
# Getter for the current page
|
109
|
-
def
|
110
|
-
@
|
131
|
+
def pagination_page
|
132
|
+
@pagination_page
|
111
133
|
end
|
112
134
|
|
113
|
-
alias_method :current_page, :
|
135
|
+
alias_method :current_page, :pagination_page
|
114
136
|
|
115
137
|
# Getter for per_page
|
116
|
-
def
|
117
|
-
@
|
138
|
+
def pagination_per_page
|
139
|
+
@pagination_per_page
|
118
140
|
end
|
119
141
|
|
120
|
-
alias_method :
|
142
|
+
alias_method :paginate_with, :pagination_per_page
|
121
143
|
|
122
|
-
def add_or_replace_uri_param(url, param_name, param_value)
|
144
|
+
def add_or_replace_uri_param(url, param_name, param_value) # :nodoc:
|
123
145
|
uri = URI(url)
|
124
146
|
params = URI.decode_www_form(uri.query || '')
|
125
147
|
params.delete_if { |param| param[0].to_s == param_name.to_s }
|
data/lib/api_helper/version.rb
CHANGED