rest_rails 0.1.0 → 0.8.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7fbfcc915cc6cd4b87ab45165c5ae83644327250414b2695ac6792afcb938903
4
- data.tar.gz: 45955c0053d64c977ed9f4460681e2972503ca9c84ae739eb6b173553898a447
3
+ metadata.gz: b126ebf0d0ee509d040b57b6ff35dd7bb3ab837c09e499159f369a8d56df21ee
4
+ data.tar.gz: 91cbf7f438cfa373ba2c9d61f2d1f44f8e3eda84da4244dae1da01e384d898e7
5
5
  SHA512:
6
- metadata.gz: 21952e44ba928b34a0232bd4e49a6dd38e60adebbc9f8c590d4fa8e94f2eed6f92a0064d15d2112e65c9b542232d5ce7e9cda3736aaa4a12ea39817b6d61725b
7
- data.tar.gz: 8d6968c5743e3002095fccef95bdaf48b53032320c3a2349b4bc1e8265b5c2095c1a911f4d855095da55d17609765ae65e4dc4485efdc4f01d17660f7c502c44
6
+ metadata.gz: e6ca726a3603a6ed9ce3ceec63379e266a64c993677c063c9c693940e95d08105b311a9becfdc4380f12ad411e29088f1d7b58462afa0bc3810be8b29ae99483
7
+ data.tar.gz: dc96c4175867bfc18c1fe059421e0613ee3ab0145ba7910953e62fe5d0ce8595096928ee869d448473ee70487f76679564298c45248b0d0ca1697bf9df09aa9c
data/README.md CHANGED
@@ -1,16 +1,343 @@
1
1
  # RestRails
2
2
  Rails Plugin for quick intelligent API Creation by Tuitu Technology Solutions
3
3
 
4
- ## How To Use
4
+ ## How To Start
5
5
 
6
- Add To Gemfile: `gem 'rest_rails'`
6
+ 1. Add To Gemfile: `gem 'rest_rails'`
7
+ 2. Bundle Install: `bundle install`
8
+ 3. Install RestRails: `rails g rest_rails:install`
9
+ 4. Modify initializer and/or mounted route.
7
10
 
8
- Then place in the bottom of Rails Routes:
11
+ ## The Basics
12
+
13
+ RestRails will automatically create a base API for all standard CRUD actions.
14
+ Just one line of code to implement a powerful REST API.
15
+
16
+ For Example's sake, let's take the following schema:
17
+
18
+ - **articles:** *title, description, content*
19
+ - **comments:** *article_id, content*
20
+
21
+ Further more, as per activestorage convention, **Article** *has_one_attached :feature_image* & *has_many_attached :content_images*
22
+
23
+ Let's say we mount RestRails at `/api/v1`, the Following routes are included for articles:
24
+
25
+ ### Articles
26
+
27
+ REST action | method | route | notes
28
+ ------------ | ------ | -------------------------------------------- | ----------------------
29
+ index | GET | `/api/v1/articles` | index paginated by 100
30
+ show | GET | `/api/v1/articles/:id` | show for one article
31
+ create | POST | `/api/v1/articles` | create new article
32
+ update | GET | `/api/v1/articles/:id` | update an article
33
+ destroy | DELETE | `/api/v1/articles/:id` | destroy an article
34
+ fetch_column | GET | `/api/v1/articles/:id/title` | fetch title of article
35
+ fetch_column | GET | `/api/v1/articles/:id/description` | fetch description of article
36
+ fetch_column | GET | `/api/v1/articles/:id/content` | fetch content of article
37
+ attach | POST | `/api/v1/articles/:id/attach/feature_image` | attach file to feature_image
38
+ attach | POST | `/api/v1/articles/:id/attach/content_images` | attach file to content_images
39
+
40
+
41
+ And the following for comments:
42
+
43
+ ### Comments
44
+
45
+ REST action | method | route | notes
46
+ ------------ | ------ | -------------------------------------------- | ----------------------
47
+ index | GET | `/api/v1/comments` | index paginated by 100
48
+ show | GET | `/api/v1/comments/:id` | show for one comment
49
+ create | POST | `/api/v1/comments` | create new comment
50
+ update | GET | `/api/v1/comments/:id` | update an comment
51
+ destroy | DELETE | `/api/v1/comments/:id` | destroy an comment
52
+ fetch_column | GET | `/api/v1/comments/:id/article_id` | fetch article_id of comment
53
+ fetch_column | GET | `/api/v1/comments/:id/content` | fetch content of comment
54
+
55
+ # HOW TO USE THE REST API
56
+
57
+ ## INDEX: GET '/table_name'
58
+ GET '/articles' will return a JSON response as follows:
59
+ ```
60
+ {
61
+ "code": 200,
62
+ "objects": [
63
+ {
64
+ "id": 1,
65
+ "created_at": "2019-08-27T08:22:19.357Z",
66
+ "updated_at": "2019-08-27T08:22:19.499Z",
67
+ "title": "Discourse on Dystopian Non Fiction",
68
+ "description": "This is an abstract description used to mislead readers into clicking on the article and take a deeper read.",
69
+ "content": "Wow, the reader actually clicked! Now let me brainwash him with this heavily opinionated article based on a myriad of unverified sources with the credibility of a personified M&M's...",
70
+ "feature_image": {
71
+ "attachment_id": 1,
72
+ "url": "http://localhost:3000/rails/active_storage/blobs/eyJfcmFpbHMiOnsib--f573ab9452c272881fb/jopmqH0.jpg"
73
+ },
74
+ "content_images": [
75
+ {
76
+ "attachment_id": 3,
77
+ "url": "http://localhost:3000/rails/active_storage/blobs/sjfioadifo-8fdjsfaj/fjso.jpg"
78
+ }, {
79
+ "attachment_id": 12,
80
+ "url": "http://localhost:3000/rails/active_storage/blobs/fjiods--k0f09fs/jfdsjk.jpg"
81
+ }
82
+ ]
83
+ },
84
+ {...},
85
+ {...},
86
+ ...
87
+ ],
88
+ "count": 100,
89
+ "total": 1300
90
+ }
91
+ ```
92
+
93
+ The index REST API is by *default* paginated by 100. To go through pages, add the following params to the GET path:
94
+
95
+ `page=<number>`
96
+
97
+ ex: '/api/v1/articles?page=2'
98
+
99
+ Models can also be filtered by a very basic WHERE query param structure.
100
+
101
+ For Article, the index API point can receive the following paramters:
102
+
103
+ param | type | example | notes
104
+ -------------------------- | --------- | ---------------- | --------------------
105
+ page | *Integer* | page=2 | Will paginate by 100 per page.
106
+ article[title] | *String* | article[title]=Some+Title | Will match articles with titles same as the value.
107
+ article\[title\]\[\] | *Array* | article\[title\]\[\]=SomeTitle&article\[title\]\[\]=SomeOtherTitle | Will match articles with title of 'SomeTitle' OR 'SomeOtherTitle'
108
+ article[description] | *String* | article[description]=Some+Description | Will match articles with descriptions same as the value.
109
+ article\[description\]\[\] | *Array* | article\[description\]\[\]=SomeDescription&article\[description\]\[\]=SomeOtherDescription | Will match articles with description of 'SomeDescription' OR 'SomeOtherDescription'
110
+ article[content] | *String* | article[content]=Some+Content | Will match articles with contents same as the value.
111
+ article\[content\]\[\] | *Array* | article\[content\]\[\]=SomeContent&article\[content\]\[\]=SomeOtherContent | Will match articles with content of 'SomeContent' OR 'SomeOtherContent'
112
+
113
+ ## SHOW: GET '/table_name/:id'
114
+ GET '/articles/1' will return a JSON response as follows:
115
+ ```
116
+ {
117
+ "code": 200,
118
+ "object": {
119
+ "id": 1,
120
+ "created_at": "2019-08-27T08:22:19.357Z",
121
+ "updated_at": "2019-08-27T08:22:19.499Z",
122
+ "title": "Discourse on Dystopian Non Fiction",
123
+ "description": "This is an abstract description used to mislead readers into clicking on the article and take a deeper read.",
124
+ "content": "Wow, the reader actually clicked! Now let me brainwash him with this heavily opinionated article based on a myriad of unverified sources with the credibility of a personified M&M's...",
125
+ "feature_image": {
126
+ "attachment_id": 1,
127
+ "url": "http://localhost:3000/rails/active_storage/blobs/eyJfcmFpbHMiOnsib--f573ab9452c272881fb/jopmqH0.jpg"
128
+ },
129
+ "content_images": [
130
+ {
131
+ "attachment_id": 3,
132
+ "url": "http://localhost:3000/rails/active_storage/blobs/sjfioadifo-8fdjsfaj/fjso.jpg"
133
+ }, {
134
+ "attachment_id": 12,
135
+ "url": "http://localhost:3000/rails/active_storage/blobs/fjiods--k0f09fs/jfdsjk.jpg"
136
+ }
137
+ ]
138
+ }
139
+ }
140
+ ```
141
+
142
+ ## CREATE: POST '/table_name'
143
+
144
+ The create paths enforce Rails **strong params**. So only properly structured requests will be allowed.
145
+ POST '/articles' can accept a payload in the following structure:
146
+
147
+ ```
148
+ {
149
+ "article" {
150
+ "title": "Discourse on Dystopian Non Fiction",
151
+ "description": "This is an abstract description used to mislead readers into clicking on the article and take a deeper read.",
152
+ "content": "Wow, the reader actually clicked! Now let me brainwash him with this heavily opinionated article based on a myriad of unverified sources with the credibility of a personified M&M's..."
153
+ }
154
+ }
155
+ ```
156
+
157
+ If successful (and passes your ActiveRecord validations), the response will be as follows:
158
+
159
+ ```
160
+ {
161
+ "code": 200,
162
+ "msg": "success",
163
+ "object": {
164
+ "id": 1,
165
+ "created_at": "2019-08-27T08:22:19.357Z",
166
+ "updated_at": "2019-08-27T08:22:19.357Z",
167
+ "title": "Discourse on Dystopian Non Fiction",
168
+ "description": "This is an abstract description used to mislead readers into clicking on the article and take a deeper read.",
169
+ "content": "Wow, the reader actually clicked! Now let me brainwash him with this heavily opinionated article based on a myriad of unverified sources with the credibility of a personified M&M's...",
170
+ "feature_image": null,
171
+ "content_images": []
172
+ }
173
+ }
174
+ ```
175
+
176
+ **Note:** If you are using forms to submit data w/ attachments via activestorage, you can also add attachments to the payload sent, as long as it matches the naming of your activestorage attachment, and the form submission content-type is multipart/form_data.
177
+
178
+ ```
179
+ {
180
+ "article" {
181
+ "title": "Discourse on Dystopian Non Fiction",
182
+ "description": "This is an abstract description used to mislead readers into clicking on the article and take a deeper read.",
183
+ "feature_image": <uploaded_file>
184
+ }
185
+ }
186
+ ```
187
+
188
+ ## UPDATE: PATCH '/table_name/:id'
189
+
190
+ The update paths enforce Rails **strong params**. So only properly structured requests will be allowed.
191
+ PATCH '/articles/1' can accept a payload in the following structure (with one or more columns to be updated):
192
+
193
+ ```
194
+ {
195
+ "article" {
196
+ "title": "Discourse on Dystopian Non Fiction",
197
+ "description": "This is an abstract description used to mislead readers into clicking on the article and take a deeper read.",
198
+ "content": "Wow, the reader actually clicked! Now let me brainwash him with this heavily opinionated article based on a myriad of unverified sources with the credibility of a personified M&M's..."
199
+ }
200
+ }
201
+ ```
202
+
203
+ If successful (and passes your ActiveRecord validations), the response will be as follows:
204
+
205
+ ```
206
+ {
207
+ "code": 200,
208
+ "msg": "success",
209
+ "object": {
210
+ "id": 1,
211
+ "created_at": "2019-08-27T08:22:19.357Z",
212
+ "updated_at": "2019-08-27T08:22:19.357Z",
213
+ "title": "Discourse on Dystopian Non Fiction",
214
+ "description": "This is an abstract description used to mislead readers into clicking on the article and take a deeper read.",
215
+ "content": "Wow, the reader actually clicked! Now let me brainwash him with this heavily opinionated article based on a myriad of unverified sources with the credibility of a personified M&M's...",
216
+ "feature_image": null,
217
+ "content_images": []
218
+ }
219
+ }
220
+ ```
221
+
222
+ **Note:** If you are using forms to submit data w/ attachments via activestorage, you can also add attachments to the payload sent, as long as it matches the naming of your activestorage attachment, and the form submission content-type is multipart/form_data.
223
+
224
+ ```
225
+ {
226
+ "article" {
227
+ "title": "Discourse on Dystopian Non Fiction",
228
+ "feature_image": <uploaded_file>
229
+ }
230
+ }
231
+ ```
232
+
233
+ ## DESTROY: DELETE '/table_name'
234
+
235
+ DELETE '/articles/1' only needs the ID number.
236
+
237
+ If successful (and passes your ActiveRecord validations), the response will be as follows:
9
238
 
10
239
  ```
11
- mount RestRails::Engine => '/api/v1', as: 'rest'
240
+ {
241
+ "code": 200,
242
+ "msg": "success"
243
+ }
12
244
  ```
13
- ## TODO
14
245
 
15
- - Add Documentation
16
- - Add Test Suite
246
+ **Note:** If you are using activestorage, the destroy process will also automatically destroy attachments from your bucket.
247
+
248
+ ## FETCH_COLUMN: GET '/table_name/:id/:column_name'
249
+
250
+ GET '/articles/1/title'
251
+
252
+ If column exists, the response will be as follows:
253
+
254
+ ```
255
+ {
256
+ "code": 200,
257
+ "msg": "success",
258
+ "value": "Discourse on Dystopian Non Fiction"
259
+ }
260
+ ```
261
+
262
+ **Note:** If you are using activestorage, you will return the following for has_one_attached:
263
+
264
+ ```
265
+ {
266
+ "code": 200,
267
+ "msg": "success",
268
+ "value": {
269
+ "attachment_id": 1,
270
+ "url": "http://localhost:3000/rails/active_storage/blobs/eyJfcmFpbHMiOnsib--f573ab9452c272881fb/jopmqH0.jpg"
271
+ }
272
+ }
273
+ ```
274
+ And for has_many_attached:
275
+
276
+ ```
277
+ {
278
+ "code": 200,
279
+ "msg": "success",
280
+ "value": [
281
+ {
282
+ "attachment_id": 3,
283
+ "url": "http://localhost:3000/rails/active_storage/blobs/sjfioadifo-8fdjsfaj/fjso.jpg"
284
+ },
285
+ {
286
+ "attachment_id": 12,
287
+ "url": "http://localhost:3000/rails/active_storage/blobs/fjiods--k0f09fs/jfdsjk.jpg"
288
+ }
289
+ ]
290
+ }
291
+ ```
292
+
293
+ # ACTIVESTORAGE ATTACHMENTS
294
+
295
+ For activestorage attachment support, the following two routes are added to models using activestorage:
296
+
297
+ `/table_name/:id/attach/:attachment_name` and `/table_name/:id/unattach/:attachment_id`
298
+
299
+ ## ATTACH: POST '/table_name/:id/attach/:attachment_name'
300
+
301
+ The routes generated for the rest API are based on the naming provided in your ActiveRecord model when using activestorage.
302
+
303
+ - Supports both has_one_attached & has_many_attached.
304
+
305
+ In the articles example above, this would be: "/api/v1/articles/attach/feature_image"
306
+
307
+ The payload structure in this case needs only to be:
308
+ ```
309
+ {
310
+ attachment: <file_uploaded>
311
+ }
312
+ ```
313
+
314
+ If successful, the response will be as follows:
315
+
316
+ ```
317
+ {
318
+ "code": 200,
319
+ "msg": "success"
320
+ }
321
+ ```
322
+
323
+ ## UNATTACH: DELETE '/table_name/:id/unattach/:attachment_id'
324
+
325
+ *\* Note, Response will fail if the attachment_id provided does not belong to the object.*
326
+
327
+ If successful, the response will be as follows:
328
+
329
+ ```
330
+ {
331
+ "code": 200,
332
+ "msg": "success"
333
+ }
334
+ ```
335
+
336
+
337
+
338
+
339
+ ## Contribution
340
+ Here are some features in need of development.
341
+ - Add way to "protect columns" (i.e. exclude columns from permitted params for model's update/create API points).
342
+ - Support different popular attachment gems.
343
+ - Add Locale fetching based on page-routes.
@@ -1,7 +1,8 @@
1
1
  require 'json'
2
2
  module RestRails
3
- class DataController < RestRails::ApplicationController
4
- include RestRails::ApplicationHelper
3
+ class DataController < ::ApplicationController
4
+ include ApplicationHelper
5
+ skip_before_action :verify_authenticity_token
5
6
  before_action :set_model, only: [:index, :show, :create, :update, :destroy, :fetch_column, :attach, :unattach]
6
7
  before_action :set_object, only: [:show, :update, :destroy, :fetch_column, :attach, :unattach]
7
8
 
@@ -13,22 +14,29 @@ module RestRails
13
14
 
14
15
  if params[:page].blank? || (params[:page].to_i < 1)
15
16
  if @objects.empty?
16
- render json: []
17
+ @objects = []
17
18
  else
18
- render json: @objects[0].reject{|x|x.nil?}.map{|x| standardize_json(x) }
19
+ @objects = @objects[0].reject{|x|x.nil?}.map{|x| standardize_json(x) }
19
20
  end
20
21
  else
21
22
  i = params[:page].to_i - 1
22
- render json: @objects[i].reject{|x|x.nil?}.map{|x| standardize_json(x) }
23
+ objs = @objects[i]
24
+ if objs.nil?
25
+ @objects = []
26
+ else
27
+ @objects = objs.reject{|x|x.nil?}.map{|x| standardize_json(x) }
28
+ end
23
29
  end
30
+
31
+ render json: {code: 200, objects: @objects, count: @objects.count, total: @model.count}
24
32
  end
25
33
 
26
34
  def show
27
- render json: {code: 200}.merge(standardize_json(@object))
35
+ render json: {code: 200, object: standardize_json(@object)}
28
36
  end
29
37
 
30
38
  def create
31
- @object = @model.new(model_params)
39
+ @object = @empty_obj(model_params)
32
40
 
33
41
  attach_files
34
42
  if @object.save
@@ -56,18 +64,19 @@ module RestRails
56
64
  end
57
65
 
58
66
  def fetch_column
59
- raise RestRails::Error.new "Column '#{params[:column]}' does not exist for #{params[:table_name]} table!" unless @model.attribute_names.include?(params[:column])
67
+ raise RestRails::Error.new "Column '#{params[:column]}' does not exist for #{params[:table_name]} table!" unless columns_for(@object).include?(params[:column])
60
68
 
61
- render json: {code: 200, value: @object.public_send(params[:column])}
69
+ col_value = @object.public_send(params[:column])
70
+ render json: {code: 200, msg: "success", value: prepare_column(col_value)}
62
71
  end
63
72
 
64
73
  def attach
65
74
  # post '/:table_name/:id/attach/:attachment_name' => 'data#attach'
66
75
  raise RestRails::Error.new "No Attached file!" unless params[:attachment].is_a?(ActionDispatch::Http::UploadedFile)
67
- raise RestRails::Error.new "Attachment '#{params[:attachment_name]}' does not exist for #{params[:table_name]} table!" unless attachments_for(@model.new).include?(params[:attachment_name].to_sym)
76
+ raise RestRails::Error.new "Attachment '#{params[:attachment_name]}' does not exist for #{params[:table_name]} table!" unless attachments_for(@empty_obj).include?(params[:attachment_name].to_sym)
68
77
 
69
78
  @object.public_send(params[:attachment_name].to_sym).attach(params[:attachment])
70
- render json: {code: 200, msg: "attached!"}
79
+ render json: {code: 200, msg: "success"}
71
80
  end
72
81
 
73
82
  def unattach
@@ -89,6 +98,7 @@ module RestRails
89
98
 
90
99
  # Take the tablename, and make the Model of the relative table_name
91
100
  @model = model_for(params[:table_name])
101
+ @empty_obj = @model.new
92
102
  end
93
103
 
94
104
  def set_object
@@ -116,7 +126,7 @@ module RestRails
116
126
  # BASED ON ACTIVE STORAGE
117
127
  mn = @model.model_name.singular.to_sym # /users => user
118
128
  #
119
- file_set = attachments_for(@model.new)
129
+ file_set = attachments_for(@empty_obj)
120
130
  file_set.each do |fs|
121
131
  next if params[mn].blank? || params[mn][fs].blank?
122
132
  attachment = params[mn][fs]
@@ -145,7 +155,7 @@ module RestRails
145
155
 
146
156
  def permit_array?(attr)
147
157
  permitable_classes = [ActiveStorage::Attached::Many, Array]
148
- permitable_classes.include?(@model.new.send(attr).class)
158
+ permitable_classes.include?(@empty_obj.send(attr).class)
149
159
  end
150
160
 
151
161
  def permitted_columns
@@ -162,7 +172,7 @@ module RestRails
162
172
  end
163
173
 
164
174
  def permitted_attachments
165
- file_set = attachments_for(@model.new)
175
+ file_set = attachments_for(@empty_obj)
166
176
  file_set += file_set.select{|x| permit_array?(x)}.map do |attr|
167
177
  {attr=>[]}
168
178
  end
@@ -14,24 +14,40 @@ module RestRails
14
14
  h = {}
15
15
  attachment_types = attachments_for(ar_object)
16
16
  attachment_types.each do |att|
17
- attached = self.public_send(att)
18
- att_h = {attachment_id: att.id, url: link_for_attached(attached)}
19
- h[att] = att_h
17
+ attached = ar_object.public_send(att)
18
+ next if attached.nil?
19
+ h[att] = prepare_attachment(attached)
20
20
  end
21
21
  return h
22
22
  end
23
23
 
24
+ def attachment_hash(attached)
25
+ {attachment_id: attached.id, url: blob_link(attached)}
26
+ end
27
+
24
28
  def blob_link(x)
25
- host = RestRails.domain
29
+ if Rails.env == "production"
30
+ host = RestRails.production_domain || ""
31
+ else
32
+ host = RestRails.development_domain || "http://localhost:3000"
33
+ end
26
34
  Rails.application.routes.url_helpers.rails_blob_url(x, host: host)
27
35
  end
28
36
 
29
- def link_for_attached(attached)
37
+ def prepare_column(col_value)
38
+ if [ActiveStorage::Attached::Many, ActiveStorage::Attached::One].include?(col_value.class)
39
+ return prepare_attachment(col_value)
40
+ else
41
+ return col_value
42
+ end
43
+ end
44
+
45
+ def prepare_attachment(attached)
30
46
  if attached.class == ActiveStorage::Attached::Many
31
- return attached.map{|x| blob_link(x) }
47
+ return attached.map{|x| attachment_hash(x) }
32
48
  elsif attached.class == ActiveStorage::Attached::One
33
49
  x = attached.attachment
34
- return blob_link(x) unless x.nil?
50
+ return attachment_hash(x) unless x.nil?
35
51
  end
36
52
  end
37
53
 
@@ -41,6 +57,11 @@ module RestRails
41
57
  attach_meths.map{|x| x[14..-1].to_sym}
42
58
  end
43
59
 
60
+ def columns_for(ar_object)
61
+ cols = ar_object.class.attribute_names.map(&:to_sym)
62
+ cols += attachments_for(ar_object)
63
+ end
64
+
44
65
  # ==========================================================================
45
66
  # OTHER HELPERS
46
67
  # ==========================================================================
data/config/routes.rb CHANGED
@@ -1,15 +1,13 @@
1
1
  RestRails::Engine.routes.draw do
2
- scope module: 'rest_rails' do
3
- get '/:table_name' => 'data#index', as: 'data_index'
4
- post '/:table_name' => 'data#create'
2
+ get '/:table_name' => 'data#index', as: 'data_index'
3
+ post '/:table_name' => 'data#create'
5
4
 
6
- get '/:table_name/:id' => 'data#show', as: 'data_show'
7
- patch '/:table_name/:id' => 'data#update'
8
- delete '/:table_name/:id' => 'data#destroy', as: 'data_destroy'
5
+ get '/:table_name/:id' => 'data#show', as: 'data_show'
6
+ patch '/:table_name/:id' => 'data#update'
7
+ delete '/:table_name/:id' => 'data#destroy', as: 'data_destroy'
9
8
 
10
- post '/:table_name/:id/attach/:attachment_name' => 'data#attach'
11
- delete '/:table_name/:id/unattach/:attachment_id' => 'data#unattach'
9
+ post '/:table_name/:id/attach/:attachment_name' => 'data#attach'
10
+ delete '/:table_name/:id/unattach/:attachment_id' => 'data#unattach'
12
11
 
13
- get '/:table_name/:id/:column' => 'data#fetch_column'
14
- end
12
+ get '/:table_name/:id/:column' => 'data#fetch_column'
15
13
  end
@@ -0,0 +1,2 @@
1
+ rails generate rest_rails:install
2
+ ---> This sets up the rest_rails initializer
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RestRails
4
+ module Generators
5
+ class InstallGenerator < Rails::Generators::Base
6
+ namespace "rest_rails:install"
7
+ source_root File.expand_path('../templates', __FILE__)
8
+ # argument :name, :type => :string, :default => "en"
9
+ def basic_setup
10
+ # Setup Initializer
11
+ template "rest_rails.rb", "config/initializers/rest_rails.rb"
12
+ end
13
+ def setup_routes
14
+ route "mount RestRails::Engine => '/api/v1', as: 'rest'"
15
+ route "# For more information, check out the gem repo: https://github.com/sergio-rivas/rest-rails"
16
+ route "# Note: Make sure RestRails engine is at the BOTTOM of routes"
17
+ route "# RestRails standard REST API for all models"
18
+ end
19
+ def completed
20
+ readme "README"
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,27 @@
1
+ ========================================================================
2
+
3
+ _-====-__-======-__-========-_____-============-__
4
+ _( All aboard! Now hopping on... _)
5
+ OO( ╦═╗┌─┐┌─┐┌┬┐╦═╗┌─┐┬┬ ┌─┐ )_
6
+ 0 (_ ╠╦╝├┤ └─┐ │ ╠╦╝├─┤││ └─┐ _)
7
+ o0 (_ ╩╚═└─┘└─┘ ┴ ╩╚═┴ ┴┴┴─┘└─┘ _)
8
+ o '=-___-===-_____-========-___________-===-dwb-='
9
+ .o _________
10
+ . ______ ______________ | | _____
11
+ _()_||__|| ________ | by | |_________| __||___||__
12
+ ( R.R. | | | | Tuitu | __Y______00_| |_ _|
13
+ /-OO----OO""="OO--OO"="OO--------OO"="OO-------OO"="OO-------OO"=P
14
+
15
+ ========================================================================
16
+
17
+ Next Steps:
18
+
19
+ 1) Modify the initializer in /config/initializers/rest_rails.rb
20
+ 2) Read the documentation at: https://github.com/sergio-rivas/rest-rails
21
+ 3) experiment and have fun!
22
+
23
+ ---*Bonus*---
24
+ make sure to send feedback and feature requests!
25
+ And issues too, if you encounter strange errors.
26
+
27
+ Pull Requests welcome~
@@ -0,0 +1,29 @@
1
+ # Here's the configuration setup for RestRails!
2
+
3
+ RestRails.configure do |config|
4
+ # set debug to true if you want to see loud errors in the server logs.
5
+ config.debug = false
6
+
7
+ # if you are using devise or another authentication system and want to
8
+ # enforce the before_action `authenticate_user!`
9
+ #
10
+ # Note: take a look at `simple_token_authentication` or `tiddle` gems to setup
11
+ # token-based authentication for devise.
12
+ config.authenticatable = false
13
+
14
+
15
+ # ===============================================
16
+ # ACTIVE STORAGE SETTINGS FOR ATTACHMENTS
17
+ # ===============================================
18
+ # to enable REST attachments via active storage
19
+ config.active_storage_attachments = false
20
+
21
+ # to setup domains to attach to urls returned from activestorage blob_url.
22
+ # if used for WEB, you can simply put "/"
23
+ # if using for Native Apps, or WeChat/AliPay Mini Programs,
24
+ # you should have this be the domain of your API host. e.g.: 'https://api.fakeurl.com'
25
+ config.production_domain = nil
26
+
27
+ # Set development domain if needed.
28
+ config.development_domain = "http://localhost:3000"
29
+ end
@@ -1,3 +1,3 @@
1
1
  module RestRails
2
- VERSION = '0.1.0'
2
+ VERSION = '0.8.0'
3
3
  end
data/lib/rest_rails.rb CHANGED
@@ -1,10 +1,12 @@
1
1
  require "rest_rails/engine"
2
+ require "rest_rails/error"
2
3
 
3
4
  module RestRails
4
5
  mattr_accessor :debug, default: false
5
6
  mattr_accessor :authenticatable, default: false
6
7
  mattr_accessor :active_storage_attachments, default: true
7
- mattr_accessor :domain, default: 'localhost:3000'
8
+ mattr_accessor :production_domain, default: nil
9
+ mattr_accessor :development_domain, default: 'localhost:3000'
8
10
 
9
11
  def self.configure
10
12
  yield self
metadata CHANGED
@@ -1,35 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rest_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergio Rivas
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-23 00:00:00.000000000 Z
11
+ date: 2019-12-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: 6.0.2
20
17
  - - ">="
21
18
  - !ruby/object:Gem::Version
22
- version: 6.0.2.1
19
+ version: 5.2.1
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
- - - "~>"
28
- - !ruby/object:Gem::Version
29
- version: 6.0.2
30
24
  - - ">="
31
25
  - !ruby/object:Gem::Version
32
- version: 6.0.2.1
26
+ version: 5.2.1
33
27
  - !ruby/object:Gem::Dependency
34
28
  name: sqlite3
35
29
  requirement: !ruby/object:Gem::Requirement
@@ -60,6 +54,10 @@ files:
60
54
  - app/controllers/rest_rails/data_controller.rb
61
55
  - app/helpers/rest_rails/application_helper.rb
62
56
  - config/routes.rb
57
+ - lib/generators/rest_rails/USAGE
58
+ - lib/generators/rest_rails/install_generator.rb
59
+ - lib/generators/rest_rails/templates/README
60
+ - lib/generators/rest_rails/templates/rest_rails.rb
63
61
  - lib/rest_rails.rb
64
62
  - lib/rest_rails/engine.rb
65
63
  - lib/rest_rails/error.rb