mongoid-api-base 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 23d0d53d8ecc497b0c2ba2f314e26a2e35685723
4
+ data.tar.gz: 2882a8c75adb182a8c9f773dfe2c2addda7bacad
5
+ SHA512:
6
+ metadata.gz: 0c6c6cf1fa3960b32e46b6a1e5e87fcc8c8f2040349ca7f90ee79355db5bbce8fbc428d655b4b61d28af2294ab9d15619d07d8d19701023f7c96b1595c63c62f
7
+ data.tar.gz: d22e667ddc134a8a8259cae55df527fe61160c02080b94d71afcc9bbad732df1757f01c9ffbc37341d110b33f2c17e53478c6b5c230f8b5890199af46d57a765
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ .DS_store
2
+ pkg
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
data/LICENSE.md ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright © 2016 [Slate Studio](https://www.slatestudio.com)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the “Software”), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,4 @@
1
+ # Mongoid API Base
2
+
3
+ Rails concern to implement API controllers for Mongoid models.
4
+
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,5 @@
1
+ require "csv"
2
+ require "action_controller/metal/renderers"
3
+ require "renderers/csv"
4
+ require "mongoid-api-base/version"
5
+ require "mongoid-api-base/concern"
@@ -0,0 +1,212 @@
1
+ # =============================================================================
2
+ # MongoidApiBase
3
+ # Rails concern to implement API controllers for Mongoid models.
4
+ # -----------------------------------------------------------------------------
5
+ # Usage Example:
6
+ #
7
+ # include MongoidApiBase
8
+ #
9
+ # defaults resource_class: Journal::JournalPost,
10
+ # per_page: 30
11
+ #
12
+ # has_scope :by_category
13
+ # has_scope :hidden, type: :boolean
14
+ # has_scope :not_hidden, type: :boolean
15
+ #
16
+ # json_config methods: %w(hex slug sorted_categories opengraph_image_url meta_title meta_description),
17
+ # index: {
18
+ # except: %w(body_markdown body_html),
19
+ # methods: %w(hex slug)
20
+ # }
21
+ # =============================================================================
22
+ module MongoidApiBase
23
+ extend ActiveSupport::Concern
24
+ included do
25
+ respond_to :json
26
+ respond_to :csv, only: %w(index)
27
+
28
+ class_attribute :resource_class
29
+ class_attribute :per_page
30
+ class_attribute :csv_options
31
+ class_attribute :json_options
32
+
33
+ def index
34
+ @chain = resource_class
35
+
36
+ apply_scopes_to_chain!
37
+ search_filter_chain!
38
+ paginate_chain!
39
+ set_total_count_header!
40
+
41
+ respond_to do |format|
42
+ format.json { render json: @chain.as_json(json_config(:index)) }
43
+ format.csv { render csv: @chain }
44
+ end
45
+ end
46
+
47
+ def show
48
+ object = find_object
49
+ object = get_object_version(object)
50
+ render json: object.as_json(json_config(:show))
51
+ end
52
+
53
+ def create
54
+ object = build_object
55
+ if object.save
56
+ render json: object.as_json(json_config(:create))
57
+ else
58
+ render json: object.errors, status: :unprocessable_entity
59
+ end
60
+ end
61
+
62
+ def update
63
+ object = find_object
64
+ if object.update_attributes(resource_params)
65
+ render json: object.as_json(json_config(:update))
66
+ else
67
+ render json: object.errors, status: :unprocessable_entity
68
+ end
69
+ end
70
+
71
+ def destroy
72
+ object = find_object
73
+ if object.destroy
74
+ render nothing: true
75
+ else
76
+ render json: object.errors, status: :unprocessable_entity
77
+ end
78
+ end
79
+
80
+ def find_object
81
+ resource_class.find(params[:id])
82
+ end
83
+
84
+ def get_object_version(object)
85
+ version = params[:version]
86
+ if version && object.respond_to?(:undo, true)
87
+ object.undo(nil, from: version.to_i + 1, to: resource.version)
88
+ object.version = version
89
+ end
90
+ object
91
+ end
92
+
93
+ def build_object
94
+ resource_class.new(resource_params)
95
+ end
96
+
97
+ def apply_scopes_to_chain!
98
+ if respond_to?(:apply_scopes, true)
99
+ @chain = apply_scopes(@chain)
100
+ end
101
+ end
102
+
103
+ def search_filter_chain!
104
+ query = params[:search]
105
+ if query
106
+ normalized_query = query.to_s.downcase
107
+ @chain = @chain.search(normalized_query, match: :all)
108
+ end
109
+ end
110
+
111
+ def page
112
+ @page ||= params[:page] || 1
113
+ end
114
+
115
+ def per_page
116
+ @per_page ||= params[:perPage] || self.class.per_page || 20
117
+ end
118
+
119
+ def paginate_chain!
120
+ @chain = begin
121
+ if page
122
+ @chain.page(page).per(per_page)
123
+ else
124
+ @chain.all
125
+ end
126
+ end
127
+ end
128
+
129
+ def set_total_count_header!
130
+ if page
131
+ response.headers['X-Total-Count'] = @chain.total_count
132
+ else
133
+ response.headers['X-Total-Count'] = @chain.size
134
+ end
135
+ end
136
+
137
+ def resource_class
138
+ @resource_class ||= self.class.resource_class
139
+ @resource_class ||= begin
140
+ namespaced_class = self.class.to_s.split("::").last.
141
+ sub(/Controller$/, "").singularize
142
+ namespaced_class.constantize
143
+ end
144
+ end
145
+
146
+ def resource_request_name
147
+ resource_class.to_s.underscore.gsub("/", "_").gsub("::", "_")
148
+ end
149
+
150
+ def resource_params
151
+ permitted_params
152
+ end
153
+
154
+ def permitted_params
155
+ params.require(resource_request_name).permit!
156
+ end
157
+
158
+ def json_default_methods
159
+ [ :_list_item_title,
160
+ :_list_item_subtitle,
161
+ :_list_item_thumbnail,
162
+ :_document_versions ]
163
+ end
164
+
165
+ def json_default_options
166
+ @json_default_options ||= begin
167
+ default_options = {}
168
+ json_options = self.class.json_options || {}
169
+ [:only, :except, :methods].each do |name|
170
+ if json_options.key? name
171
+ default_options[name] = json_options[name]
172
+ end
173
+ end
174
+ default_options[:methods] ||= []
175
+ default_options[:methods].concat(json_default_methods).uniq!
176
+ default_options
177
+ end
178
+ end
179
+
180
+ def json_config(action)
181
+ json_options = self.class.json_options
182
+ if json_options && json_options.key?(action)
183
+ json_options = json_options[action]
184
+ json_options[:methods] ||= []
185
+ json_options[:methods].concat(json_default_methods).uniq!
186
+ json_options
187
+ else
188
+ json_default_options
189
+ end
190
+ end
191
+ end
192
+
193
+ class_methods do
194
+ def defaults(options)
195
+ if options.key?(:resource_class)
196
+ self.resource_class = options[:resource_class]
197
+ end
198
+
199
+ if options.key?(:per_page)
200
+ self.resource_class = options[:per_page]
201
+ end
202
+ end
203
+
204
+ def csv_config(options={})
205
+ self.csv_options = options
206
+ end
207
+
208
+ def json_config(options)
209
+ self.json_options = options
210
+ end
211
+ end
212
+ end
@@ -0,0 +1,4 @@
1
+ module MongoidApiBase
2
+ RAILS_VERSION = "~> 4.2.5.1"
3
+ VERSION = "0.1.0"
4
+ end
@@ -0,0 +1,33 @@
1
+ ActionController::Renderers.add :csv do |objects, options|
2
+ return "" unless objects.first
3
+
4
+ object_klass = objects.first.class
5
+
6
+ return "" unless object_klass.respond_to? :fields
7
+
8
+ columns = object_klass.fields.keys
9
+ csv_options = self.class.csv_options || {}
10
+
11
+ if csv_options
12
+ if csv_options.key?(:only)
13
+ columns &= csv_options[:only].map(&:to_s)
14
+ end
15
+
16
+ if csv_options.key?(:except)
17
+ columns -= csv_options[:except].map(&:to_s)
18
+ end
19
+
20
+ if csv_options.key?(:methods)
21
+ columns += csv_options[:methods].map(&:to_s)
22
+ end
23
+ end
24
+
25
+ str = CSV.generate do |row|
26
+ row << columns
27
+ objects.each do |obj|
28
+ row << columns.map { |c| obj.send(c) }
29
+ end
30
+ end
31
+
32
+ return str
33
+ end
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "mongoid-api-base/version"
4
+ require "date"
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "mongoid-api-base"
8
+ s.summary = "Rails concern to implement API controllers for Mongoid models."
9
+ s.homepage = "http://github.com/slate-studio/mongoid-api-base"
10
+ s.authors = [ "Alexander Kravets" ]
11
+ s.email = "alex@slatestudio.com"
12
+ s.date = Date.today.strftime("%Y-%m-%d")
13
+ s.extra_rdoc_files = %w[ README.md ]
14
+ s.license = "MIT"
15
+ s.files = `git ls-files`.split("\n")
16
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
+ s.require_paths = [ "lib" ]
18
+ s.version = MongoidApiBase::VERSION
19
+ s.platform = Gem::Platform::RUBY
20
+
21
+ s.add_dependency "rails", MongoidApiBase::RAILS_VERSION
22
+ # Ruby ODM framework for MongoDB
23
+ s.add_dependency "mongoid", "~> 5.0"
24
+ # Clean, powerful, customizable and sophisticated paginator
25
+ s.add_dependency "kaminari"
26
+ end
metadata ADDED
@@ -0,0 +1,96 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mongoid-api-base
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Alexander Kravets
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-02-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 4.2.5.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 4.2.5.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: mongoid
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '5.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '5.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: kaminari
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description:
56
+ email: alex@slatestudio.com
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files:
60
+ - README.md
61
+ files:
62
+ - ".gitignore"
63
+ - Gemfile
64
+ - LICENSE.md
65
+ - README.md
66
+ - Rakefile
67
+ - lib/mongoid-api-base.rb
68
+ - lib/mongoid-api-base/concern.rb
69
+ - lib/mongoid-api-base/version.rb
70
+ - lib/renderers/csv.rb
71
+ - mongoid-api-base.gemspec
72
+ homepage: http://github.com/slate-studio/mongoid-api-base
73
+ licenses:
74
+ - MIT
75
+ metadata: {}
76
+ post_install_message:
77
+ rdoc_options: []
78
+ require_paths:
79
+ - lib
80
+ required_ruby_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ required_rubygems_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ requirements: []
91
+ rubyforge_project:
92
+ rubygems_version: 2.5.1
93
+ signing_key:
94
+ specification_version: 4
95
+ summary: Rails concern to implement API controllers for Mongoid models.
96
+ test_files: []