upframework 0.2.2 → 0.2.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d88db49c9f1f7137b98b936cf13792218150eb0cb61c6278ff11fee45f9c8c05
4
- data.tar.gz: 5263d90be331e0459b6f3e735052758a539b2a9466987765041df221b8cb572a
3
+ metadata.gz: 65b7cd4203031fe204ae2db4b2e9f15234f70b9f8319c0b0eb0479a93b8d775d
4
+ data.tar.gz: bab9c34c224ae19444350453b103a6658bba142351ef54a516d602b34f869ca5
5
5
  SHA512:
6
- metadata.gz: 801d5101e0aadd229c9c698dc43dd9850d896fb244274a388d3bcb5df3596a2d83ce3a08ab0645eb4d154d487bdfa8629d63332d4cbf17245c8b1aa1b8eed439
7
- data.tar.gz: f21de820db493c15daea315e7fff83439ec5c286da810b22860e6b981e45417c45ea08c201cccc53fb45ac319212c652f6ce77c02ee0bfa1601a58b0fa974d63
6
+ metadata.gz: 98e0d8b2a6405ccd13098554c6c219b9b1f3bc551c9d321f4378a71bb39cbd468a34260818b2f0a14abeba83060a9692fdf86163fbf8d92d2121b836ea67efcd
7
+ data.tar.gz: 93d0add617417cfd7fe6052d6557525fc22626069032a37677e9b9d5ba43257828694ad35edca4eec0f676e75f8ec510ffc876c2aa9cd208442dbf48dc12492e
data/README.md CHANGED
@@ -4,39 +4,100 @@ Add features on top of Rails, Especially for APIs. This was created to make stru
4
4
  #### The following features are available.
5
5
  - Creates (create, read, update, destroy) action methods for resources.
6
6
  - Has render helpers for API or socket responses. ex. Converting models to its designated serializer.
7
- - Converts snake case request params (from js standard) to underscore params (ruby standard)
7
+ - Converts snake case request params (from js standard) to underscore params (ruby standard)
8
8
  - Searches layer under app/searches. Usually used for form searches.
9
9
  - Services layer under app/services. For single responsibility domain-specific logic code.
10
10
  - Exception notifier and API error response handler.
11
11
 
12
12
  ## Basic Usage
13
- ####Controllers
13
+ #### Controllers
14
14
  ```ruby
15
- #app/controllers
15
+ # app/controllers
16
+ # create,show,update,destroy methods are available by default
16
17
  class ProjectsController < Upframework::ResourcesController
18
+ # Example of broadcasting with a serialized object using ActionCables.
19
+ def udate
20
+ super do
21
+ channel = @project.user
22
+ broadcast_serialized(channel, resource: @project, event: "Project Updated")
23
+ end
24
+ end
25
+
26
+ # Example of rendering serialized responsed. This is using fast_jsonapi serializer.
27
+ def custom_action
28
+ render_serialized @project
29
+ end
30
+ end
31
+ ```
32
+
33
+
34
+ #### Serializers
35
+ ```ruby
36
+ # app/serializers
37
+ # classes extending Upframework::BaseSerializer has pagination and meta data enabled
38
+ class ProjectSerializer < Upframework::BaseSerializer
39
+ belongs_to :user
40
+
41
+ has_many :tasks
42
+
43
+ default_includes [:user]
17
44
  end
18
45
  ```
19
46
 
20
- ####Searches
47
+ #### Searches
21
48
  ```ruby
22
49
  #app/searches
23
50
  class ProjectSearch < Upframework::BaseSearch
51
+ def post_initialize
52
+ @per_page = 10
53
+ @scope = Project.accessible_by(@current_ability)
54
+ end
55
+
56
+ def execute
57
+ # query logic here using scope object defined above
58
+ # by default results are paginated
59
+ end
24
60
  end
25
61
  ```
62
+ ```
63
+ #search api available in
64
+ /search?resource=Project&arg1=""&arg2=""
65
+ ```
26
66
 
27
- ####Services
67
+ #### Services
28
68
  ```ruby
29
69
  #app/services
30
- class Project::SubmitService < Upframework::BaseService
70
+ class Project::SubmitService < Upframework::BaseService
71
+ def post_initialize(id:, **attrs)
72
+ @project = Project.find(id)
73
+ end
74
+
75
+ def execute
76
+ # put main logic here
77
+ # ...
78
+ project.save
79
+ end
80
+
81
+ def result
82
+ project
83
+ end
31
84
  end
85
+
86
+ service = Project::SubmitService.run
87
+ service.result => <Project: Instance>
88
+ service.success? => true/false
32
89
  ```
33
90
 
34
- ####Routes
35
- app/services
91
+ #### Routes
36
92
  ```ruby
37
93
  #config/routes
38
94
  mount Upframework::Engine => /path
39
95
  ```
96
+ routes being available
97
+ ```
98
+ GET /search
99
+ POST /{resource}/services/:service_name
100
+ ```
40
101
 
41
102
  ## Installation
42
103
  Add this line to your application's Gemfile:
@@ -7,20 +7,18 @@ class Upframework::BaseSearch < Upframework::BaseService
7
7
  end
8
8
 
9
9
  def query(field)
10
- @model_scope = yield if present_value?(field)
10
+ @model_scope = yield if field.present?
11
11
  end
12
12
 
13
13
  def paginate_scope
14
+ return if @model_scope.nil?
15
+
14
16
  @model_scope = @model_scope.
15
17
  page(@page || DEFAULT_PAGE).
16
18
  per(@per_page || DEFAULT_PER_PAGE).
17
19
  order(created_at: :desc)
18
20
  end
19
21
 
20
- def present_value?(field)
21
- instance_variable_get("@#{field}").present?
22
- end
23
-
24
22
  module ExecuteWrapper
25
23
  def execute
26
24
  super
@@ -0,0 +1,56 @@
1
+ module Upframework
2
+ class BaseSerializer
3
+ include JSONAPI::Serializer
4
+
5
+ attr_reader :resource, :current_controller
6
+
7
+ delegate :view_context, to: :current_controller
8
+
9
+ set_key_transform :camel_lower
10
+ attributes :created_at, :updated_at
11
+
12
+ def initialize(resource, current_controller: nil, **args)
13
+ @resource = resource
14
+ @current_controller = current_controller
15
+
16
+ if args[:format] == :minimal
17
+ args[:fields] = set_format
18
+ end
19
+
20
+ if @current_controller && resource.respond_to?(:total_pages)
21
+ args.merge!(pagination)
22
+ end
23
+
24
+ super(resource, **args)
25
+ end
26
+
27
+ def set_format
28
+ resource_klass = resource.class.name
29
+ resource_klass = resource.klass.name if resource_klass == 'ActiveRecord::Relation'
30
+ resource_klass = resource.first.class.name if resource.kind_of?(Array)
31
+
32
+ { resource_klass.camelize(:lower) => [:id] }
33
+ end
34
+
35
+ def pagination
36
+ {
37
+ meta: {
38
+ per_page: resource.size,
39
+ total_pages: resource.total_pages,
40
+ },
41
+ links: {
42
+ prev: view_context.path_to_prev_page(resource),
43
+ next: view_context.path_to_next_page(resource),
44
+ },
45
+ }.deep_transform_keys { |key| key.to_s.camelize(:lower).to_sym }
46
+ end
47
+
48
+ def self.default_includes(relations = [])
49
+ @relations ||= relations
50
+ end
51
+
52
+ class << self
53
+ delegate :url_helpers, to: :'Rails.application.routes'
54
+ end
55
+ end
56
+ end
@@ -1,3 +1,3 @@
1
1
  module Upframework
2
- VERSION = '0.2.2'
2
+ VERSION = '0.2.8'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: upframework
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - jude_cali
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-26 00:00:00.000000000 Z
11
+ date: 2020-07-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -45,19 +45,19 @@ dependencies:
45
45
  - !ruby/object:Gem::Version
46
46
  version: 3.1.0
47
47
  - !ruby/object:Gem::Dependency
48
- name: fast_jsonapi
48
+ name: jsonapi-serializer
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: '1.5'
53
+ version: '2.0'
54
54
  type: :runtime
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: '1.5'
60
+ version: '2.0'
61
61
  description: Rails framework extensions
62
62
  email:
63
63
  - jcalimbas@fullscale.io
@@ -82,6 +82,7 @@ files:
82
82
  - app/mailers/upframework/application_mailer.rb
83
83
  - app/models/upframework/application_record.rb
84
84
  - app/searches/upframework/base_search.rb
85
+ - app/serializers/upframework/base_serializer.rb
85
86
  - app/services/concerns/upframework/service_endpoint.rb
86
87
  - app/services/upframework/base_service.rb
87
88
  - app/views/layouts/upframework/application.html.erb