upframework 0.3.0 → 0.4.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: fda63a549c9735a9a31301a41873c22fb350fa486ca3acb508b08ac7b29a2140
4
- data.tar.gz: e2a324a2c405d0becd5445389ac0777430d8e1dfcbac1933c6ab475b07636f0c
3
+ metadata.gz: 3d78ce308cddeb5a32b7797a7e26d25cfdf1f0709a17e81a600861d8b82076e8
4
+ data.tar.gz: c31b0a99dc060af46a8bf1f7d749f129df8064fd8e56c46a3226a6d215f94ebf
5
5
  SHA512:
6
- metadata.gz: 4b7f31acec08d2d3a0c06d86656cebcf229e4d6813e664eae95d97923f5cd8a48b14a2b0b1721e242f3a5a179a4086844307180772ff423e0826f5169fca813c
7
- data.tar.gz: d5cbeb810d372e6982515f13e2507e512fc60e0504f7438bf97da90776cb9a15d35b70d45b6c65bee69e1de0b610fbcbbce77044b1178a2c8b1435e2a9f775e7
6
+ metadata.gz: 8ca6e587887c644c1d3067ac8bd50b0b85a55e52c73cd5e3734f052bc93b8f5c68e9135ce45695b9937b75b6bc6dfc66bee00ef8484ae093ab9cf3aa12f9a519
7
+ data.tar.gz: 918fe786f0fcd0364d306623e1d5c06be4ebcf4fe2fc342f79542c0da6ec7f8ff42074939b30154cd4f3652f8e525a16c1f1ad8911eeba5cc7cbb9b46f07ad59
@@ -11,8 +11,11 @@ module Upframework
11
11
  # format => format can be :full(returns all default) or :minimal(returns only ids an types)
12
12
  # compound_opts => options, e.g: meta or links
13
13
  # opts => extra options from render
14
- def render_serialized(resource, includes: [], format: :full, compound_opts: {}, **opts)
15
- render json: serialize_resource(resource, includes, format, compound_opts), **opts
14
+ def render_serialized(resource, options)
15
+ options = options.is_a?(ActionController::Parameters) ? options.to_unsafe_h.symbolize_keys : options
16
+ options[:current_controller] = self
17
+
18
+ render json: serialize_resource(resource, options).as_json, **options.except(:format)
16
19
  end
17
20
 
18
21
  # Args
@@ -33,28 +36,14 @@ module Upframework
33
36
 
34
37
  protected
35
38
 
36
- def serialize_resource(resource, includes, format, compound_opts)
39
+ def serialize_resource(resource, options)
37
40
  resource_klass = resource.class.name
38
- if resource_klass == 'ActiveRecord::Relation'
39
- resource_klass = resource.klass.name
40
- end
41
- # TODO: support empty arrays
42
- resource_klass = resource.first.class.name if resource.is_a? Array
43
-
44
- serializer_klass = "#{resource_klass}Serializer".constantize
45
-
46
- relations = serializer_klass.default_includes
47
41
 
48
- includes =
49
- if includes.is_a? String
50
- includes.split(",").map(&:underscore).map(&:to_sym)
51
- else
52
- Array(includes).map(&:to_sym)
53
- end
54
-
55
- relations.concat(includes.compact)
56
-
57
- serializer_klass.new(resource, include: relations, format: format, current_controller: self, **compound_opts).serializable_hash
42
+ if resource.respond_to? :each
43
+ ::Serializer::Collection.new(resource, **options)
44
+ else
45
+ ::Serializer::Item.new(resource, **options)
46
+ end
58
47
  end
59
48
  end
60
49
  end
@@ -6,13 +6,13 @@ module Upframework
6
6
  base_resource
7
7
 
8
8
  yield if block_given?
9
- render_serialized base_resource
9
+ render_serialized base_resource, params
10
10
  end
11
11
 
12
12
  def update
13
13
  if base_resource.update(base_resource_params)
14
14
  yield if block_given?
15
- render_serialized base_resource
15
+ render_serialized base_resource, params
16
16
  else
17
17
  render_errors base_resource.errors.full_messages
18
18
  end
@@ -22,14 +22,14 @@ module Upframework
22
22
  base_resource
23
23
 
24
24
  yield if block_given?
25
- render_serialized base_resource, includes: params[:includes]
25
+ render_serialized base_resource, params
26
26
  end
27
27
 
28
28
  def create
29
29
  if base_resource.save
30
30
 
31
31
  yield if block_given?
32
- render_serialized base_resource
32
+ render_serialized base_resource, params
33
33
  else
34
34
  render_errors base_resource.errors.full_messages
35
35
  end
@@ -0,0 +1,37 @@
1
+ class Serializer::Collection
2
+ attr_accessor :records, :includes, :compound_opts, :format, :current_controller
3
+
4
+ def initialize(records, includes: [], compound_opts: {}, **params)
5
+ @records = ::Serializer::Pagination.run(records: records, page: params[:page], per_page: params[:per_page], **params).result
6
+ @records = ::Serializer::Sort.run(records: @records, sort: params[:sort], **params).result
7
+
8
+ @includes = includes
9
+ @compound_opts = compound_opts
10
+ @format = params[:format]
11
+ @current_controller = params[:current_controller]
12
+ end
13
+
14
+ def as_json
15
+ serializer_klass.new(records, include: relation_includes, format: format, current_controller: current_controller, **compound_opts).serializable_hash
16
+ end
17
+
18
+ def serializer_klass
19
+ resource_klass = records.klass if records.is_a? ActiveRecord::Relation
20
+ resource_klass = records.first.class if records.is_a? Array
21
+
22
+ "#{resource_klass.name}Serializer".constantize
23
+ end
24
+
25
+ def relation_includes
26
+ relations = serializer_klass.default_includes
27
+
28
+ @includes =
29
+ if includes.is_a? String
30
+ includes.split(",").map(&:underscore).map(&:to_sym)
31
+ else
32
+ Array(includes).map(&:to_sym)
33
+ end
34
+
35
+ relations.concat(includes.compact)
36
+ end
37
+ end
@@ -0,0 +1,32 @@
1
+ class Serializer::Item
2
+ attr_accessor :record, :includes, :compound_opts, :current_controller, :format
3
+
4
+ def initialize(item, includes: [], compound_opts: {}, **params)
5
+ @record = item
6
+ @includes = includes
7
+ @compound_opts = compound_opts
8
+ @current_controller = params[:current_controller]
9
+ @format = params[:format]
10
+ end
11
+
12
+ def serializer_klass
13
+ "#{record.class.name}Serializer".constantize
14
+ end
15
+
16
+ def as_json
17
+ serializer_klass.new(record, include: relation_includes, format: format, current_controller: current_controller, **compound_opts).serializable_hash
18
+ end
19
+
20
+ def relation_includes
21
+ relations = serializer_klass.default_includes
22
+
23
+ @includes =
24
+ if includes.is_a? String
25
+ includes.split(",").map(&:underscore).map(&:to_sym)
26
+ else
27
+ Array(includes).map(&:to_sym)
28
+ end
29
+
30
+ relations.concat(includes.compact)
31
+ end
32
+ end
@@ -0,0 +1,26 @@
1
+ class Serializer::Pagination < Upframework::BaseService
2
+ DEFAULT_PAGE = 1
3
+ DEFAULT_PER_PAGE = 20
4
+
5
+ attr_accessor :records, :page, :per_page
6
+
7
+ def initialize(records: [], page:, per_page:, **params)
8
+ @records = records
9
+ @page = page
10
+ @per_page = per_page
11
+ end
12
+
13
+ def execute
14
+ paginate_scope
15
+ end
16
+
17
+ def result
18
+ records
19
+ end
20
+
21
+ def paginate_scope
22
+ @records = records.
23
+ page(page || DEFAULT_PAGE).
24
+ per(per_page || DEFAULT_PER_PAGE)
25
+ end
26
+ end
@@ -0,0 +1,20 @@
1
+ class Serializer::Sort < Upframework::BaseService
2
+ attr_accessor :records
3
+
4
+ def initialize(records: [], sort: nil, **params)
5
+ @records = records
6
+ @sort = sort
7
+ end
8
+
9
+ def execute
10
+ sort_scope
11
+ end
12
+
13
+ def result
14
+ records
15
+ end
16
+
17
+ def sort_scope
18
+ #TODO sort scope here
19
+ end
20
+ end
@@ -9,22 +9,4 @@ class Upframework::BaseSearch < Upframework::BaseService
9
9
  def query(field)
10
10
  @model_scope = yield if field.present?
11
11
  end
12
-
13
- def paginate_scope
14
- return if @model_scope.nil?
15
-
16
- @model_scope = @model_scope.
17
- page(@page || DEFAULT_PAGE).
18
- per(@per_page || DEFAULT_PER_PAGE).
19
- order(created_at: :desc)
20
- end
21
-
22
- module ExecuteWrapper
23
- def execute
24
- super
25
- paginate_scope
26
- end
27
- end
28
-
29
- include ExecuteWrapper
30
12
  end
@@ -27,6 +27,7 @@ module Upframework
27
27
 
28
28
  def execute
29
29
  end
30
+ alias_method :run, :execute
30
31
 
31
32
  def result
32
33
  end
@@ -1,3 +1,3 @@
1
1
  module Upframework
2
- VERSION = '0.3.0'
2
+ VERSION = '0.4.0'
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.3.0
4
+ version: 0.4.0
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-08-16 00:00:00.000000000 Z
11
+ date: 2020-09-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -70,7 +70,6 @@ files:
70
70
  - Rakefile
71
71
  - app/assets/config/upframework_manifest.js
72
72
  - app/assets/stylesheets/upframework/application.css
73
- - app/controllers/concerns/upframework/crud_endpoint.rb
74
73
  - app/controllers/concerns/upframework/error_handler.rb
75
74
  - app/controllers/concerns/upframework/render_extensions.rb
76
75
  - app/controllers/concerns/upframework/transform_param_keys.rb
@@ -79,6 +78,10 @@ files:
79
78
  - app/controllers/upframework/searches_controller.rb
80
79
  - app/helpers/upframework/application_helper.rb
81
80
  - app/jobs/upframework/application_job.rb
81
+ - app/lib/serializer/collection.rb
82
+ - app/lib/serializer/item.rb
83
+ - app/lib/serializer/pagination.rb
84
+ - app/lib/serializer/sort.rb
82
85
  - app/mailers/upframework/application_mailer.rb
83
86
  - app/models/upframework/application_record.rb
84
87
  - app/searches/upframework/base_search.rb
@@ -1,98 +0,0 @@
1
- # frozen_string_literal: true
2
- module Upframework::CrudEndpoint
3
- extend ::ActiveSupport::Concern
4
-
5
- included do
6
- before_action :set_base_resource
7
- end
8
-
9
- def show
10
- base_resource
11
-
12
- yield if block_given?
13
- render_serialized base_resource
14
- end
15
-
16
- def update
17
- if base_resource.update(base_resource_params)
18
- yield if block_given?
19
- render_serialized base_resource
20
- else
21
- render_errors base_resource.errors.full_messages
22
- end
23
- end
24
-
25
- def index
26
- base_resource
27
-
28
- yield if block_given?
29
- render_serialized base_resource, includes: params[:includes]
30
- end
31
-
32
- def create
33
- if base_resource.save
34
-
35
- yield if block_given?
36
- render_serialized base_resource
37
- else
38
- render_errors base_resource.errors.full_messages
39
- end
40
- end
41
-
42
- def destroy
43
- base_resource.destroy
44
- head :no_content
45
- end
46
-
47
- private
48
-
49
- def base_resource
50
- if params[:id]
51
- instance_variable_get("@#{base_resource_name}")
52
- else
53
- instance_variable_get("@#{base_resource_name.pluralize}")
54
- end
55
- end
56
-
57
- def set_base_resource
58
- data =
59
- if params[:id]
60
- base_resource_class.find(params[:id])
61
- elsif action_name == 'index'
62
- base_resource_class.accessible_by(current_ability).where(base_resource_params || {})
63
- elsif action_name == 'create'
64
- base_resource_class.new(base_resource_params)
65
- end
66
-
67
- resource_name = %w[index create].include?(action_name) \
68
- ? base_resource_name.pluralize \
69
- : base_resource_name
70
-
71
- instance_variable_set("@#{resource_name}", data) if data
72
- end
73
-
74
- def base_resource_params
75
- base_name = base_resource_name
76
-
77
- base_name = base_name.pluralize unless params.key?(base_name)
78
-
79
- params.fetch(base_name).permit(*permitted_columns)
80
- end
81
-
82
- def permitted_columns
83
- columns = base_resource_class.accessible_fields_by(accessors)
84
- columns.concat(extra_params)
85
- end
86
-
87
- def accessors
88
- current_user
89
- end
90
-
91
- def base_resource_name
92
- controller_name.singularize
93
- end
94
-
95
- def base_resource_class
96
- base_resource_name.classify.safe_constantize
97
- end
98
- end