jsonapi_actions 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.ruby-version +1 -1
- data/CHANGELOG.md +4 -0
- data/Gemfile.lock +3 -0
- data/lib/jsonapi_actions/version.rb +1 -1
- data/lib/jsonapi_actions.rb +113 -111
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fe65b6ed02022e7f5962df4faca6f9326aa69e270ce3a7206d23b604141b03d8
|
4
|
+
data.tar.gz: f429a5e20e6caa7f485b25873d30887bde4321e12ff22483505ffce2ded6b249
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 68cf00f70d0727172195ddc306e5b450e83cf003203c94cdbfa85677e4c9fde9dc3853737e17640d6b9546f47287481b240653c03c13bfb72356d5f820ab6770
|
7
|
+
data.tar.gz: '0992c33f6b4e04eb049ffef3139dba7b7339ace3ebff6d66a631ab408d52395ca038a4ec47c23b263bde7a83b09b78715659747d00c7edfcf90e3021ace19da6'
|
data/.gitignore
CHANGED
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
ruby-2.7.
|
1
|
+
ruby-2.7.4
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
|
|
4
4
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
5
5
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
6
6
|
|
7
|
+
## [0.5.0] - 2023-02-22
|
8
|
+
### Added
|
9
|
+
- Added `serializer_params` method to more easily allow for custom serializer params.
|
10
|
+
|
7
11
|
## [0.2.2] - 2020-05-18
|
8
12
|
### Fixed
|
9
13
|
- JsonapiActions#json_response uses `defined?` to check for serializer library
|
data/Gemfile.lock
CHANGED
@@ -112,6 +112,8 @@ GEM
|
|
112
112
|
net-smtp (0.3.3)
|
113
113
|
net-protocol
|
114
114
|
nio4r (2.5.8)
|
115
|
+
nokogiri (1.13.9-arm64-darwin)
|
116
|
+
racc (~> 1.4)
|
115
117
|
nokogiri (1.13.9-x86_64-darwin)
|
116
118
|
racc (~> 1.4)
|
117
119
|
racc (1.6.0)
|
@@ -168,6 +170,7 @@ GEM
|
|
168
170
|
zeitwerk (2.6.6)
|
169
171
|
|
170
172
|
PLATFORMS
|
173
|
+
arm64-darwin-22
|
171
174
|
ruby
|
172
175
|
x86_64-darwin-20
|
173
176
|
|
data/lib/jsonapi_actions.rb
CHANGED
@@ -74,146 +74,148 @@ module JsonapiActions
|
|
74
74
|
|
75
75
|
private
|
76
76
|
|
77
|
-
|
78
|
-
|
79
|
-
|
77
|
+
def metadata
|
78
|
+
{}
|
79
|
+
end
|
80
80
|
|
81
|
-
|
82
|
-
|
81
|
+
def parent_scope(records)
|
82
|
+
return records if self.class.parent_associations.blank?
|
83
83
|
|
84
|
-
|
85
|
-
|
84
|
+
self.class.parent_associations.each do |parent|
|
85
|
+
next if params[parent[:param]].blank?
|
86
86
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
87
|
+
records = records.joins(parent[:association]) unless parent[:association].blank?
|
88
|
+
records = if parent[:table]
|
89
|
+
records.where(parent[:table] => { parent[:attribute] => params[parent[:param]] })
|
90
|
+
else
|
91
|
+
records.where(parent[:attribute] => params[parent[:param]])
|
92
|
+
end
|
93
|
+
end
|
94
94
|
|
95
|
-
|
96
|
-
|
95
|
+
records
|
96
|
+
end
|
97
97
|
|
98
|
-
|
99
|
-
|
100
|
-
|
98
|
+
def filter(records)
|
99
|
+
records
|
100
|
+
end
|
101
101
|
|
102
|
-
|
103
|
-
|
104
|
-
|
102
|
+
def sort(records)
|
103
|
+
return records if params[:sort].blank?
|
104
|
+
order = {}
|
105
105
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
106
|
+
params[:sort].split(',').each do |sort|
|
107
|
+
if sort[0] == '-'
|
108
|
+
order[sort[1..-1]] = :desc
|
109
|
+
else
|
110
|
+
order[sort] = :asc
|
111
|
+
end
|
111
112
|
end
|
113
|
+
|
114
|
+
return records.order(order)
|
112
115
|
end
|
113
116
|
|
114
|
-
|
115
|
-
|
117
|
+
def paginate(records)
|
118
|
+
records.page(page[:number]).per(page[:size])
|
119
|
+
end
|
116
120
|
|
117
|
-
|
118
|
-
|
119
|
-
|
121
|
+
def page
|
122
|
+
@page ||= begin
|
123
|
+
page = {}
|
124
|
+
page[:number] = (params.dig(:page, :number) || 1).to_i
|
125
|
+
page[:size] = [[(params.dig(:page, :size) || 20).to_i, 1000].min, 1].max
|
126
|
+
page
|
127
|
+
end
|
128
|
+
end
|
120
129
|
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
page[:size] = [[(params.dig(:page, :size) || 20).to_i, 1000].min, 1].max
|
126
|
-
page
|
127
|
-
end
|
128
|
-
end
|
130
|
+
def set_record
|
131
|
+
@record = model.find(params[:id])
|
132
|
+
authorize(@record)
|
133
|
+
end
|
129
134
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
end
|
135
|
+
def id_param
|
136
|
+
params.require(:data).permit(policy(@record).permitted_attributes)[:id]
|
137
|
+
end
|
134
138
|
|
135
|
-
|
136
|
-
|
137
|
-
|
139
|
+
def record_params
|
140
|
+
params.require(:data).require(:attributes).permit(policy(@record).permitted_attributes)
|
141
|
+
end
|
138
142
|
|
139
|
-
|
140
|
-
|
141
|
-
|
143
|
+
def include_param
|
144
|
+
if %w[* **].include? params[:include]
|
145
|
+
inclusion_map
|
146
|
+
else
|
147
|
+
params[:include].to_s.split(',').reject(&:blank?).map(&:to_sym)
|
148
|
+
end
|
149
|
+
end
|
142
150
|
|
143
|
-
|
144
|
-
|
145
|
-
inclusion_map
|
146
|
-
else
|
147
|
-
params[:include].to_s.split(',').reject(&:blank?).map(&:to_sym)
|
151
|
+
def inclusion_map
|
152
|
+
InclusionMapper.new(serializer, include: params[:include]).map
|
148
153
|
end
|
149
|
-
end
|
150
154
|
|
151
|
-
|
152
|
-
|
153
|
-
|
155
|
+
def unprocessable_entity(record)
|
156
|
+
Rails.logger.debug(record.errors.messages)
|
157
|
+
{ json: record.errors.messages, status: :unprocessable_entity }
|
158
|
+
end
|
154
159
|
|
155
|
-
|
156
|
-
|
157
|
-
{ json: record.errors.messages, status: :unprocessable_entity }
|
158
|
-
end
|
160
|
+
def pagination_meta(collection)
|
161
|
+
return {} if collection.nil?
|
159
162
|
|
160
|
-
|
161
|
-
|
163
|
+
{
|
164
|
+
current_page: collection.current_page,
|
165
|
+
next_page: collection.next_page,
|
166
|
+
prev_page: collection.prev_page,
|
167
|
+
total_pages: collection.total_pages,
|
168
|
+
total_count: collection.total_count
|
169
|
+
}
|
170
|
+
end
|
162
171
|
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
prev_page: collection.prev_page,
|
167
|
-
total_pages: collection.total_pages,
|
168
|
-
total_count: collection.total_count
|
169
|
-
}
|
170
|
-
end
|
172
|
+
def model
|
173
|
+
self.class.model || self.class.model_name.constantize
|
174
|
+
end
|
171
175
|
|
172
|
-
|
173
|
-
|
174
|
-
|
176
|
+
def json_response(data, options = {})
|
177
|
+
if defined?(JSONAPI::Serializer) || defined?(FastJsonapi)
|
178
|
+
{
|
179
|
+
json: serializer(data).new(data, options.deep_merge(
|
180
|
+
include: include_param,
|
181
|
+
meta: metadata,
|
182
|
+
params: serializer_params)
|
183
|
+
)
|
184
|
+
}
|
175
185
|
|
176
|
-
|
177
|
-
|
178
|
-
{
|
179
|
-
json: serializer(data).new(data, options.deep_merge(
|
180
|
-
include: include_param,
|
181
|
-
meta: metadata,
|
182
|
-
params: {
|
183
|
-
current_user: try(:current_user)
|
184
|
-
})
|
185
|
-
)
|
186
|
-
}
|
186
|
+
elsif defined?(ActiveModel::Serializer)
|
187
|
+
{ json: data }.merge(meta: metadata, include: include_param).merge(options)
|
187
188
|
|
188
|
-
|
189
|
-
|
189
|
+
else
|
190
|
+
{ json: { data: data }.merge(options) }
|
191
|
+
end
|
192
|
+
end
|
190
193
|
|
191
|
-
|
192
|
-
|
194
|
+
def serializer(data = nil)
|
195
|
+
serializer_classes = [
|
196
|
+
self.class.serializer,
|
197
|
+
data.try(:serializer_class),
|
198
|
+
"#{data.class.name}Serializer".safe_constantize,
|
199
|
+
data.try(:first).try(:serializer_class),
|
200
|
+
"#{data.try(:first).class.name}Serializer".safe_constantize
|
201
|
+
].compact
|
202
|
+
|
203
|
+
if serializer_classes.any?
|
204
|
+
serializer_classes.first
|
205
|
+
else
|
206
|
+
"#{model.name}Serializer".safe_constantize
|
207
|
+
end
|
208
|
+
rescue NoMethodError, NameError
|
209
|
+
raise 'Unknown serializer'
|
193
210
|
end
|
194
|
-
end
|
195
211
|
|
196
|
-
|
197
|
-
|
198
|
-
self.class.serializer,
|
199
|
-
data.try(:serializer_class),
|
200
|
-
"#{data.class.name}Serializer".safe_constantize,
|
201
|
-
data.try(:first).try(:serializer_class),
|
202
|
-
"#{data.try(:first).class.name}Serializer".safe_constantize
|
203
|
-
].compact
|
204
|
-
|
205
|
-
if serializer_classes.any?
|
206
|
-
serializer_classes.first
|
207
|
-
else
|
208
|
-
"#{model.name}Serializer".safe_constantize
|
212
|
+
def serializer_params
|
213
|
+
{ current_user: try(:current_user) }
|
209
214
|
end
|
210
|
-
rescue NoMethodError, NameError
|
211
|
-
raise 'Unknown serializer'
|
212
|
-
end
|
213
215
|
|
214
|
-
|
215
|
-
|
216
|
-
|
216
|
+
def eager_load(records)
|
217
|
+
records
|
218
|
+
end
|
217
219
|
end
|
218
220
|
|
219
221
|
module ClassMethods
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jsonapi_actions
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevin Pheasey
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-02-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -139,7 +139,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
139
139
|
- !ruby/object:Gem::Version
|
140
140
|
version: '0'
|
141
141
|
requirements: []
|
142
|
-
rubygems_version: 3.1.
|
142
|
+
rubygems_version: 3.1.6
|
143
143
|
signing_key:
|
144
144
|
specification_version: 4
|
145
145
|
summary: Rails JSON:API Controller Actions
|