api_maker 0.0.1 → 0.0.2

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.
Files changed (135) hide show
  1. checksums.yaml +4 -4
  2. data/app/api_maker/api_helpers/api_maker_helpers.rb +5 -0
  3. data/app/api_maker/services/can_can/load_abilities.rb +30 -0
  4. data/app/api_maker/services/devise/sign_in.rb +64 -0
  5. data/app/api_maker/services/devise/sign_out.rb +9 -0
  6. data/app/api_maker/services/models/find_or_create_by.rb +18 -0
  7. data/app/channels/api_maker/subscriptions_channel.rb +33 -2
  8. data/app/controllers/api_maker/base_controller.rb +7 -3
  9. data/app/controllers/api_maker/commands_controller.rb +26 -4
  10. data/app/controllers/api_maker/session_statuses_controller.rb +1 -1
  11. data/app/services/api_maker/abilities_loader.rb +104 -0
  12. data/app/services/api_maker/application_service.rb +2 -1
  13. data/app/services/api_maker/base_command.rb +248 -0
  14. data/app/services/api_maker/collection_command_service.rb +29 -15
  15. data/app/services/api_maker/collection_loader.rb +124 -0
  16. data/app/services/api_maker/command_failed_error.rb +3 -0
  17. data/app/services/api_maker/command_response.rb +17 -6
  18. data/app/services/api_maker/command_service.rb +3 -3
  19. data/app/services/api_maker/create_command.rb +11 -26
  20. data/app/services/api_maker/create_command_service.rb +3 -3
  21. data/app/services/api_maker/database_type.rb +9 -0
  22. data/app/services/api_maker/deep_merge_params.rb +26 -0
  23. data/app/services/api_maker/deserializer.rb +35 -0
  24. data/app/services/api_maker/destroy_command.rb +15 -21
  25. data/app/services/api_maker/destroy_command_service.rb +3 -3
  26. data/app/services/api_maker/generate_react_native_api_service.rb +3 -19
  27. data/app/services/api_maker/include_helpers.rb +17 -0
  28. data/app/services/api_maker/index_command.rb +8 -88
  29. data/app/services/api_maker/index_command_service.rb +5 -5
  30. data/app/services/api_maker/js_method_namer_service.rb +1 -1
  31. data/app/services/api_maker/locals_from_controller.rb +14 -0
  32. data/app/services/api_maker/member_command_service.rb +15 -13
  33. data/app/services/api_maker/model_classes_java_script_generator_service.rb +37 -0
  34. data/app/services/api_maker/model_content_generator_service.rb +17 -21
  35. data/app/services/api_maker/models/save.rb +29 -0
  36. data/app/services/api_maker/models_finder_service.rb +6 -2
  37. data/app/services/api_maker/models_generator_service.rb +6 -43
  38. data/app/services/api_maker/move_components_to_routes.rb +50 -0
  39. data/app/services/api_maker/primary_id_for_model.rb +6 -0
  40. data/app/services/api_maker/reset_indexed_db_service.rb +36 -0
  41. data/app/services/api_maker/routes_file_reloader.rb +20 -0
  42. data/app/services/api_maker/select_columns_on_collection.rb +78 -0
  43. data/app/services/api_maker/select_parser.rb +32 -0
  44. data/app/services/api_maker/service_command.rb +27 -0
  45. data/app/services/api_maker/service_command_service.rb +14 -0
  46. data/app/services/api_maker/simple_model_errors.rb +52 -0
  47. data/app/services/api_maker/update_command.rb +8 -24
  48. data/app/services/api_maker/update_command_service.rb +3 -3
  49. data/app/services/api_maker/valid_command.rb +4 -13
  50. data/app/services/api_maker/valid_command_service.rb +3 -3
  51. data/app/services/api_maker/validation_errors_generator_service.rb +146 -0
  52. data/app/views/api_maker/_data.html.erb +17 -11
  53. data/config/routes.rb +0 -2
  54. data/lib/api_maker/ability.rb +22 -7
  55. data/lib/api_maker/ability_loader.rb +9 -6
  56. data/lib/api_maker/base_collection_instance.rb +15 -0
  57. data/lib/api_maker/base_resource.rb +135 -9
  58. data/lib/api_maker/base_service.rb +14 -0
  59. data/lib/api_maker/collection_serializer.rb +95 -34
  60. data/lib/api_maker/command_spec_helper.rb +41 -11
  61. data/lib/api_maker/configuration.rb +31 -4
  62. data/lib/api_maker/expect_to_able_to_helper.rb +31 -0
  63. data/lib/api_maker/individual_command.rb +24 -9
  64. data/lib/api_maker/javascript/model-template.js.erb +39 -25
  65. data/lib/api_maker/javascript/models.js.erb +6 -0
  66. data/lib/api_maker/loader.rb +1 -1
  67. data/lib/api_maker/memory_storage.rb +1 -1
  68. data/lib/api_maker/model_extensions.rb +34 -18
  69. data/lib/api_maker/permitted_params_argument.rb +5 -1
  70. data/lib/api_maker/preloader.rb +71 -32
  71. data/lib/api_maker/preloader_base.rb +108 -0
  72. data/lib/api_maker/preloader_belongs_to.rb +34 -33
  73. data/lib/api_maker/preloader_has_many.rb +45 -39
  74. data/lib/api_maker/preloader_has_one.rb +30 -47
  75. data/lib/api_maker/railtie.rb +3 -11
  76. data/lib/api_maker/relationship_preloader.rb +42 -0
  77. data/lib/api_maker/resource_routing.rb +18 -4
  78. data/lib/api_maker/result_parser.rb +34 -20
  79. data/lib/api_maker/serializer.rb +53 -22
  80. data/lib/api_maker/spec_helper/browser_logs.rb +14 -0
  81. data/lib/api_maker/spec_helper/execute_collection_command.rb +46 -0
  82. data/lib/api_maker/spec_helper/execute_member_command.rb +52 -0
  83. data/lib/api_maker/spec_helper/expect_no_browser_errors.rb +18 -0
  84. data/lib/api_maker/spec_helper/wait_for_expect.rb +20 -0
  85. data/lib/api_maker/spec_helper/wait_for_flash_message.rb +21 -0
  86. data/lib/api_maker/spec_helper.rb +112 -48
  87. data/lib/api_maker/version.rb +1 -1
  88. data/lib/api_maker.rb +7 -3
  89. metadata +108 -89
  90. data/README.md +0 -476
  91. data/app/controllers/api_maker/devise_controller.rb +0 -60
  92. data/lib/api_maker/base_command.rb +0 -81
  93. data/lib/api_maker/javascript/api.js +0 -92
  94. data/lib/api_maker/javascript/base-model.js +0 -543
  95. data/lib/api_maker/javascript/bootstrap/attribute-row.jsx +0 -16
  96. data/lib/api_maker/javascript/bootstrap/attribute-rows.jsx +0 -47
  97. data/lib/api_maker/javascript/bootstrap/card.jsx +0 -79
  98. data/lib/api_maker/javascript/bootstrap/checkbox.jsx +0 -127
  99. data/lib/api_maker/javascript/bootstrap/checkboxes.jsx +0 -105
  100. data/lib/api_maker/javascript/bootstrap/live-table.jsx +0 -168
  101. data/lib/api_maker/javascript/bootstrap/money-input.jsx +0 -136
  102. data/lib/api_maker/javascript/bootstrap/radio-buttons.jsx +0 -80
  103. data/lib/api_maker/javascript/bootstrap/select.jsx +0 -168
  104. data/lib/api_maker/javascript/bootstrap/string-input.jsx +0 -203
  105. data/lib/api_maker/javascript/cable-connection-pool.js +0 -169
  106. data/lib/api_maker/javascript/cable-subscription-pool.js +0 -111
  107. data/lib/api_maker/javascript/cable-subscription.js +0 -33
  108. data/lib/api_maker/javascript/collection.js +0 -186
  109. data/lib/api_maker/javascript/commands-pool.js +0 -123
  110. data/lib/api_maker/javascript/custom-error.js +0 -14
  111. data/lib/api_maker/javascript/deserializer.js +0 -35
  112. data/lib/api_maker/javascript/devise.js.erb +0 -113
  113. data/lib/api_maker/javascript/error-logger.js +0 -119
  114. data/lib/api_maker/javascript/event-connection.jsx +0 -24
  115. data/lib/api_maker/javascript/event-created.jsx +0 -26
  116. data/lib/api_maker/javascript/event-destroyed.jsx +0 -26
  117. data/lib/api_maker/javascript/event-emitter-listener.jsx +0 -32
  118. data/lib/api_maker/javascript/event-listener.jsx +0 -41
  119. data/lib/api_maker/javascript/event-updated.jsx +0 -26
  120. data/lib/api_maker/javascript/form-data-to-object.js +0 -70
  121. data/lib/api_maker/javascript/included.js +0 -39
  122. data/lib/api_maker/javascript/key-value-store.js +0 -47
  123. data/lib/api_maker/javascript/logger.js +0 -23
  124. data/lib/api_maker/javascript/model-name.js +0 -21
  125. data/lib/api_maker/javascript/models-response-reader.js +0 -43
  126. data/lib/api_maker/javascript/paginate.jsx +0 -128
  127. data/lib/api_maker/javascript/params.js +0 -68
  128. data/lib/api_maker/javascript/resource-route.jsx +0 -75
  129. data/lib/api_maker/javascript/resource-routes.jsx +0 -36
  130. data/lib/api_maker/javascript/result.js +0 -25
  131. data/lib/api_maker/javascript/session-status-updater.js +0 -113
  132. data/lib/api_maker/javascript/sort-link.jsx +0 -88
  133. data/lib/api_maker/javascript/updated-attribute.jsx +0 -60
  134. data/lib/api_maker/preloader_through.rb +0 -101
  135. data/lib/api_maker/relationship_includer.rb +0 -42
@@ -1,66 +1,127 @@
1
1
  class ApiMaker::CollectionSerializer
2
- def initialize(ability: nil, args: {}, collection:, include_param:, select: nil)
3
- @ability = ability || ApiMaker::Ability.new(args: args)
4
- @args = args
2
+ attr_reader :ability, :api_maker_args, :collection, :locals, :preload_param, :query_params, :select, :select_columns
3
+
4
+ def initialize(ability: nil, api_maker_args: {}, collection:, locals: nil, model_class: nil, query_params: nil)
5
+ raise "No collection was given" unless collection
6
+
7
+ @query_params = query_params || {}
8
+ @ability = ability || ApiMaker::Ability.new(api_maker_args: api_maker_args)
9
+ @api_maker_args = api_maker_args
5
10
  @collection = collection
6
- @include_param = include_param
7
- @select = select
11
+ @locals = locals || api_maker_args&.dig(:locals) || {}
12
+ @preload_param = @query_params[:preload]
13
+ @model_class = model_class
14
+ @select = ApiMaker::SelectParser.execute!(select: query_params[:select]) if @query_params[:select]
15
+ @select_columns = @query_params[:select_columns]
8
16
  end
9
17
 
10
18
  def result
11
19
  @result ||= begin
12
20
  data = {
13
21
  data: {},
14
- included: {}
22
+ preloaded: {}
15
23
  }
16
24
 
17
25
  records = {}
26
+ parsed_collection.map do |model|
27
+ add_model_to_records(model, data, records)
28
+ end
18
29
 
19
- ApiMaker::Configuration.profile("CollectionSerializer result collection map") do
20
- @collection.map do |model|
21
- serializer = ApiMaker::Serializer.new(ability: @ability, args: @args, model: model, select: select_for(model))
22
- resource = serializer.resource
23
- collection_name = resource.collection_name
24
- id = model.id
30
+ preload_collection(data, records) if parsed_collection.length.positive?
31
+ load_abilities(data) if query_params[:abilities]
25
32
 
26
- data.fetch(:included)[collection_name] ||= {}
27
- data.fetch(:included)[collection_name][id] ||= serializer
33
+ data
34
+ end
35
+ end
28
36
 
29
- data.fetch(:data)[collection_name] ||= []
30
- data.fetch(:data)[collection_name] << id
37
+ def load_abilities(data)
38
+ data.fetch(:preloaded).each_value do |models|
39
+ next if models.empty?
31
40
 
32
- records[collection_name] ||= {}
33
- records[collection_name][id] ||= serializer
34
- end
35
- end
41
+ serializers = models.values
42
+ serializer = models.values.first
43
+ abilities = query_params.dig(:abilities, serializer.resource.require_name)
36
44
 
37
- preload_collection(data, records) if @collection.length.positive?
45
+ ApiMaker::AbilitiesLoader.execute!(abilities: abilities, ability: ability, serializers: serializers) if abilities && serializers
46
+ end
47
+ end
38
48
 
39
- data
49
+ def add_model_to_records(model, data, records)
50
+ serializer = serializer_for_model(model)
51
+ resource = serializer.resource
52
+ collection_name = resource.collection_name
53
+ records[collection_name] ||= {}
54
+
55
+ if model.new_record?
56
+ id = "new-#{records.fetch(collection_name).length}"
57
+ else
58
+ id = ApiMaker::PrimaryIdForModel.get(model)
40
59
  end
60
+
61
+ data.fetch(:preloaded)[collection_name] ||= {}
62
+ data.fetch(:preloaded)[collection_name][id] ||= serializer
63
+
64
+ data.fetch(:data)[collection_name] ||= []
65
+ data.fetch(:data)[collection_name] << id
66
+
67
+ records[collection_name][id] ||= serializer
41
68
  end
42
69
 
43
70
  def as_json(options = nil)
44
71
  result.as_json(options)
45
72
  end
46
73
 
47
- def preload_collection(data, records)
48
- ApiMaker::Configuration.profile("CollectionSerializer result preloading") do
49
- preloader = ApiMaker::Preloader.new(
50
- ability: @ability,
51
- args: @args,
52
- collection: @collection,
53
- data: data,
54
- include_param: @include_param,
55
- records: records,
56
- select: @select
74
+ def model_class
75
+ @model_class ||= if collection.is_a?(Array)
76
+ collection.first.class
77
+ else
78
+ resource.model_class
79
+ end
80
+ end
81
+
82
+ def resource
83
+ @resource ||= if collection.is_a?(Array)
84
+ ApiMaker::MemoryStorage.current.resource_for_model(collection.first.class)
85
+ else
86
+ ApiMaker::MemoryStorage.current.resource_for_model(collection.klass)
87
+ end
88
+ end
89
+
90
+ def parsed_collection
91
+ @parsed_collection ||= begin
92
+ new_collection = ApiMaker::SelectColumnsOnCollection.execute!(
93
+ collection: collection,
94
+ model_class: model_class,
95
+ select_attributes: select,
96
+ select_columns: select_columns
57
97
  )
58
- preloader.fill_data
98
+ new_collection = new_collection.fix if !new_collection.is_a?(Array) && ApiMaker::DatabaseType.postgres?
99
+ new_collection
59
100
  end
60
101
  end
61
102
 
103
+ def preload_collection(data, records)
104
+ preloader = ApiMaker::Preloader.new(
105
+ ability: ability,
106
+ api_maker_args: api_maker_args,
107
+ collection: parsed_collection,
108
+ data: data,
109
+ locals: locals,
110
+ preload_param: preload_param,
111
+ model_class: model_class,
112
+ records: records,
113
+ select: select,
114
+ select_columns: select_columns
115
+ )
116
+ preloader.fill_data
117
+ end
118
+
62
119
  def select_for(model)
63
- @select&.dig(model.class)
120
+ select&.dig(model.class)
121
+ end
122
+
123
+ def serializer_for_model(model)
124
+ ApiMaker::Serializer.new(ability: ability, api_maker_args: api_maker_args, locals: locals, model: model, select: select_for(model))
64
125
  end
65
126
 
66
127
  def to_json(options = nil)
@@ -21,23 +21,53 @@ class ApiMaker::CommandSpecHelper
21
21
  end
22
22
 
23
23
  def command
24
- @command ||= command_class.new(
25
- ability: controller.__send__(:current_ability),
26
- args: controller.__send__(:api_maker_args),
27
- collection: collection,
28
- commands: commands,
29
- command_response: response,
30
- controller: controller
31
- )
24
+ @command ||= begin
25
+ raise "No commands have been added" if commands.empty?
26
+
27
+ command_id = commands.keys.first
28
+ command_data = commands.values.first
29
+
30
+ individual_command = ApiMaker::IndividualCommand.new(
31
+ args: ApiMaker::Deserializer.execute!(arg: command_data[:args]),
32
+ collection: collection,
33
+ command: self,
34
+ id: command_id,
35
+ primary_key: command_data[:primary_key],
36
+ response: response
37
+ )
38
+
39
+ command_class.new(
40
+ ability: controller.__send__(:current_ability),
41
+ api_maker_args: controller.__send__(:api_maker_args),
42
+ collection: collection,
43
+ collection_instance: collection_instance,
44
+ command: individual_command,
45
+ commands: commands,
46
+ command_response: response,
47
+ controller: controller
48
+ )
49
+ end
50
+ end
51
+
52
+ def collection_instance
53
+ @collection_instance ||= if command_class.const_defined?(:CollectionInstance)
54
+ command_class.const_get(:CollectionInstance).new(
55
+ ability: controller.__send__(:current_ability),
56
+ api_maker_args: controller.__send__(:api_maker_args),
57
+ collection: collection,
58
+ commands: commands,
59
+ command_response: response,
60
+ controller: controller
61
+ )
62
+ end
32
63
  end
33
64
 
34
65
  def controller
35
- @controller ||= double(current_user: user)
66
+ @controller ||= instance_double("ApplicationController", current_user: user)
36
67
  end
37
68
 
38
69
  def execute!
39
- command.execute!
40
- ServicePattern::Response.new(success: true)
70
+ command.execute_with_response
41
71
  end
42
72
 
43
73
  def response
@@ -1,5 +1,14 @@
1
1
  class ApiMaker::Configuration
2
- attr_accessor :profiling, :react_native_path, :threadding
2
+ attr_accessor(
3
+ :ability_class_name,
4
+ :before_create_event_callbacks,
5
+ :devise_sign_in_enabled,
6
+ :devise_sign_out_enabled,
7
+ :on_thread_callbacks,
8
+ :profiling,
9
+ :react_native_path,
10
+ :threadding
11
+ )
3
12
 
4
13
  def self.current
5
14
  @current ||= ApiMaker::Configuration.new
@@ -9,23 +18,41 @@ class ApiMaker::Configuration
9
18
  yield ApiMaker::Configuration.current
10
19
  end
11
20
 
12
- def self.profile(name, &blk)
21
+ def self.profile(name_block, &blk)
13
22
  if ApiMaker::Configuration.current.profiling
14
- Rack::MiniProfiler.step("AM #{name}", &blk)
23
+ Rack::MiniProfiler.step("AM #{name_block.call}", &blk)
15
24
  else
16
25
  yield
17
26
  end
18
27
  end
19
28
 
20
29
  def initialize
30
+ self.ability_class_name = "ApiMaker::Ability"
31
+ self.before_create_event_callbacks = []
32
+ self.devise_sign_in_enabled = true
33
+ self.devise_sign_out_enabled = true
34
+ self.threadding = true
35
+
21
36
  @on_error = []
22
- @threadding = true
37
+ end
38
+
39
+ def ability_class
40
+ ability_class_name.constantize
41
+ end
42
+
43
+ def before_create_event(&blk)
44
+ before_create_event_callbacks << blk
23
45
  end
24
46
 
25
47
  def on_error(&blk)
26
48
  @on_error << blk
27
49
  end
28
50
 
51
+ def on_thread(&blk)
52
+ @on_thread_callbacks ||= []
53
+ @on_thread_callbacks << blk
54
+ end
55
+
29
56
  def report_error(error)
30
57
  @on_error.each do |on_error|
31
58
  on_error.call(error)
@@ -0,0 +1,31 @@
1
+ module ApiMaker::ExpectToBeAbleToHelper
2
+ def expect_to_be_able_to(ability, model, permissions)
3
+ require "cancan/matchers"
4
+
5
+ permissions.each do |permission|
6
+ # Test access through 'can?'
7
+ expect(ability).to be_able_to permission, model
8
+
9
+ # Test access through 'accessible_by'
10
+ if model.is_a?(ActiveRecord::Base) && model.persisted?
11
+ readable_models = model.class.where(id: model).accessible_by(ability, permission)
12
+ expect(readable_models).to eq [model]
13
+ end
14
+ end
15
+ end
16
+
17
+ def expect_not_to_be_able_to(ability, model, permissions)
18
+ require "cancan/matchers"
19
+
20
+ permissions.each do |permission|
21
+ # Test access through 'can?'
22
+ expect(ability).not_to be_able_to permission, model
23
+
24
+ # Test access through 'accessible_by'
25
+ if model.is_a?(ActiveRecord::Base) && model.persisted?
26
+ readable_models = model.class.where(id: model).accessible_by(ability, permission)
27
+ expect(readable_models).to be_empty
28
+ end
29
+ end
30
+ end
31
+ end
@@ -1,5 +1,7 @@
1
1
  class ApiMaker::IndividualCommand
2
- attr_reader :args, :command, :id
2
+ class NotFoundOrNoAccessError < RuntimeError; end
3
+
4
+ attr_reader :args, :collection, :command, :id, :primary_key, :response
3
5
 
4
6
  def initialize(id:, args:, collection:, command:, primary_key: nil, response:)
5
7
  @id = id
@@ -11,27 +13,40 @@ class ApiMaker::IndividualCommand
11
13
  end
12
14
 
13
15
  def error(data = nil)
14
- @response.error_for_command(@id, data)
16
+ response.error_for_command(id, data)
15
17
  end
16
18
 
17
19
  def fail(data = nil)
18
- @response.fail_for_command(@id, data)
20
+ response.fail_for_command(id, data)
19
21
  end
20
22
 
21
23
  def model
22
- raise "Collection wasn't set" unless @collection
24
+ @model ||= begin
25
+ raise "Collection wasn't set" unless collection
23
26
 
24
- @model ||= @collection.find { |model| model.id.to_s == @primary_key.to_s }
25
- raise "Couldn't find model by that ID: #{@primary_key}" unless @model
27
+ model ||= collection.find { |model_in_collection| model_in_collection.id.to_s == primary_key.to_s }
28
+ raise_model_not_found_or_no_access unless model
26
29
 
27
- @model
30
+ model
31
+ end
28
32
  end
29
33
 
30
34
  def model_id
31
- @primary_key
35
+ primary_key
36
+ end
37
+
38
+ def raise_model_not_found_or_no_access
39
+ command_name = command
40
+ .name
41
+ .delete_prefix("Commands::")
42
+ .gsub(/Command\Z/, "")
43
+
44
+ model_name = collection.klass.name
45
+
46
+ raise NotFoundOrNoAccessError, "Couldn't find or no access to #{model_name} #{primary_key} on the #{command_name} command"
32
47
  end
33
48
 
34
49
  def result(data = nil)
35
- @response.result_for_command(@id, ApiMaker::ResultParser.parse(data, controller: @response.controller))
50
+ response.result_for_command(id, ApiMaker::ResultParser.parse(data, controller: response.controller))
36
51
  end
37
52
  end
@@ -1,10 +1,8 @@
1
- import BaseModel from "../base-model"
2
- import Collection from "../collection"
3
-
4
- export default class <%= model.name.gsub("::", "") %> extends BaseModel {
1
+ class <%= resource.short_name %> extends BaseModel {
5
2
  static modelClassData() {
6
3
  return <%= {
7
4
  attributes: attributes,
5
+ className: model.name,
8
6
  collectionKey: model.model_name.collection,
9
7
  collectionName: resource.collection_name,
10
8
  i18nKey: model.model_name.i18n_key,
@@ -20,41 +18,64 @@ export default class <%= model.name.gsub("::", "") %> extends BaseModel {
20
18
  <% reflections.each do |reflection| %>
21
19
  <% if reflection.macro == :belongs_to %>
22
20
  <%= ApiMaker::JsMethodNamerService.execute!(name: "load_#{reflection.name}") %>() {
23
- let id = this.<%= ApiMaker::JsMethodNamerService.execute!(name: reflection.foreign_key) %>()
24
- let modelClass = require(`api-maker/models/<%= reflection.class_name.underscore.dasherize %>`).default
21
+ const id = this.<%= ApiMaker::JsMethodNamerService.execute!(name: reflection.foreign_key) %>()
22
+ const resourceName = "<%= ApiMaker::MemoryStorage.current.resource_for_model(reflection.klass).short_name %>"
23
+ const modelClass = digg(require("api-maker/models"), resourceName)
25
24
  return this._loadBelongsToReflection(<%= api_maker_json("reflectionName" => reflection.name, "model" => "{{this}}", "modelClass" => "{{modelClass}}") %>, <%= api_maker_json("ransack" => {"#{reflection.options[:primary_key] || reflection.klass.primary_key}_eq" => "{{id}}"}) %>)
26
25
  }
27
26
 
28
27
  <%= ApiMaker::JsMethodNamerService.execute!(name: reflection.name) %>() {
29
- let modelClass = require(`api-maker/models/<%= reflection.class_name.underscore.dasherize %>`).default
28
+ const resourceName = "<%= ApiMaker::MemoryStorage.current.resource_for_model(reflection.klass).short_name %>"
29
+ const modelClass = digg(require("api-maker/models"), resourceName)
30
30
  return this._readBelongsToReflection(<%= api_maker_json("reflectionName" => reflection.name, "model" => "{{this}}", "modelClass" => "{{modelClass}}") %>)
31
31
  }
32
32
  <% elsif reflection.macro == :has_many %>
33
+ <% if reflection.options[:through] %>
34
+ <%= ApiMaker::JsMethodNamerService.execute!(name: "load_#{reflection.name}") %>() {
35
+ const id = this.<%= reflection.active_record.primary_key %>()
36
+ const resourceName = "<%= ApiMaker::MemoryStorage.current.resource_for_model(reflection.klass).short_name %>"
37
+ const modelClass = digg(require("api-maker/models"), resourceName)
38
+ return this._loadHasManyReflection(<%= api_maker_json("reflectionName" => reflection.name, "model" => "{{this}}", "modelClass" => "{{modelClass}}") %>, <%= api_maker_json("params": {"through" => {"model" => model.model_name, "id" => "{{id}}", "reflection" => reflection.name}}) %>)
39
+ }
40
+ <% else %>
41
+ <%= ApiMaker::JsMethodNamerService.execute!(name: "load_#{reflection.name}") %>() {
42
+ const id = this.<%= reflection.active_record.primary_key %>()
43
+ const resourceName = "<%= ApiMaker::MemoryStorage.current.resource_for_model(reflection.klass).short_name %>"
44
+ const modelClass = digg(require("api-maker/models"), resourceName)
45
+ return this._loadHasManyReflection(<%= api_maker_json("reflectionName" => reflection.name, "model" => "{{this}}", "modelClass" => "{{modelClass}}") %>, <%= api_maker_json("ransack" => {"#{reflection.foreign_key}_eq" => "{{id}}"}) %>)
46
+ }
47
+ <% end %>
48
+
33
49
  <%= ApiMaker::JsMethodNamerService.execute!(name: reflection.name) %>() {
34
- let id = this.<%= ApiMaker::JsMethodNamerService.execute!(name: reflection.options[:primary_key] || reflection.active_record.primary_key) %>()
35
- let modelClass = require(`api-maker/models/<%= reflection.class_name.underscore.dasherize %>`).default
50
+ const id = this.<%= ApiMaker::JsMethodNamerService.execute!(name: reflection.options[:primary_key] || reflection.active_record.primary_key) %>()
51
+ const resourceName = "<%= ApiMaker::MemoryStorage.current.resource_for_model(reflection.klass).short_name %>"
52
+ const modelClass = digg(require("api-maker/models"), resourceName)
36
53
  return new Collection(<%= api_maker_json(reflection_has_many_parameters(reflection)) %>, <%= api_maker_json(reflection_has_many_parameters_query(reflection)) %>)
37
54
  }
38
55
  <% elsif reflection.macro == :has_one && reflection.options[:through] %>
39
56
  <%= ApiMaker::JsMethodNamerService.execute!(name: "load_#{reflection.name}") %>() {
40
- let id = this.<%= reflection.active_record.primary_key %>()
41
- let modelClass = require(`api-maker/models/<%= reflection.class_name.underscore.dasherize %>`).default
57
+ const id = this.<%= reflection.active_record.primary_key %>()
58
+ const resourceName = "<%= ApiMaker::MemoryStorage.current.resource_for_model(reflection.klass).short_name %>"
59
+ const modelClass = digg(require("api-maker/models"), resourceName)
42
60
  return this._loadHasOneReflection(<%= api_maker_json("reflectionName" => reflection.name, "model" => "{{this}}", "modelClass" => "{{modelClass}}") %>, <%= api_maker_json("params": {"through" => {"model" => model.model_name, "id" => "{{id}}", "reflection" => reflection.name}}) %>)
43
61
  }
44
62
 
45
63
  <%= ApiMaker::JsMethodNamerService.execute!(name: reflection.name) %>() {
46
- let modelClass = require(`api-maker/models/<%= reflection.class_name.underscore.dasherize %>`).default
64
+ const resourceName = "<%= ApiMaker::MemoryStorage.current.resource_for_model(reflection.klass).short_name %>"
65
+ const modelClass = digg(require("api-maker/models"), resourceName)
47
66
  return this._readHasOneReflection(<%= api_maker_json("reflectionName" => reflection.name, "model" => "{{this}}", "modelClass" => "{{modelClass}}") %>)
48
67
  }
49
68
  <% elsif reflection.macro == :has_one %>
50
69
  <%= ApiMaker::JsMethodNamerService.execute!(name: "load_#{reflection.name}") %>() {
51
- let id = this.<%= reflection.active_record.primary_key %>()
52
- let modelClass = require(`api-maker/models/<%= reflection.class_name.underscore.dasherize %>`).default
70
+ const id = this.<%= reflection.active_record.primary_key %>()
71
+ const resourceName = "<%= ApiMaker::MemoryStorage.current.resource_for_model(reflection.klass).short_name %>"
72
+ const modelClass = digg(require("api-maker/models"), resourceName)
53
73
  return this._loadHasOneReflection(<%= api_maker_json("reflectionName" => reflection.name, "model" => "{{this}}", "modelClass" => "{{modelClass}}") %>, <%= api_maker_json("ransack" => {"#{reflection.foreign_key}_eq" => "{{id}}"}) %>)
54
74
  }
55
75
 
56
76
  <%= ApiMaker::JsMethodNamerService.execute!(name: reflection.name) %>() {
57
- let modelClass = require(`api-maker/models/<%= reflection.class_name.underscore.dasherize %>`).default
77
+ const resourceName = "<%= ApiMaker::MemoryStorage.current.resource_for_model(reflection.klass).short_name %>"
78
+ const modelClass = digg(require("api-maker/models"), resourceName)
58
79
  return this._readHasOneReflection(<%= api_maker_json("reflectionName" => reflection.name, "model" => "{{this}}", "modelClass" => "{{modelClass}}") %>)
59
80
  }
60
81
  <% end %>
@@ -63,18 +84,11 @@ export default class <%= model.name.gsub("::", "") %> extends BaseModel {
63
84
  <% attributes.each do |attribute_data| %>
64
85
  <% methodName = ApiMaker::JsMethodNamerService.execute!(name: attribute_data.fetch(:name)) %>
65
86
  <%= methodName %>() {
66
- // <%= attribute_data.fetch(:type) %>
67
- <% if attribute_data.fetch(:type) == :datetime || attribute_data.fetch(:type) == :date %>
68
- return this._getAttributeDateTime("<%= attribute_data.fetch(:name) %>")
69
- <% elsif attribute_data.fetch(:type) == :money %>
70
- return this._getAttributeMoney("<%= attribute_data.fetch(:name) %>")
71
- <% else %>
72
- return this._getAttribute("<%= attribute_data.fetch(:name) %>")
73
- <% end %>
87
+ return this.readAttributeUnderscore("<%= attribute_data.fetch(:name) %>")
74
88
  }
75
89
 
76
90
  <%= ApiMaker::JsMethodNamerService.execute!(name: "has_#{attribute_data.fetch(:name)}") %>() {
77
- let value = this.<%= methodName %>()
91
+ const value = this.<%= methodName %>()
78
92
  return this._isPresent(value)
79
93
  }
80
94
  <% end %>
@@ -99,7 +113,7 @@ export default class <%= model.name.gsub("::", "") %> extends BaseModel {
99
113
  {
100
114
  args: args,
101
115
  command: "<%= member_command %>",
102
- primaryKey: this._primaryKey(),
116
+ primaryKey: this.primaryKey(),
103
117
  collectionName: this.modelClassData().collectionName,
104
118
  type: "member"
105
119
  },
@@ -0,0 +1,6 @@
1
+ /* rails-erb-loader-dependencies api_maker/resources/ */
2
+
3
+ import {BaseModel, Collection} from "@kaspernj/api-maker"
4
+ import {digg} from "@kaspernj/object-digger"
5
+
6
+ <%= ApiMaker::ModelClassesJavaScriptGeneratorService.execute! %>
@@ -4,7 +4,7 @@ class ApiMaker::Loader
4
4
 
5
5
  @loaded = true
6
6
 
7
- resources_dir = Rails.root.join("app", "api_maker", "resources")
7
+ resources_dir = Rails.root.join("app/api_maker/resources")
8
8
  files = Dir.glob("#{resources_dir}/**/*.rb")
9
9
 
10
10
  files.each do |file|
@@ -21,7 +21,7 @@ class ApiMaker::MemoryStorage
21
21
  end
22
22
 
23
23
  def load_all_resources
24
- resources_path = Rails.root.join("app", "api_maker", "resources")
24
+ resources_path = Rails.root.join("app/api_maker/resources")
25
25
 
26
26
  Dir.foreach(resources_path) do |file|
27
27
  match = file.match(/\A((.+)_resource)\.rb\Z/)
@@ -26,6 +26,22 @@ module ApiMaker::ModelExtensions
26
26
  end
27
27
  end
28
28
 
29
+ def api_maker_event(event_name, args = {})
30
+ channel_name = api_maker_model_class_event_name(event_name)
31
+ resource = ApiMaker::MemoryStorage.current.resource_for_model(self)
32
+ data_to_broadcast = ApiMaker::ResultParser.parse(
33
+ a: args,
34
+ e: event_name,
35
+ mt: resource.collection_name,
36
+ t: :mce
37
+ )
38
+ ActionCable.server.broadcast(channel_name, data_to_broadcast)
39
+ end
40
+
41
+ def api_maker_model_class_event_name(event_name)
42
+ "api_maker_model_class_events_#{api_maker_resource.short_name}_#{event_name}"
43
+ end
44
+
29
45
  def api_maker_resource
30
46
  @api_maker_resource ||= ApiMaker::MemoryStorage.current.resource_for_model(self)
31
47
  end
@@ -35,11 +51,11 @@ module ApiMaker::ModelExtensions
35
51
  channel_name = api_maker_event_channel_name(event_name)
36
52
  serializer = ApiMaker::Serializer.new(model: self)
37
53
  data_to_broadcast = ApiMaker::ResultParser.parse(
38
- args: args,
39
- event_name: event_name,
40
- model_id: id,
41
- model_type: serializer.resource.collection_name,
42
- type: :event
54
+ a: args,
55
+ e: event_name,
56
+ mi: id,
57
+ mt: serializer.resource.collection_name,
58
+ t: :e
43
59
  )
44
60
  ActionCable.server.broadcast(channel_name, data_to_broadcast)
45
61
  end
@@ -51,11 +67,11 @@ module ApiMaker::ModelExtensions
51
67
  def api_maker_broadcast_create
52
68
  serializer = ApiMaker::Serializer.new(model: self)
53
69
  data_to_broadcast = ApiMaker::ResultParser.parse(
54
- model: self,
55
- model_class_name: self.class.name,
56
- model_id: id,
57
- model_type: serializer.resource.collection_name,
58
- type: :create
70
+ m: self,
71
+ mcn: self.class.name,
72
+ mi: id,
73
+ mt: serializer.resource.collection_name,
74
+ t: :c
59
75
  )
60
76
  ActionCable.server.broadcast(self.class.api_maker_broadcast_create_channel_name, data_to_broadcast)
61
77
  end
@@ -63,10 +79,10 @@ module ApiMaker::ModelExtensions
63
79
  def api_maker_broadcast_destroy
64
80
  serializer = ApiMaker::Serializer.new(model: self)
65
81
  data_to_broadcast = ApiMaker::ResultParser.parse(
66
- model: self,
67
- model_id: id,
68
- model_type: serializer.resource.collection_name,
69
- type: :destroy
82
+ m: self,
83
+ mi: id,
84
+ mt: serializer.resource.collection_name,
85
+ t: :d
70
86
  )
71
87
  ActionCable.server.broadcast(api_maker_broadcast_destroy_channel_name, data_to_broadcast)
72
88
  end
@@ -78,10 +94,10 @@ module ApiMaker::ModelExtensions
78
94
  def api_maker_broadcast_update
79
95
  serializer = ApiMaker::Serializer.new(model: self)
80
96
  data_to_broadcast = ApiMaker::ResultParser.parse(
81
- model: self,
82
- model_id: id,
83
- model_type: serializer.resource.collection_name,
84
- type: :update
97
+ m: self,
98
+ mi: id,
99
+ mt: serializer.resource.collection_name,
100
+ t: :u
85
101
  )
86
102
  ActionCable.server.broadcast(api_maker_broadcast_update_channel_name, data_to_broadcast)
87
103
  end
@@ -6,7 +6,11 @@ class ApiMaker::PermittedParamsArgument
6
6
  @model = model
7
7
  end
8
8
 
9
+ def inspect
10
+ "#<#{self.class.name}:#{__id__}>"
11
+ end
12
+
9
13
  def params
10
- command.args
14
+ @params ||= command.args&.dig(:save) || {}
11
15
  end
12
16
  end