forked from lequangcanh/rails_base_api
-
Notifications
You must be signed in to change notification settings - Fork 0
/
error.rb
93 lines (80 loc) · 1.89 KB
/
error.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
module Api
class BaseError < StandardError
attr_reader :code, :message
def initialize code: nil, message: nil
@code = code
@message = message
end
def serialize
[{code: @code, message: @message}]
end
def to_hash
{
success: false,
errors: serialize
}
end
end
class ExecuteFailed < BaseError
attr_reader :type, :file_path, :i18n_scope
def initialize type, error_detail
@type = type
@file_path = caller(0, 3).last.match(file_path_regex)[0]
@i18n_scope = get_i18n_scope
error = I18n.t error_detail, scope: i18n_scope
@code = error[:code]
@message = error[:message]
end
private
def get_i18n_scope
file_path.split(%r{/})[3..-1].map{|e| e.gsub file_suffix, ""}
end
def file_path_regex
case type
when :controller
%r{/app/(controllers)/.*.rb}
when :service
%r{/app/(services)/.*.rb}
end
end
def file_suffix
case type
when :controller
/_controller.rb/
when :service
/_service.rb/
end
end
end
module Error
# TODO: define custom error class (extends the BaseError) here.
class ServiceExectuteFailed < ExecuteFailed
def initialize error_detail
super :service, error_detail
end
end
class ControllerRuntimeError < ExecuteFailed
def initialize error_detail
super :controller, error_detail
end
end
class RecordNotFound < BaseError
attr_reader :error
def initialize error
@error = error
end
def to_hash
RecordNotFoundSerializer.new(error).serialize
end
end
class ActionNotAllowed < BaseError
attr_reader :error
def initialize error
@error = error
end
def to_hash
ActionNotAllowedSerializer.new(error).serialize
end
end
end
end