ibrain-core 0.1.3 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/ibrain/graphql_controller.rb +1 -1
  3. data/app/graphql/ibrain/extentions/default_value.rb +0 -2
  4. data/app/graphql/ibrain/interfaces/record_interface.rb +0 -2
  5. data/app/graphql/ibrain/lazy/base.rb +1 -1
  6. data/app/graphql/ibrain/resolvers/base_resolver.rb +3 -3
  7. data/app/graphql/ibrain/types/attribute_type.rb +8 -0
  8. data/app/graphql/ibrain/types/base_node.rb +2 -2
  9. data/app/graphql/ibrain/types/base_object.rb +1 -1
  10. data/app/graphql/ibrain/types/filter_type.rb +0 -1
  11. data/app/models/{ibrain/concerns → concerns/ibrain}/ransackable_attributes.rb +0 -0
  12. data/app/models/{ibrain/concerns → concerns/ibrain}/soft_deletable.rb +0 -0
  13. data/app/models/{ibrain/concerns → concerns/ibrain}/user_api_authentication.rb +0 -0
  14. data/app/models/{ibrain/concerns → concerns/ibrain}/user_methods.rb +0 -2
  15. data/app/models/ibrain/base.rb +24 -12
  16. data/app/models/ibrain/legacy_user.rb +1 -1
  17. data/app/repositories/ibrain/base_repository.rb +18 -0
  18. data/lib/generators/ibrain/graphql/core.rb +4 -0
  19. data/lib/generators/ibrain/graphql/mutation_generator.rb +4 -0
  20. data/lib/generators/ibrain/graphql/object_generator.rb +7 -0
  21. data/lib/generators/ibrain/graphql/resolver_generator.rb +4 -0
  22. data/lib/generators/ibrain/graphql/resolvers_generator.rb +4 -0
  23. data/lib/generators/ibrain/graphql/templates/aggregate.erb +1 -1
  24. data/lib/generators/ibrain/graphql/templates/mutation.erb +2 -1
  25. data/lib/generators/ibrain/graphql/templates/repository.erb +19 -0
  26. data/lib/generators/ibrain/graphql/templates/resolver.erb +1 -1
  27. data/lib/generators/ibrain/graphql/templates/resolvers.erb +1 -1
  28. data/lib/generators/ibrain/install/install_generator.rb +1 -1
  29. data/lib/generators/ibrain/install/templates/config/initializers/cors.tt +1 -1
  30. data/lib/generators/ibrain/install/templates/graphql/app_schema.rb.tt +0 -2
  31. data/lib/generators/ibrain/install/templates/rubocop.yml.tt +19 -2
  32. data/lib/ibrain/core/controller_helpers/auth.rb +6 -2
  33. data/lib/ibrain/core/version.rb +2 -2
  34. data/lib/ibrain/core.rb +1 -0
  35. metadata +23 -7
  36. data/app/graphql/mutations/insert_user.rb +0 -18
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 77b55d552570271ff6defb94a2f5f990816d29966703112050987bd7f5ef8b1e
4
- data.tar.gz: 0b7c63567310a31fb93c7d277c8216ee7be843e9a7bf4c16117317493c20bf1d
3
+ metadata.gz: 57017a63ef4f94fba49be6f78fa18d5754bd81109f144995c44d8ff38a7c8bc0
4
+ data.tar.gz: 7204281494ec365f7528714301bf1fd7b2b40eff3f9e29e874207f8592c8fe33
5
5
  SHA512:
6
- metadata.gz: 46264a7f0478a26389829084b8a12c7cfc6a7da3cf8920d7edc06e7acc14fe951f97ac8ff39547d7d1874fae87dcecd25043c206ead022eb0caf0752bbe13b98
7
- data.tar.gz: 7259f9823c599f96c600adb64fa0effa65dbece73df38357aa93da0aa47654d40dad625a7308b5f12d709833dac7ea83bdcf0ecd60389b9434e09c69315ef28e
6
+ metadata.gz: 948449257443e847916a2281a7acd9c346579a800d98af65e2bad7e32cf3812b8b69ff768dc760b0d4fcf098c1eba412e674ec5b34b87fa6e3a75415d69df1c7
7
+ data.tar.gz: 33f5104110a2912405452c65829076ffb92b217835c2a1e9d0b4f7991c3577d35a739342a8e4e99215115f4af0dfcae73b6b3b32c491706432a00a68eee8a207
@@ -10,7 +10,7 @@ module Ibrain
10
10
  variables: variables,
11
11
  context: {
12
12
  session: session,
13
- current_user: current_ibrain_user
13
+ current_user: try_ibrain_current_user
14
14
  },
15
15
  operation_name: operation_name
16
16
  )
@@ -3,8 +3,6 @@
3
3
  module Ibrain
4
4
  module Extentions
5
5
  class DefaultValue < GraphQL::Schema::FieldExtension
6
- description 'Default value extention'
7
-
8
6
  def after_resolve(value:, **_rest)
9
7
  if value.nil?
10
8
  options[:default_value]
@@ -3,8 +3,6 @@
3
3
  module Ibrain::Interfaces::RecordInterface
4
4
  include Ibrain::Types::BaseInterface
5
5
 
6
- description 'Common Interface'
7
-
8
6
  field :created_at, ::GraphQL::Types::ISO8601DateTime, null: false
9
7
  field :updated_at, ::GraphQL::Types::ISO8601DateTime, null: false
10
8
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Ibrain
4
4
  module Lazy
5
- class Base < GraphQL::Function
5
+ class Base < GraphQL::Schema::Resolver
6
6
  end
7
7
  end
8
8
  end
@@ -3,9 +3,9 @@
3
3
  module Ibrain
4
4
  module Resolvers
5
5
  class BaseResolver < GraphQL::Schema::Resolver
6
- argument :filter, Ibrain::Types::FilterType, required: false, default_value: nil, description: 'Filter object for resolver'
7
- argument :limit, Int, required: false, default_value: 10, description: 'Limit records'
8
- argument :offset, Int, required: false, default_value: 0, description: 'Get records from cursor position'
6
+ argument :filter, Ibrain::Types::FilterType, required: false, default_value: nil
7
+ argument :limit, Int, required: false, default_value: 10
8
+ argument :offset, Int, required: false, default_value: 0
9
9
 
10
10
  def current_user
11
11
  context.fetch(:current_user)
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ibrain
4
+ module Types
5
+ class AttributeType < BaseScalar
6
+ end
7
+ end
8
+ end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Ibrain::Types::BaseNode < Types::BaseObject
4
- implements ::GraphQL::Relay::Node.interface
3
+ class Ibrain::Types::BaseNode < Ibrain::Types::BaseObject
4
+ include ::GraphQL::Relay::Node
5
5
  implements ::Ibrain::Interfaces::RecordInterface
6
6
 
7
7
  global_id_field :id
@@ -3,7 +3,7 @@
3
3
  module Ibrain
4
4
  module Types
5
5
  class BaseObject < GraphQL::Schema::Object
6
- implements GraphQL::Relay::Node.interface
6
+ include GraphQL::Relay::Node
7
7
 
8
8
  edge_type_class(Ibrain::Types::BaseEdge)
9
9
  connection_type_class(Ibrain::Types::BaseConnection)
@@ -3,7 +3,6 @@
3
3
  module Ibrain
4
4
  module Types
5
5
  class FilterType < GraphQL::Schema::Scalar
6
- description 'Filter Type'
7
6
  end
8
7
  end
9
8
  end
@@ -5,10 +5,8 @@ module Ibrain
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  include Ibrain::UserApiAuthentication
8
- include Ibrain::UserReporting
9
8
 
10
9
  included do
11
- extend Ibrain::DisplayMoney
12
10
  after_create :auto_generate_ibrain_api_key
13
11
 
14
12
  include Ibrain::RansackableAttributes unless included_modules.include?(Ibrain::RansackableAttributes)
@@ -1,20 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ IGNORE_ATTRIBUTES = %w(id created_at updated_at)
4
+
3
5
  class Ibrain::Base < Ibrain::ApplicationRecord
4
6
  include ActionView::Helpers::DateHelper
5
7
 
6
8
  self.abstract_class = true
7
9
 
8
- def self.adjust_date_for_cdt(datetime)
9
- datetime.in_time_zone('UTC')
10
- end
11
-
12
10
  def string_id
13
11
  try(:id).try(:to_s)
14
12
  end
15
13
 
16
14
  scope :graphql_ransack, lambda { |params|
17
- ransack(params).result(distinct: true)
15
+ ransack(params).result
18
16
  }
19
17
 
20
18
  scope :reverse_scope, lambda {
@@ -36,12 +34,26 @@ class Ibrain::Base < Ibrain::ApplicationRecord
36
34
  time_ago_in_words(created_at)
37
35
  end
38
36
 
39
- # Provides a scope that should be included any time data
40
- # are fetched with the intention of displaying to the user.
41
- #
42
- # Allows individual stores to include any active record scopes or joins
43
- # when data are displayed.
44
- def self.display_includes
45
- where(nil)
37
+ class << self
38
+ # Provides a scope that should be included any time data
39
+ # are fetched with the intention of displaying to the user.
40
+ #
41
+ # Allows individual stores to include any active record scopes or joins
42
+ # when data are displayed.
43
+ def display_includes
44
+ where(nil)
45
+ end
46
+
47
+ def paginate(args)
48
+ limit(args[:limit]).offset(args[:offset])
49
+ end
50
+
51
+ def adjust_date_for_cdt(datetime)
52
+ datetime.in_time_zone('UTC')
53
+ end
54
+
55
+ def permitted_attributes
56
+ column_names.reject { |k| IGNORE_ATTRIBUTES.include?(k) }
57
+ end
46
58
  end
47
59
  end
@@ -6,7 +6,7 @@ module Ibrain
6
6
  # @note This class is intended to be modified by extensions (ex.
7
7
  # ibrain-auth)
8
8
  class LegacyUser < Ibrain::Base
9
- include UserMethods
9
+ include Ibrain::UserMethods
10
10
 
11
11
  self.table_name = 'ibrain_users'
12
12
 
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ibrain
4
+ class BaseRepository
5
+ def initialize(current_user, record)
6
+ @current_user = current_user
7
+ @record = record
8
+ end
9
+
10
+ attr_reader :current_user, :record
11
+
12
+ protected
13
+
14
+ def cryptor
15
+ Ibrain::Encryptor.new
16
+ end
17
+ end
18
+ end
@@ -36,6 +36,10 @@ module Ibrain
36
36
  insert_root_type('query', 'QueryType')
37
37
  end
38
38
 
39
+ def create_repository_root_type
40
+ create_dir("app/repositories")
41
+ end
42
+
39
43
  def schema_file_path
40
44
  "#{options[:directory]}/#{schema_name.underscore}.rb"
41
45
  end
@@ -36,6 +36,10 @@ module Ibrain
36
36
  create_mutation_root_type
37
37
  end
38
38
 
39
+ if options[:model].present?
40
+ system("bundle exec rails generate ibrain:graphql:object #{options[:model].downcase}")
41
+ end
42
+
39
43
  template "mutation.erb", "#{options[:directory]}/mutations/#{file_name}.rb"
40
44
 
41
45
  sentinel = /class .*MutationType\s*<\s*[^\s]+?\n/m
@@ -29,7 +29,10 @@ module Ibrain
29
29
  desc: "Include the Relay Node interface"
30
30
 
31
31
  def create_type_file
32
+ create_dir('app/repositories') unless Dir.exist?('app/repositories')
33
+
32
34
  template "object.erb", "#{options[:directory]}/types/objects/#{type_file_name}.rb"
35
+ template "repository.erb", "app/repositories/#{type_name}_repository.rb"
33
36
  end
34
37
 
35
38
  def fields
@@ -72,6 +75,10 @@ module Ibrain
72
75
  false
73
76
  end
74
77
 
78
+ def model_name
79
+ type_name.capitalize
80
+ end
81
+
75
82
  def klass
76
83
  @klass ||= Module.const_get(type_name.camelize)
77
84
  end
@@ -20,6 +20,10 @@ module Ibrain
20
20
  create_resolver_root_type
21
21
  end
22
22
 
23
+ if options[:model].present?
24
+ system("bundle exec rails generate ibrain:graphql:object #{options[:model].downcase}")
25
+ end
26
+
23
27
  template "resolver.erb", "#{options[:directory]}/resolvers/#{file_name}.rb"
24
28
 
25
29
  sentinel = /class .*QueryType\s*<\s*[^\s]+?\n/m
@@ -36,6 +36,10 @@ module Ibrain
36
36
  create_resolver_root_type
37
37
  end
38
38
 
39
+ if options[:model].present?
40
+ system("bundle exec rails generate ibrain:graphql:object #{options[:model].downcase}")
41
+ end
42
+
39
43
  template "resolvers.erb", "#{options[:directory]}/resolvers/#{file_name}.rb"
40
44
  template "aggregate.erb", "#{options[:directory]}/resolvers/#{file_name}_aggregate.rb"
41
45
 
@@ -6,7 +6,7 @@ module Resolvers
6
6
  description 'Define aggregate to count total records for <%= resolver_name %>'
7
7
  # define resolve method
8
8
  def resolve(args)
9
- <%= model_name.capitalize %>.ransack(args[:filter]).result
9
+ <%= model_name.capitalize %>Repository.aggregate(args)
10
10
  end
11
11
  end
12
12
  end
@@ -14,7 +14,8 @@ module Mutations
14
14
 
15
15
  # TODO: define resolve method
16
16
  def resolve(args)
17
- # TODO: define logic
17
+ # TODO: define logic inside repository
18
+ # Something like Repository.new(current_user, Post.new).create(args)
18
19
  end
19
20
  end
20
21
  end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ <% module_namespacing_when_supported do -%>
4
+ class <%= model_name %>Repository < Ibrain::BaseRepository
5
+ def initialize(current_user, record = nil)
6
+ super(current_user, record)
7
+ end
8
+
9
+ class << self
10
+ def find(args)
11
+ <%= model_name %>.find args[:id]
12
+ end
13
+
14
+ def aggregate(args)
15
+ <%= model_name %>.ransack(args[:filter]).result
16
+ end
17
+ end
18
+ end
19
+ <% end -%>
@@ -13,7 +13,7 @@ module Resolvers
13
13
 
14
14
  # TODO: define resolve method
15
15
  def resolve(args)
16
- <%= model_name.capitalize %>.find args[:id]
16
+ <%= model_name.capitalize %>Repository.find args[:id]
17
17
  end
18
18
  end
19
19
  end
@@ -11,7 +11,7 @@ module Resolvers
11
11
 
12
12
  # TODO: define resolve method
13
13
  def resolve(args)
14
- super(args).limit(args[:limit]).offset(args[:offset])
14
+ super(args).paginate(args)
15
15
  end
16
16
  end
17
17
  end
@@ -55,7 +55,7 @@ module Ibrain
55
55
  Would you like to install it? (Y/n)"))
56
56
 
57
57
  @plugins_to_be_installed << 'ibrain-auth' unless system('gem list | grep ibrain-auth')
58
- @plugin_generators_to_run << 'ibrain:auth:install'
58
+ @plugin_generators_to_run << "ibrain:auth:install --with-ridgpole=#{options[:with_ridgepole]}"
59
59
  end
60
60
  end
61
61
 
@@ -7,7 +7,7 @@
7
7
 
8
8
  Rails.application.config.middleware.insert_before 0, Rack::Cors do
9
9
  allow do
10
- origins '*'
10
+ origins ['localhost']
11
11
 
12
12
  resource '*',
13
13
  headers: :any,
@@ -1,8 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class AppSchema < Ibrain::BaseSchema
4
- description 'Define root schema'
5
-
6
4
  mutation(Types::MutationType)
7
5
  query(Types::QueryType)
8
6
  end
@@ -113,6 +113,7 @@ Rails/DynamicFindBy:
113
113
  # It's okay to skip model validations to setup a spec.
114
114
  Rails/SkipsModelValidations:
115
115
  Exclude:
116
+ - db/seeds/**/*.rb
116
117
  - '*/spec/**/*'
117
118
 
118
119
  # We use a lot of
@@ -277,7 +278,7 @@ Metrics/BlockLength:
277
278
  Metrics/CyclomaticComplexity:
278
279
  Enabled: false
279
280
 
280
- Metrics/LineLength:
281
+ Layout/LineLength:
281
282
  Enabled: false
282
283
 
283
284
  Metrics/MethodLength:
@@ -595,4 +596,20 @@ Gemspec/RequiredRubyVersion:
595
596
  Enabled: false
596
597
 
597
598
  GraphQL/FieldDescription:
598
- Enabled: false
599
+ Enabled: false
600
+
601
+ GraphQL/ObjectDescription:
602
+ Enabled: true
603
+ Exclude:
604
+ - app/graphql/policies/*.rb
605
+ - app/graphql/*.rb
606
+
607
+ GraphQL/ExtractType:
608
+ Enabled: false
609
+
610
+ Rails/UnknownEnv:
611
+ Environments:
612
+ - production
613
+ - development
614
+ - test
615
+ - staging
@@ -52,11 +52,15 @@ module Ibrain
52
52
  # This one will be defined by apps looking to hook into Ibrain
53
53
  # As per authentication_helpers.rb
54
54
  if respond_to?(:ibrain_current_user, true)
55
- ibrain_current_user
55
+ try(:ibrain_current_user)
56
56
  # This one will be defined by Devise
57
57
  elsif respond_to?(:current_ibrain_user, true)
58
- current_ibrain_user
58
+ try(:current_ibrain_user)
59
59
  end
60
+ rescue StandardError => e
61
+ Ibrain::Logger.warn e.message.to_s
62
+
63
+ nil
60
64
  end
61
65
  end
62
66
  end
@@ -1,14 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Ibrain
4
- VERSION = "0.1.3"
4
+ VERSION = "0.1.7"
5
5
 
6
6
  def self.ibrain_version
7
7
  VERSION
8
8
  end
9
9
 
10
10
  def self.previous_ibrain_minor_version
11
- '0.1.2'
11
+ '0.1.6'
12
12
  end
13
13
 
14
14
  def self.ibrain_gem_version
data/lib/ibrain/core.rb CHANGED
@@ -14,6 +14,7 @@ require 'friendly_id'
14
14
  require 'kaminari/activerecord'
15
15
  require 'rack/cors'
16
16
  require 'ransack'
17
+ require 'discard'
17
18
 
18
19
  module Ibrain
19
20
  mattr_accessor :user_class
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ibrain-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tai Nguyen Van
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-12-20 00:00:00.000000000 Z
11
+ date: 2021-12-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord-session_store
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: 1.15.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: discard
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.2'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.2'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: friendly_id
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -183,6 +197,7 @@ files:
183
197
  - app/graphql/ibrain/resolvers/base_aggregate.rb
184
198
  - app/graphql/ibrain/resolvers/base_resolver.rb
185
199
  - app/graphql/ibrain/types/aggregate_type.rb
200
+ - app/graphql/ibrain/types/attribute_type.rb
186
201
  - app/graphql/ibrain/types/base_argument.rb
187
202
  - app/graphql/ibrain/types/base_connection.rb
188
203
  - app/graphql/ibrain/types/base_edge.rb
@@ -199,17 +214,17 @@ files:
199
214
  - app/graphql/ibrain/types/node_type.rb
200
215
  - app/graphql/ibrain/util/field_combiner.rb
201
216
  - app/graphql/ibrain/util/query_combiner.rb
202
- - app/graphql/mutations/insert_user.rb
217
+ - app/models/concerns/ibrain/ransackable_attributes.rb
218
+ - app/models/concerns/ibrain/soft_deletable.rb
219
+ - app/models/concerns/ibrain/user_api_authentication.rb
220
+ - app/models/concerns/ibrain/user_methods.rb
203
221
  - app/models/ibrain/ability.rb
204
222
  - app/models/ibrain/application_record.rb
205
223
  - app/models/ibrain/base.rb
206
- - app/models/ibrain/concerns/ransackable_attributes.rb
207
- - app/models/ibrain/concerns/soft_deletable.rb
208
- - app/models/ibrain/concerns/user_api_authentication.rb
209
- - app/models/ibrain/concerns/user_methods.rb
210
224
  - app/models/ibrain/legacy_user.rb
211
225
  - app/models/ibrain/role.rb
212
226
  - app/models/ibrain/role_user.rb
227
+ - app/repositories/ibrain/base_repository.rb
213
228
  - config/initializers/friendly_id.rb
214
229
  - config/locales/en.yml
215
230
  - config/locales/jp.yml
@@ -223,6 +238,7 @@ files:
223
238
  - lib/generators/ibrain/graphql/templates/aggregate.erb
224
239
  - lib/generators/ibrain/graphql/templates/mutation.erb
225
240
  - lib/generators/ibrain/graphql/templates/object.erb
241
+ - lib/generators/ibrain/graphql/templates/repository.erb
226
242
  - lib/generators/ibrain/graphql/templates/resolver.erb
227
243
  - lib/generators/ibrain/graphql/templates/resolvers.erb
228
244
  - lib/generators/ibrain/graphql/type_generator.rb
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Ibrain
4
- module Mutations
5
- class InsertUser < Ibrain::Mutations::BaseMutation
6
- # TODO: define return fields
7
- # field :post, Types::PostType, null: false
8
-
9
- # TODO: define arguments
10
- # argument :name, String, required: true
11
-
12
- # TODO: define resolve method
13
- # def resolve(name:)
14
- # { post: ... }
15
- # end
16
- end
17
- end
18
- end