graphql_devise 0.11.4 → 0.13.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.
Files changed (172) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/.travis.yml +7 -0
  4. data/Appraisals +14 -0
  5. data/CHANGELOG.md +56 -0
  6. data/Gemfile +2 -0
  7. data/README.md +219 -20
  8. data/Rakefile +2 -0
  9. data/app/controllers/graphql_devise/application_controller.rb +6 -5
  10. data/app/controllers/graphql_devise/concerns/set_user_by_token.rb +31 -0
  11. data/app/controllers/graphql_devise/graphql_controller.rb +4 -0
  12. data/app/helpers/graphql_devise/application_helper.rb +2 -0
  13. data/app/helpers/graphql_devise/mailer_helper.rb +4 -2
  14. data/app/models/graphql_devise/concerns/model.rb +10 -0
  15. data/app/views/graphql_devise/mailer/confirmation_instructions.html.erb +1 -1
  16. data/app/views/graphql_devise/mailer/reset_password_instructions.html.erb +1 -1
  17. data/config/locales/en.yml +1 -0
  18. data/config/routes.rb +4 -0
  19. data/graphql_devise.gemspec +6 -4
  20. data/lib/generators/graphql_devise/install_generator.rb +30 -5
  21. data/lib/graphql_devise.rb +26 -10
  22. data/lib/graphql_devise/concerns/controller_methods.rb +2 -0
  23. data/lib/graphql_devise/default_operations/mutations.rb +8 -6
  24. data/lib/graphql_devise/default_operations/resolvers.rb +4 -2
  25. data/lib/graphql_devise/engine.rb +2 -0
  26. data/lib/graphql_devise/errors/authentication_error.rb +9 -0
  27. data/lib/graphql_devise/{detailed_user_error.rb → errors/detailed_user_error.rb} +3 -1
  28. data/lib/graphql_devise/errors/error_codes.rb +8 -0
  29. data/lib/graphql_devise/errors/execution_error.rb +6 -0
  30. data/lib/graphql_devise/{user_error.rb → errors/user_error.rb} +3 -1
  31. data/lib/graphql_devise/model/with_email_updater.rb +74 -0
  32. data/lib/graphql_devise/mount_method/operation_preparer.rb +4 -2
  33. data/lib/graphql_devise/mount_method/operation_preparers/custom_operation_preparer.rb +2 -0
  34. data/lib/graphql_devise/mount_method/operation_preparers/default_operation_preparer.rb +8 -2
  35. data/lib/graphql_devise/mount_method/operation_preparers/gql_name_setter.rb +3 -1
  36. data/lib/graphql_devise/mount_method/operation_preparers/mutation_field_setter.rb +5 -2
  37. data/lib/graphql_devise/mount_method/operation_preparers/resolver_type_setter.rb +3 -1
  38. data/lib/graphql_devise/mount_method/operation_preparers/resource_name_setter.rb +4 -2
  39. data/lib/graphql_devise/mount_method/operation_sanitizer.rb +2 -0
  40. data/lib/graphql_devise/mount_method/option_sanitizer.rb +2 -0
  41. data/lib/graphql_devise/mount_method/option_sanitizers/array_checker.rb +2 -0
  42. data/lib/graphql_devise/mount_method/option_sanitizers/class_checker.rb +2 -0
  43. data/lib/graphql_devise/mount_method/option_sanitizers/hash_checker.rb +2 -0
  44. data/lib/graphql_devise/mount_method/option_sanitizers/string_checker.rb +2 -0
  45. data/lib/graphql_devise/mount_method/option_validators/provided_operations_validator.rb +2 -0
  46. data/lib/graphql_devise/mount_method/option_validators/skip_only_validator.rb +2 -0
  47. data/lib/graphql_devise/mount_method/option_validators/supported_operations_validator.rb +2 -0
  48. data/lib/graphql_devise/mount_method/options_validator.rb +2 -0
  49. data/lib/graphql_devise/mount_method/supported_options.rb +2 -0
  50. data/lib/graphql_devise/mutations/base.rb +2 -0
  51. data/lib/graphql_devise/mutations/login.rb +2 -0
  52. data/lib/graphql_devise/mutations/logout.rb +2 -0
  53. data/lib/graphql_devise/mutations/resend_confirmation.rb +5 -5
  54. data/lib/graphql_devise/mutations/send_password_reset.rb +7 -2
  55. data/lib/graphql_devise/mutations/sign_up.rb +5 -6
  56. data/lib/graphql_devise/mutations/update_password.rb +2 -0
  57. data/lib/graphql_devise/rails/routes.rb +7 -72
  58. data/lib/graphql_devise/resolvers/base.rb +2 -0
  59. data/lib/graphql_devise/resolvers/check_password_token.rb +2 -0
  60. data/lib/graphql_devise/resolvers/confirm_account.rb +4 -2
  61. data/lib/graphql_devise/resolvers/dummy.rb +2 -0
  62. data/lib/graphql_devise/resource_loader.rb +89 -0
  63. data/lib/graphql_devise/schema.rb +2 -0
  64. data/lib/graphql_devise/schema_plugin.rb +114 -0
  65. data/lib/graphql_devise/types/authenticatable_type.rb +2 -0
  66. data/lib/graphql_devise/types/credential_type.rb +2 -0
  67. data/lib/graphql_devise/types/mutation_type.rb +2 -0
  68. data/lib/graphql_devise/types/query_type.rb +2 -0
  69. data/lib/graphql_devise/version.rb +3 -1
  70. data/spec/dummy/Rakefile +2 -0
  71. data/spec/dummy/app/controllers/api/v1/graphql_controller.rb +38 -3
  72. data/spec/dummy/app/controllers/application_controller.rb +2 -0
  73. data/spec/dummy/app/graphql/dummy_schema.rb +21 -0
  74. data/spec/dummy/app/graphql/interpreter_schema.rb +11 -0
  75. data/spec/dummy/app/graphql/mutations/login.rb +2 -0
  76. data/spec/dummy/app/graphql/mutations/register_confirmed_user.rb +2 -0
  77. data/spec/dummy/app/graphql/mutations/sign_up.rb +2 -0
  78. data/spec/dummy/app/graphql/mutations/update_user.rb +22 -0
  79. data/spec/dummy/app/graphql/resolvers/public_user.rb +2 -0
  80. data/spec/dummy/app/graphql/resolvers/user_show.rb +2 -0
  81. data/spec/dummy/app/graphql/types/base_object.rb +2 -0
  82. data/spec/dummy/app/graphql/types/custom_admin_type.rb +2 -0
  83. data/spec/dummy/app/graphql/types/mutation_type.rb +4 -1
  84. data/spec/dummy/app/graphql/types/query_type.rb +12 -0
  85. data/spec/dummy/app/graphql/types/user_type.rb +2 -0
  86. data/spec/dummy/app/jobs/application_job.rb +2 -0
  87. data/spec/dummy/app/mailers/application_mailer.rb +2 -0
  88. data/spec/dummy/app/models/admin.rb +2 -0
  89. data/spec/dummy/app/models/application_record.rb +2 -0
  90. data/spec/dummy/app/models/guest.rb +2 -0
  91. data/spec/dummy/app/models/schema_user.rb +13 -0
  92. data/spec/dummy/app/models/user.rb +2 -0
  93. data/spec/dummy/app/models/users.rb +2 -0
  94. data/spec/dummy/app/models/users/customer.rb +2 -0
  95. data/spec/dummy/config.ru +2 -0
  96. data/spec/dummy/config/application.rb +2 -0
  97. data/spec/dummy/config/environment.rb +2 -0
  98. data/spec/dummy/config/environments/development.rb +2 -0
  99. data/spec/dummy/config/environments/production.rb +2 -0
  100. data/spec/dummy/config/environments/test.rb +2 -0
  101. data/spec/dummy/config/initializers/application_controller_renderer.rb +2 -0
  102. data/spec/dummy/config/initializers/backtrace_silencers.rb +2 -0
  103. data/spec/dummy/config/initializers/cors.rb +2 -0
  104. data/spec/dummy/config/initializers/devise_token_auth.rb +2 -0
  105. data/spec/dummy/config/initializers/filter_parameter_logging.rb +2 -0
  106. data/spec/dummy/config/initializers/i18n.rb +2 -0
  107. data/spec/dummy/config/initializers/inflections.rb +2 -0
  108. data/spec/dummy/config/initializers/mime_types.rb +2 -0
  109. data/spec/dummy/config/initializers/wrap_parameters.rb +2 -0
  110. data/spec/dummy/config/puma.rb +2 -0
  111. data/spec/dummy/config/routes.rb +5 -0
  112. data/spec/dummy/config/spring.rb +2 -0
  113. data/spec/dummy/db/migrate/20190815114303_create_users.rb +2 -0
  114. data/spec/dummy/db/migrate/20190824215150_add_auth_available_to_users.rb +2 -0
  115. data/spec/dummy/db/migrate/20190916012505_create_admins.rb +2 -0
  116. data/spec/dummy/db/migrate/20191013213045_create_guests.rb +2 -0
  117. data/spec/dummy/db/migrate/20200321121807_create_users_customers.rb +2 -0
  118. data/spec/dummy/db/migrate/20200621182414_remove_uncofirmed_email_from_admins.rb +7 -0
  119. data/spec/dummy/db/migrate/20200623003142_create_schema_users.rb +46 -0
  120. data/spec/dummy/db/schema.rb +30 -2
  121. data/spec/dummy/db/seeds.rb +2 -0
  122. data/spec/factories/admins.rb +2 -0
  123. data/spec/factories/guests.rb +2 -0
  124. data/spec/factories/schema_users.rb +13 -0
  125. data/spec/factories/users.rb +2 -0
  126. data/spec/factories/users_customers.rb +2 -0
  127. data/spec/generators/graphql_devise/install_generator_spec.rb +23 -0
  128. data/spec/graphql_devise/model/with_email_updater_spec.rb +131 -0
  129. data/spec/graphql_devise_spec.rb +2 -0
  130. data/spec/models/user_spec.rb +2 -0
  131. data/spec/rails_helper.rb +3 -1
  132. data/spec/requests/graphql_controller_spec.rb +82 -0
  133. data/spec/requests/mutations/additional_mutations_spec.rb +2 -0
  134. data/spec/requests/mutations/additional_queries_spec.rb +2 -0
  135. data/spec/requests/mutations/login_spec.rb +2 -0
  136. data/spec/requests/mutations/logout_spec.rb +2 -0
  137. data/spec/requests/mutations/resend_confirmation_spec.rb +46 -29
  138. data/spec/requests/mutations/send_password_reset_spec.rb +42 -12
  139. data/spec/requests/mutations/sign_up_spec.rb +2 -0
  140. data/spec/requests/mutations/update_password_spec.rb +2 -0
  141. data/spec/requests/queries/check_password_token_spec.rb +2 -0
  142. data/spec/requests/queries/confirm_account_spec.rb +9 -1
  143. data/spec/requests/user_controller_spec.rb +237 -23
  144. data/spec/services/mount_method/operation_preparer_spec.rb +10 -3
  145. data/spec/services/mount_method/operation_preparers/custom_operation_preparer_spec.rb +3 -1
  146. data/spec/services/mount_method/operation_preparers/default_operation_preparer_spec.rb +17 -8
  147. data/spec/services/mount_method/operation_preparers/gql_name_setter_spec.rb +2 -0
  148. data/spec/services/mount_method/operation_preparers/mutation_field_setter_spec.rb +20 -4
  149. data/spec/services/mount_method/operation_preparers/resolver_type_setter_spec.rb +2 -0
  150. data/spec/services/mount_method/operation_preparers/resource_name_setter_spec.rb +3 -1
  151. data/spec/services/mount_method/operation_sanitizer_spec.rb +2 -0
  152. data/spec/services/mount_method/option_sanitizer_spec.rb +2 -0
  153. data/spec/services/mount_method/option_sanitizers/array_checker_spec.rb +2 -0
  154. data/spec/services/mount_method/option_sanitizers/class_checker_spec.rb +2 -0
  155. data/spec/services/mount_method/option_sanitizers/hash_checker_spec.rb +2 -0
  156. data/spec/services/mount_method/option_sanitizers/string_checker_spec.rb +2 -0
  157. data/spec/services/mount_method/option_validators/provided_operations_validator_spec.rb +2 -0
  158. data/spec/services/mount_method/option_validators/skip_only_validator_spec.rb +2 -0
  159. data/spec/services/mount_method/option_validators/supported_operations_validator_spec.rb +2 -0
  160. data/spec/services/mount_method/options_validator_spec.rb +2 -0
  161. data/spec/services/resource_loader_spec.rb +84 -0
  162. data/spec/services/schema_plugin_spec.rb +28 -0
  163. data/spec/spec_helper.rb +2 -0
  164. data/spec/support/contexts/graphql_request.rb +2 -0
  165. data/spec/support/factory_bot.rb +2 -0
  166. data/spec/support/matchers/auth_headers_matcher.rb +2 -0
  167. data/spec/support/matchers/not_change_matcher.rb +2 -0
  168. data/spec/support/requests/auth_helpers.rb +2 -0
  169. data/spec/support/requests/json_helpers.rb +2 -0
  170. metadata +120 -87
  171. data/lib/graphql_devise/error_codes.rb +0 -5
  172. data/spec/support/generators/file_helpers.rb +0 -12
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GraphqlDevise
2
4
  class Schema < GraphQL::Schema
3
5
  end
@@ -0,0 +1,114 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphqlDevise
4
+ class SchemaPlugin
5
+ DEFAULT_NOT_AUTHENTICATED = ->(field) { raise GraphqlDevise::AuthenticationError, "#{field} field requires authentication" }
6
+
7
+ def initialize(query: nil, mutation: nil, authenticate_default: true, resource_loaders: [], unauthenticated_proc: DEFAULT_NOT_AUTHENTICATED)
8
+ @query = query
9
+ @mutation = mutation
10
+ @resource_loaders = resource_loaders
11
+ @authenticate_default = authenticate_default
12
+ @unauthenticated_proc = unauthenticated_proc
13
+
14
+ # Must happen on initialize so operations are loaded before the types are added to the schema on GQL < 1.10
15
+ load_fields
16
+ reconfigure_warden!
17
+ end
18
+
19
+ def use(schema_definition)
20
+ schema_definition.tracer(self)
21
+ end
22
+
23
+ def trace(event, trace_data)
24
+ # Authenticate only root level queries
25
+ return yield unless event == 'execute_field' && path(trace_data).count == 1
26
+
27
+ field = traced_field(trace_data)
28
+ provided_value = authenticate_option(field, trace_data)
29
+ context = set_current_resource(context_from_data(trace_data))
30
+
31
+ if !provided_value.nil?
32
+ raise_on_missing_resource(context, field) if provided_value
33
+ elsif @authenticate_default
34
+ raise_on_missing_resource(context, field)
35
+ end
36
+
37
+ yield
38
+ end
39
+
40
+ private
41
+
42
+ def set_current_resource(context)
43
+ controller = context[:controller]
44
+ resource_names = Array(context[:resource_name])
45
+ context[:current_resource] = resource_names.find do |resource_name|
46
+ unless Devise.mappings.key?(resource_name)
47
+ raise(
48
+ GraphqlDevise::Error,
49
+ "Invalid resource_name `#{resource_name}` provided to `graphql_context`. Possible values are: #{Devise.mappings.keys}."
50
+ )
51
+ end
52
+
53
+ found = controller.set_resource_by_token(resource_name)
54
+ break found if found
55
+ end
56
+
57
+ context
58
+ end
59
+
60
+ def raise_on_missing_resource(context, field)
61
+ @unauthenticated_proc.call(field.name) if context[:current_resource].blank?
62
+ end
63
+
64
+ def context_from_data(trace_data)
65
+ query = if trace_data[:context]
66
+ trace_data[:context].query
67
+ else
68
+ trace_data[:query]
69
+ end
70
+
71
+ query.context
72
+ end
73
+
74
+ def path(trace_data)
75
+ if trace_data[:context]
76
+ trace_data[:context].path
77
+ else
78
+ trace_data[:path]
79
+ end
80
+ end
81
+
82
+ def traced_field(trace_data)
83
+ if trace_data[:context]
84
+ trace_data[:context].field
85
+ else
86
+ trace_data[:field]
87
+ end
88
+ end
89
+
90
+ def authenticate_option(field, trace_data)
91
+ if trace_data[:context]
92
+ field.metadata[:authenticate]
93
+ else
94
+ field.graphql_definition.metadata[:authenticate]
95
+ end
96
+ end
97
+
98
+ def reconfigure_warden!
99
+ Devise.class_variable_set(:@@warden_configured, nil)
100
+ Devise.configure_warden!
101
+ end
102
+
103
+ def load_fields
104
+ @resource_loaders.each do |resource_loader|
105
+ raise Error, 'Invalid resource loader instance' unless resource_loader.instance_of?(GraphqlDevise::ResourceLoader)
106
+
107
+ resource_loader.call(@query, @mutation)
108
+ end
109
+ end
110
+ end
111
+ end
112
+
113
+ GraphQL::Field.accepts_definitions(authenticate: GraphQL::Define.assign_metadata_key(:authenticate))
114
+ GraphQL::Schema::Field.accepts_definition(:authenticate)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GraphqlDevise
2
4
  module Types
3
5
  class AuthenticatableType < GraphQL::Schema::Object
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GraphqlDevise
2
4
  module Types
3
5
  class CredentialType < GraphQL::Schema::Object
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GraphqlDevise
2
4
  module Types
3
5
  class MutationType < GraphQL::Schema::Object
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GraphqlDevise
2
4
  module Types
3
5
  class QueryType < GraphQL::Schema::Object
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GraphqlDevise
2
- VERSION = '0.11.4'.freeze
4
+ VERSION = '0.13.0'.freeze
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Add your own tasks in files placed in lib/tasks ending in .rake,
2
4
  # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
5
 
@@ -1,16 +1,51 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Api
2
4
  module V1
3
5
  class GraphqlController < ApplicationController
4
6
  include GraphqlDevise::Concerns::SetUserByToken
5
7
 
6
- before_action :authenticate_user!
7
-
8
8
  def graphql
9
- render json: DummySchema.execute(params[:query])
9
+ result = DummySchema.execute(params[:query], execute_params(params))
10
+
11
+ render json: result unless performed?
12
+ end
13
+
14
+ def interpreter
15
+ render json: InterpreterSchema.execute(params[:query], execute_params(params))
16
+ end
17
+
18
+ def failing_resource_name
19
+ render json: DummySchema.execute(params[:query], context: graphql_context([:user, :fail]))
10
20
  end
11
21
 
12
22
  private
13
23
 
24
+ def execute_params(item)
25
+ {
26
+ operation_name: item[:operationName],
27
+ variables: ensure_hash(item[:variables]),
28
+ context: graphql_context([:user, :schema_user])
29
+ }
30
+ end
31
+
32
+ def ensure_hash(ambiguous_param)
33
+ case ambiguous_param
34
+ when String
35
+ if ambiguous_param.present?
36
+ ensure_hash(JSON.parse(ambiguous_param))
37
+ else
38
+ {}
39
+ end
40
+ when Hash, ActionController::Parameters
41
+ ambiguous_param
42
+ when nil
43
+ {}
44
+ else
45
+ raise ArgumentError, "Unexpected parameter: #{ambiguous_param}"
46
+ end
47
+ end
48
+
14
49
  def verify_authenticity_token
15
50
  end
16
51
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ApplicationController < ActionController::Base
2
4
  protect_from_forgery with: :exception
3
5
  end
@@ -1,4 +1,25 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class DummySchema < GraphQL::Schema
4
+ use GraphqlDevise::SchemaPlugin.new(
5
+ query: Types::QueryType,
6
+ mutation: Types::MutationType,
7
+ resource_loaders: [
8
+ GraphqlDevise::ResourceLoader.new(
9
+ 'User',
10
+ only: [
11
+ :login,
12
+ :confirm_account,
13
+ :send_password_reset,
14
+ :resend_confirmation,
15
+ :check_password_token
16
+ ]
17
+ ),
18
+ GraphqlDevise::ResourceLoader.new('Guest', only: [:logout]),
19
+ GraphqlDevise::ResourceLoader.new('SchemaUser')
20
+ ]
21
+ )
22
+
2
23
  mutation(Types::MutationType)
3
24
  query(Types::QueryType)
4
25
  end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ class InterpreterSchema < GraphQL::Schema
4
+ use GraphQL::Execution::Interpreter if Gem::Version.new(GraphQL::VERSION) >= Gem::Version.new('1.9.0')
5
+ use GraphQL::Analysis::AST if Gem::Version.new(GraphQL::VERSION) >= Gem::Version.new('1.10.0')
6
+
7
+ use GraphqlDevise::SchemaPlugin.new(query: Types::QueryType, authenticate_default: false)
8
+
9
+ mutation(Types::MutationType)
10
+ query(Types::QueryType)
11
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Mutations
2
4
  class Login < GraphqlDevise::Mutations::Login
3
5
  field :user, Types::UserType, null: true
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Mutations
2
4
  class RegisterConfirmedUser < GraphqlDevise::Mutations::Base
3
5
  argument :email, String, required: true
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Mutations
2
4
  class SignUp < GraphqlDevise::Mutations::SignUp
3
5
  argument :name, String, required: false
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mutations
4
+ class UpdateUser < GraphQL::Schema::Mutation
5
+ field :user, Types::UserType, null: false
6
+
7
+ argument :email, String, required: false
8
+ argument :name, String, required: false
9
+
10
+ def resolve(**attrs)
11
+ user = context[:current_resource]
12
+
13
+ schema_url = context[:controller].full_url_without_params
14
+
15
+ user.update_with_email(
16
+ attrs.merge(schema_url: schema_url, confirmation_success_url: 'https://google.com')
17
+ )
18
+
19
+ { user: user }
20
+ end
21
+ end
22
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Resolvers
2
4
  class PublicUser < GraphQL::Schema::Resolver
3
5
  type Types::UserType, null: false
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Resolvers
2
4
  class UserShow < GraphQL::Schema::Resolver
3
5
  type Types::UserType, null: false
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Types
2
4
  class BaseObject < GraphQL::Schema::Object
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Types
2
4
  class CustomAdminType < GraphQL::Schema::Object
3
5
  field :email, String, null: false
@@ -1,6 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Types
2
4
  class MutationType < Types::BaseObject
3
- field :dummy_mutation, String, null: false
5
+ field :dummy_mutation, String, null: false, authenticate: true
6
+ field :update_user, mutation: Mutations::UpdateUser
4
7
 
5
8
  def dummy_mutation
6
9
  'Necessary so GraphQL gem does not complain about empty mutation type'
@@ -1,5 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Types
2
4
  class QueryType < Types::BaseObject
3
5
  field :user, resolver: Resolvers::UserShow
6
+ field :public_field, String, null: false, authenticate: false
7
+ field :private_field, String, null: false, authenticate: true
8
+
9
+ def public_field
10
+ 'Field does not require authentication'
11
+ end
12
+
13
+ def private_field
14
+ 'Field will always require authentication'
15
+ end
4
16
  end
5
17
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Types
2
4
  class UserType < GraphQL::Schema::Object
3
5
  field :id, Int, null: false
@@ -1,2 +1,4 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ApplicationJob < ActiveJob::Base
2
4
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ApplicationMailer < ActionMailer::Base
2
4
  default from: 'from@example.com'
3
5
  layout 'mailer'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Admin < ApplicationRecord
2
4
  devise :database_authenticatable,
3
5
  :registerable,
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ApplicationRecord < ActiveRecord::Base
2
4
  self.abstract_class = true
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Guest < ApplicationRecord
2
4
  devise :database_authenticatable,
3
5
  :registerable,
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SchemaUser < ApplicationRecord
4
+ devise :database_authenticatable,
5
+ :recoverable,
6
+ :trackable,
7
+ :validatable,
8
+ :confirmable
9
+
10
+ include GraphqlDevise::Concerns::Model
11
+
12
+ validates :name, presence: true
13
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class User < ApplicationRecord
2
4
  devise :database_authenticatable,
3
5
  :registerable,
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Users
2
4
  def self.table_name_prefix
3
5
  'users_'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Users
2
4
  class Customer < ApplicationRecord
3
5
  devise :database_authenticatable, :validatable
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # This file is used by Rack-based servers to start the application.
2
4
 
3
5
  require_relative 'config/environment'