ibrain-core 0.2.0 → 0.2.4

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: 1a04fdcab0c02b1f8a8d58a25dae8cd1bda74a4b296e2aeb219861df4464f008
4
- data.tar.gz: baae07824103dcc3c80ab8228b154009242bca6648f3706ab9d5e18f743c9303
3
+ metadata.gz: aad014a1809bbdc92cf12e40c1bb93a13676eb1784c3d70cfbc2ef9acec56bf4
4
+ data.tar.gz: ef00aca082945b77603b6cc5023b7d60361c4c2831b9202db188dbec73848126
5
5
  SHA512:
6
- metadata.gz: 4e1d2b42216cdffccbc7e5b1b103f9370c5dc8486a2a30ee5a902295a72c5d606e23881d110bb63715e105c2270834515c931ad49abbd6888437cf34ec97dda3
7
- data.tar.gz: cdbc90d0ddaed7d02d76ad69061e84cbd7bc4b6dcfaf82ce4035f994189fbeece3c5452098393e4efdf85a4700b120ed1df8d25fea612fdcd4ce93b2e0b47694
6
+ metadata.gz: 675dedca74cf17d386a6eca4b6daf6d34a92ee8c4162e657fc01c9c514438aab8d260ac1ca8c0697c16bd5e6ecfafa6324577ae8327341662cb2e8aa60929663
7
+ data.tar.gz: 7957cc215b57e8d4dfd028442664aa5734f9de61da5cf8208e15a9c352b5a27edabf7e7abcb332d6c13d918157394ab8fd31768f6fc92107b75e1f06a9725f9c
@@ -13,14 +13,6 @@ module Ibrain
13
13
 
14
14
  protected
15
15
 
16
- def operation_name
17
- params[:operationName]
18
- end
19
-
20
- def skip_operations
21
- super || ['IntrospectionQuery'].include?(operation_name)
22
- end
23
-
24
16
  def cryptor
25
17
  Ibrain::Encryptor.new
26
18
  end
@@ -5,7 +5,6 @@ module Ibrain
5
5
  class GraphqlController < ::Ibrain::BaseController
6
6
  include Devise::Controllers::ScopedViews
7
7
 
8
- before_action :authenticate_user!, unless: :skip_operations
9
8
  before_action :map_user_class_to_request
10
9
 
11
10
  helpers = %w(resource scope_name resource_name signed_in_resource
@@ -6,7 +6,7 @@ module Ibrain
6
6
 
7
7
  use GraphQL::Guard.new(
8
8
  policy_object: ::Ibrain::Config.graphql_policy.safe_constantize,
9
- not_authorized: ->(type, field) { raise IbrainErrors::UnknownError.new("Not authorized to access #{type}.#{field}") }
9
+ not_authorized: ->(type, field) { raise IbrainErrors::PermissionError.new("You not have permission to access #{type}.#{field}") }
10
10
  )
11
11
 
12
12
  # Union and Interface Resolution
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ibrain
4
+ module Extentions
5
+ class Roles < GraphQL::Schema::FieldExtension
6
+ def after_resolve(object:, value:, **_rest)
7
+ raise IbrainErrors::PermissionError.new("You not have permission to access #{field&.name}") if is_invalid_role(object)
8
+
9
+ # yield the current time as `memo`
10
+ value
11
+ end
12
+
13
+ private
14
+
15
+ def is_invalid_role(object)
16
+ roles = options.try(:fetch, :roles, [])
17
+ current_user = object.try(:context).try(:fetch, :current_user, nil)
18
+ role = current_user.try(:role) || current_user.try(:graphql_role)
19
+
20
+ return if roles.blank?
21
+ return true if current_user.blank?
22
+ return false if roles.include?(role)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ibrain
4
+ module Extentions
5
+ class SessionRequired < GraphQL::Schema::FieldExtension
6
+ def resolve(object:, arguments:, **rest)
7
+ raise ActionController::InvalidAuthenticityToken, I18n.t('ibrain.errors.session.invalid_session') if is_invalid_session(object)
8
+
9
+ # yield the current time as `memo`
10
+ yield(object, arguments, rest)
11
+ end
12
+
13
+ private
14
+
15
+ def is_invalid_session(object)
16
+ object.try(:context).try(:fetch, :current_user, nil).blank? && options.try(:fetch, :session_required, false)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ibrain
4
+ module Types
5
+ class BaseApiConnection < Types::BaseObject
6
+ # add `nodes` and `pageInfo` fields, as well as `edge_type(...)` and `node_nullable(...)` overrides
7
+ include GraphQL::Types::Relay::ConnectionBehaviors
8
+
9
+ field :total_count, Integer, null: false, camelize: false
10
+
11
+ def total_count
12
+ object.items.size
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ibrain
4
+ module Types
5
+ class BaseApiEdge < Types::BaseObject
6
+ # add `node` and `cursor` fields, as well as `node_type(...)` override
7
+ include GraphQL::Types::Relay::EdgeBehaviors
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ibrain
4
+ module Types
5
+ class BaseApiField < GraphQL::Schema::Field
6
+ argument_class ::Ibrain::Types::BaseArgument
7
+
8
+ def initialize(*args, session_required: true, roles: nil, **kwargs, &block)
9
+ super(*args, camelize: false, **kwargs, &block)
10
+
11
+ extension(Ibrain::Extentions::SessionRequired, session_required: session_required) if session_required
12
+ extension(Ibrain::Extentions::Roles, roles: roles) if roles
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ibrain
4
+ module Types
5
+ class BaseApiObject < GraphQL::Schema::Object
6
+ include GraphQL::Relay::Node
7
+
8
+ edge_type_class(Ibrain::Types::BaseApiEdge)
9
+ connection_type_class(Ibrain::Types::BaseApiConnection)
10
+
11
+ field_class Ibrain::Types::BaseApiField
12
+ end
13
+ end
14
+ end
@@ -5,10 +5,11 @@ module Ibrain
5
5
  class BaseField < GraphQL::Schema::Field
6
6
  argument_class ::Ibrain::Types::BaseArgument
7
7
 
8
- def initialize(*args, default_value: nil, **kwargs, &block)
8
+ def initialize(*args, default_value: nil, roles: nil, **kwargs, &block)
9
9
  super(*args, camelize: false, **kwargs, &block)
10
10
 
11
11
  extension(::Ibrain::Extentions::DefaultValue, default_value: default_value) unless default_value.nil?
12
+ extension(Ibrain::Extentions::Roles, roles: roles) if roles
12
13
  end
13
14
  end
14
15
  end
@@ -1,10 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- IGNORE_ATTRIBUTES = %w(id created_at updated_at)
4
-
5
3
  class Ibrain::Base < Ibrain::ApplicationRecord
6
4
  include ActionView::Helpers::DateHelper
7
5
 
6
+ IGNORE_ATTRIBUTES = %w(id created_at updated_at)
7
+
8
8
  self.abstract_class = true
9
9
 
10
10
  def string_id
data/config/routes.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  Ibrain::Core::Engine.routes.draw do
4
- post "/", controller: 'graphql', action: 'execute'
4
+ match "/", controller: 'graphql', action: 'execute', via: [:options, :post]
5
5
  end
@@ -1,14 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Types
4
- class MutationType < Ibrain::Types::BaseObject
4
+ class MutationType < Ibrain::Types::BaseApiObject
5
5
  description 'Define all mutation for client'
6
6
 
7
7
  # TODO: remove me
8
- field :test_field, String, null: false,
8
+ # Default session_required is true, set false if yout want to skip authenticated
9
+ field :test_authenticated_field, , String, null: false,
9
10
  description: 'An example field added by the generator'
11
+
12
+ field :test_field, String, null: false,
13
+ description: 'An example field added by the generator', session_required: false
10
14
  def test_field
11
15
  'Hello World'
12
16
  end
17
+
18
+ def test_authenticated_field
19
+ 'Im logged in!'
20
+ end
13
21
  end
14
22
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Types
4
- class QueryType < Ibrain::Types::BaseObject
4
+ class QueryType < Ibrain::Types::BaseApiObject
5
5
  description 'Define all resolver for client'
6
6
 
7
7
  # Add `node(id: ID!) and `nodes(ids: [ID!]!)`
@@ -9,9 +9,11 @@ module Types
9
9
  include GraphQL::Types::Relay::HasNodesField
10
10
 
11
11
  # Add root-level fields here.
12
+ # Default session_required is true, set false if yout want to skip authenticated
12
13
  # They will be entry points for queries on your schema.
13
14
 
14
15
  # Example with user resolvers
15
- # field :users, resolver: Resolvers::UsersResolver
16
+ # field :authenticated_users, resolver: Resolvers::UsersResolver
17
+ # field :users, resolver: Resolvers::UsersResolver, session_required: false
16
18
  end
17
19
  end
@@ -1,14 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Ibrain
4
- VERSION = "0.2.0"
4
+ VERSION = "0.2.4"
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.9'
11
+ '0.2.3'
12
12
  end
13
13
 
14
14
  def self.ibrain_gem_version
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.2.0
4
+ version: 0.2.4
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: 2022-01-05 00:00:00.000000000 Z
11
+ date: 2022-01-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord-session_store
@@ -186,6 +186,8 @@ files:
186
186
  - app/controllers/ibrain/core/graphql_controller.rb
187
187
  - app/graphql/ibrain/base_schema.rb
188
188
  - app/graphql/ibrain/extentions/default_value.rb
189
+ - app/graphql/ibrain/extentions/roles.rb
190
+ - app/graphql/ibrain/extentions/session_required.rb
189
191
  - app/graphql/ibrain/interfaces/base_interface.rb
190
192
  - app/graphql/ibrain/interfaces/person_interface.rb
191
193
  - app/graphql/ibrain/interfaces/record_interface.rb
@@ -198,6 +200,10 @@ files:
198
200
  - app/graphql/ibrain/resolvers/base_resolver.rb
199
201
  - app/graphql/ibrain/types/aggregate_type.rb
200
202
  - app/graphql/ibrain/types/attribute_type.rb
203
+ - app/graphql/ibrain/types/base_api_connection.rb
204
+ - app/graphql/ibrain/types/base_api_edge.rb
205
+ - app/graphql/ibrain/types/base_api_field.rb
206
+ - app/graphql/ibrain/types/base_api_object.rb
201
207
  - app/graphql/ibrain/types/base_argument.rb
202
208
  - app/graphql/ibrain/types/base_connection.rb
203
209
  - app/graphql/ibrain/types/base_edge.rb
@@ -207,7 +213,6 @@ files:
207
213
  - app/graphql/ibrain/types/base_interface.rb
208
214
  - app/graphql/ibrain/types/base_node.rb
209
215
  - app/graphql/ibrain/types/base_object.rb
210
- - app/graphql/ibrain/types/base_query_type.rb
211
216
  - app/graphql/ibrain/types/base_scalar.rb
212
217
  - app/graphql/ibrain/types/base_union.rb
213
218
  - app/graphql/ibrain/types/filter_type.rb
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Ibrain
4
- module Types
5
- class BaseQueryType < Types::BaseObject
6
- # Add `node(id: ID!) and `nodes(ids: [ID!]!)`
7
- include GraphQL::Types::Relay::HasNodeField
8
- include GraphQL::Types::Relay::HasNodesField
9
-
10
- # Add root-level fields here.
11
- # They will be entry points for queries on your schema.
12
- end
13
- end
14
- end