Skip to content

Commit 87a46c9

Browse files
committed
Fix error structure
1 parent 1bf86d9 commit 87a46c9

File tree

13 files changed

+82
-73
lines changed

13 files changed

+82
-73
lines changed

app/graphql/mutations/base_mutation.rb

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,12 @@ def current_authentication
2727
end
2828

2929
def create_error(code, message)
30-
{ code: code, details: message }
30+
ErrorCode.validate_error_code!(code)
31+
32+
Sagittarius::Graphql::ErrorContainer.new(
33+
code,
34+
[{ message: message }]
35+
)
3136
end
3237
end
3338
end

app/graphql/mutations/users/register.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ class Register < BaseMutation
1616
argument :username, String, required: true, description: 'Username of the user'
1717

1818
def resolve(username:, email:, password:, password_repeat:)
19-
return { user: nil, errors: [create_message_error('Invalid password repeat')] } if password != password_repeat
19+
if password != password_repeat
20+
return { user: nil, errors: [create_error(:invalid_password_repeat, 'Invalid password repeat')] }
21+
end
2022

2123
response = ::Users::RegisterService.new(
2224
username,

app/graphql/types/errors/detailed_error_type.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ def self.resolve_type(object, _ctx)
1313
case object
1414
when ActiveModel::Error
1515
Types::Errors::ActiveModelErrorType
16-
when Sagittarius::Graphql::ErrorMessageContainer
16+
when Hash
1717
Types::Errors::MessageErrorType
1818
else
1919
raise 'Unsupported DetailedErrorType'

app/graphql/types/errors/error_code_type.rb

Lines changed: 0 additions & 14 deletions
This file was deleted.

app/graphql/types/errors/error_type.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ class ErrorType < Types::BaseObject
88
# rubocop:enable GraphQL/GraphqlName
99
description 'Objects that can present an error'
1010

11-
field :code, Errors::ErrorCodeType, null: false, description: 'The code representing the error type'
1211
field :details, [Errors::DetailedErrorType], null: true, description: 'Detailed validation errors if applicable'
12+
field :error_code, ErrorCodeEnum, null: false, description: 'The code representing the error type'
13+
1314
end
1415
end
1516
end

app/services/error_code.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ def self.error_codes
3636
failed_to_invalidate_old_backup_codes: { description: 'The old backup codes could not be deleted' },
3737
failed_to_save_valid_backup_code: { description: 'The new backup codes could not be saved' },
3838
invalid_setting: { description: 'Invalid setting provided' },
39-
39+
invalid_user: { description: 'The user is invalid because of active model errors' },
40+
invalid_password_repeat: { description: 'The provided password repeat does not match the password' },
4041
primary_level_not_found: { description: '', deprecation_reason: 'Outdated concept' },
4142
secondary_level_not_found: { description: '', deprecation_reason: 'Outdated concept' },
4243
tertiary_level_exceeds_parameters: { description: '', deprecation_reason: 'Outdated concept' },

app/services/service_response.rb

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# frozen_string_literal: true
22

33
class ServiceResponse
4+
include Code0::ZeroTrack::Loggable
5+
46
def self.success(message: nil, payload: nil)
57
new(status: :success, message: message, payload: payload)
68
end
@@ -10,7 +12,8 @@ def self.error(message: nil, error_code: nil, details: nil)
1012

1113
ErrorCode.validate_error_code!(error_code)
1214

13-
new(status: :error, message: message, payload: { error_code: error_code, details: details })
15+
new(status: :error, message: message,
16+
payload: { error_code: error_code, details: details })
1417
end
1518

1619
attr_reader :status, :message, :payload
@@ -47,17 +50,16 @@ def to_h
4750

4851
def to_mutation_response(success_key: :object)
4952
return { success_key => payload, errors: [] } if success?
50-
return { success_key => nil, errors: payload } if payload&.details.is_a?(ActiveModel::Errors)
51-
52-
payload.details = Array.wrap(payload&.details).map do |message|
53-
case message
54-
when String
55-
Sagittarius::Graphql::ErrorMessageContainer.new(message: message)
56-
when Symbol
57-
Sagittarius::Graphql::ServiceResponseErrorContainer.new(error_code: message)
58-
end
59-
end
6053

61-
{ success_key => nil, errors: payload }
54+
payload[:details] = if payload[:details].is_a?(ActiveModel::Errors)
55+
payload[:details].errors
56+
else
57+
Array.wrap(payload[:details]).map do |message|
58+
{ message: message }
59+
end
60+
end
61+
62+
{ success_key => nil,
63+
errors: [Sagittarius::Graphql::ErrorContainer.new(payload[:error_code], payload[:details])] }
6264
end
6365
end

app/services/users/identity/register_service.rb

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@ def initialize(provider_id, args)
1616

1717
def execute
1818
unless ApplicationSetting.current[:user_registration_enabled]
19-
return ServiceResponse.error(message: 'User registration is disabled', payload: :registration_disabled)
19+
return ServiceResponse.error(message: 'User registration is disabled', error_code: :registration_disabled)
2020
end
2121

2222
begin
2323
identity = identity_provider.load_identity(provider_id, args)
2424
rescue Code0::Identities::Error => e
2525
logger.warn(message: 'Identity validation failed', exception: e)
26-
return ServiceResponse.error(message: e.message, payload: :identity_validation_failed)
26+
return ServiceResponse.error(message: e.message, error_code: :identity_validation_failed)
2727
end
2828

2929
identifier = identity.identifier
@@ -33,7 +33,7 @@ def execute
3333
lastname = identity.lastname
3434
password = SecureRandom.base58(50)
3535

36-
return ServiceResponse.error(message: 'No email given', payload: :missing_identity_data) if email.nil?
36+
return ServiceResponse.error(error_code: :missing_identity_data) if email.nil?
3737

3838
username = email.split('@').first if username.nil?
3939

@@ -48,17 +48,17 @@ def execute
4848
user = User.create(username: username, email: email, password: password, firstname: firstname,
4949
lastname: lastname)
5050
user.ensure_namespace
51-
return ServiceResponse.error(message: 'User is invalid', payload: user.errors) unless user.persisted?
51+
return ServiceResponse.error(error_code: :invalid_user, details: user.errors) unless user.persisted?
5252

5353
user_identity = UserIdentity.create(user: user, provider_id: provider_id, identifier: identifier)
5454
unless user_identity.persisted?
55-
t.rollback_and_return! ServiceResponse.error(message: 'UserIdentity is invalid',
56-
payload: user_identity.errors)
55+
t.rollback_and_return! ServiceResponse.error(error_code: :invalid_user_identity,
56+
details: user_identity.errors)
5757
end
5858
user_session = UserSession.create(user: user)
5959
unless user_session.persisted?
60-
t.rollback_and_return! ServiceResponse.error(message: 'UserSession is invalid',
61-
payload: user_session.errors)
60+
t.rollback_and_return! ServiceResponse.error(message: :invalid_user_session,
61+
details: user_session.errors)
6262
end
6363

6464
AuditService.audit(

app/services/users/register_service.rb

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,21 @@ def initialize(username, email, password)
1515

1616
def execute
1717
unless ApplicationSetting.current[:user_registration_enabled]
18-
return ServiceResponse.error(message: 'User registration is disabled', payload: :registration_disabled)
18+
return ServiceResponse.error(message: 'User registration is disabled', error_code: :registration_disabled)
1919
end
2020

2121
transactional do |t|
2222
user = User.create(username: username, email: email, password: password)
2323
user.ensure_namespace
24-
return ServiceResponse.error(message: 'User is invalid', payload: user.errors) unless user.persisted?
24+
unless user.persisted?
25+
return ServiceResponse.error(message: 'User is invalid', error_code: :invalid_user, details: user.errors)
26+
end
2527

2628
user_session = UserSession.create(user: user)
2729
unless user_session.persisted?
2830
t.rollback_and_return! ServiceResponse.error(message: 'UserSession is invalid',
29-
payload: user_session.errors)
31+
error_code: :invalid_user_session,
32+
details: user_session.errors)
3033
end
3134

3235
email_verification_response = EmailVerificationSendService.new(
@@ -36,7 +39,8 @@ def execute
3639

3740
unless email_verification_response.success?
3841
t.rollback_and_return! ServiceResponse.error(message: 'Failed to send verification email',
39-
payload: email_verification_response.payload)
42+
error_code: :email_verification_send_failed,
43+
details: email_verification_response.payload)
4044
end
4145

4246
AuditService.audit(

lib/sagittarius/graphql/error_message_container.rb renamed to lib/sagittarius/graphql/error_container.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22

33
module Sagittarius
44
module Graphql
5-
ErrorMessageContainer = Struct.new(:message)
5+
ErrorContainer = Struct.new(:error_code, :details)
66
end
77
end

0 commit comments

Comments
 (0)