Skip to content

Commit ac0a377

Browse files
committed
Refactor: Error types
Signed-off-by: nyagamunene <[email protected]>
1 parent 1a5997a commit ac0a377

File tree

8 files changed

+1244
-326
lines changed

8 files changed

+1244
-326
lines changed

bootstrap/service.go

Lines changed: 209 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -17,36 +17,215 @@ import (
1717
mgsdk "github.com/absmach/magistrala/pkg/sdk/go"
1818
)
1919

20-
var (
21-
// ErrThings indicates failure to communicate with Magistrala Things service.
22-
// It can be due to networking error or invalid/unauthenticated request.
23-
ErrThings = errors.New("failed to receive response from Things service")
24-
25-
// ErrExternalKey indicates a non-existent bootstrap configuration for given external key.
26-
ErrExternalKey = errors.New("failed to get bootstrap configuration for given external key")
27-
28-
// ErrExternalKeySecure indicates error in getting bootstrap configuration for given encrypted external key.
29-
ErrExternalKeySecure = errors.New("failed to get bootstrap configuration for given encrypted external key")
30-
31-
// ErrBootstrap indicates error in getting bootstrap configuration.
32-
ErrBootstrap = errors.New("failed to read bootstrap configuration")
33-
34-
// ErrAddBootstrap indicates error in adding bootstrap configuration.
35-
ErrAddBootstrap = errors.New("failed to add bootstrap configuration")
36-
37-
errUpdateConnections = errors.New("failed to update connections")
38-
errRemoveBootstrap = errors.New("failed to remove bootstrap configuration")
39-
errChangeState = errors.New("failed to change state of bootstrap configuration")
40-
errUpdateChannel = errors.New("failed to update channel")
41-
errRemoveConfig = errors.New("failed to remove bootstrap configuration")
42-
errRemoveChannel = errors.New("failed to remove channel")
43-
errCreateThing = errors.New("failed to create thing")
44-
errDisconnectThing = errors.New("failed to disconnect thing")
45-
errCheckChannels = errors.New("failed to check if channels exists")
46-
errConnectionChannels = errors.New("failed to check channels connections")
47-
errThingNotFound = errors.New("failed to find thing")
48-
errUpdateCert = errors.New("failed to update cert")
49-
)
20+
// ErrThings indicates failure to communicate with Magistrala Things service.
21+
// It can be due to networking error or invalid/unauthenticated request.
22+
type ThingsError struct {
23+
Err errors.Error
24+
}
25+
26+
func (te *ThingsError) Error() string {
27+
return te.Err.Error()
28+
}
29+
30+
var ErrThings = &ThingsError{
31+
Err: errors.New("failed to receive response from Things service"),
32+
}
33+
34+
// ErrExternalKey indicates a non-existent bootstrap configuration for given external key.
35+
type ExternalKeyError struct {
36+
Err errors.Error
37+
}
38+
39+
func (eke *ExternalKeyError) Error() string {
40+
return eke.Err.Error()
41+
}
42+
43+
var ErrExternalKey = &ExternalKeyError{
44+
Err: errors.New("failed to get bootstrap configuration for given external key"),
45+
}
46+
47+
// ErrExternalKeySecure indicates error in getting bootstrap configuration for given encrypted external key.
48+
type ExternalKeySecureError struct {
49+
Err errors.Error
50+
}
51+
52+
func (ekse *ExternalKeySecureError) Error() string {
53+
return ekse.Err.Error()
54+
}
55+
56+
var ErrExternalKeySecure = &ExternalKeySecureError{
57+
Err: errors.New("failed to get bootstrap configuration for given encrypted external key"),
58+
}
59+
60+
// ErrBootstrap indicates error in getting bootstrap configuration.
61+
type BootstrapError struct {
62+
Err errors.Error
63+
}
64+
65+
func (be *BootstrapError) Error() string {
66+
return be.Err.Error()
67+
}
68+
69+
var ErrBootstrap = &BootstrapError{
70+
Err: errors.New("failed to read bootstrap configuration"),
71+
}
72+
73+
// ErrAddBootstrap indicates error in adding bootstrap configuration.
74+
type AddBootstrapError struct {
75+
Err errors.Error
76+
}
77+
78+
func (abe *AddBootstrapError) Error() string {
79+
return abe.Err.Error()
80+
}
81+
82+
var ErrAddBootstrap = &AddBootstrapError{
83+
Err: errors.New("failed to add bootstrap configuration"),
84+
}
85+
86+
type UpdateConnectionsError struct {
87+
Err errors.Error
88+
}
89+
90+
func (uce *UpdateConnectionsError) Error() string {
91+
return uce.Err.Error()
92+
}
93+
94+
var errUpdateConnections = &UpdateConnectionsError{
95+
Err: errors.New("failed to update connections"),
96+
}
97+
98+
type RemoveBootstrapError struct {
99+
Err errors.Error
100+
}
101+
102+
func (rbe *RemoveBootstrapError) Error() string {
103+
return rbe.Err.Error()
104+
}
105+
106+
var errRemoveBootstrap = &RemoveBootstrapError{
107+
Err: errors.New("failed to remove bootstrap configuration"),
108+
}
109+
110+
type ChangeStateError struct {
111+
Err errors.Error
112+
}
113+
114+
func (cse *ChangeStateError) Error() string {
115+
return cse.Err.Error()
116+
}
117+
118+
var errChangeState = &ChangeStateError{
119+
Err: errors.New("failed to change state of bootstrap configuration"),
120+
}
121+
122+
type UpdateChannelError struct {
123+
Err errors.Error
124+
}
125+
126+
func (uce *UpdateChannelError) Error() string {
127+
return uce.Err.Error()
128+
}
129+
130+
var errUpdateChannel = &UpdateChannelError{
131+
Err: errors.New("failed to update channel"),
132+
}
133+
134+
type RemoveConfigError struct {
135+
Err errors.Error
136+
}
137+
138+
func (rce *RemoveConfigError) Error() string {
139+
return rce.Err.Error()
140+
}
141+
142+
var errRemoveConfig = &RemoveConfigError{
143+
Err: errors.New("failed to remove bootstrap configuration"),
144+
}
145+
146+
type RemoveChannelError struct {
147+
Err errors.Error
148+
}
149+
150+
func (rce *RemoveChannelError) Error() string {
151+
return rce.Err.Error()
152+
}
153+
154+
var errRemoveChannel = &RemoveChannelError{
155+
Err: errors.New("failed to remove channel"),
156+
}
157+
158+
type CreateThingError struct {
159+
Err errors.Error
160+
}
161+
162+
func (cte *CreateThingError) Error() string {
163+
return cte.Err.Error()
164+
}
165+
166+
var errCreateThing = &CreateThingError{
167+
Err: errors.New("failed to create thing"),
168+
}
169+
170+
type DisconnectThingError struct {
171+
Err errors.Error
172+
}
173+
174+
func (dte *DisconnectThingError) Error() string {
175+
return dte.Err.Error()
176+
}
177+
178+
var errDisconnectThing = &DisconnectThingError{
179+
Err: errors.New("failed to disconnect thing"),
180+
}
181+
182+
type CheckChannelsError struct {
183+
Err errors.Error
184+
}
185+
186+
func (cce *CheckChannelsError) Error() string {
187+
return cce.Err.Error()
188+
}
189+
190+
var errCheckChannels = &CheckChannelsError{
191+
Err: errors.New("failed to check if channels exists"),
192+
}
193+
194+
type ConnectionChannelsError struct {
195+
Err errors.Error
196+
}
197+
198+
func (cce *ConnectionChannelsError) Error() string {
199+
return cce.Err.Error()
200+
}
201+
202+
var errConnectionChannels = &ConnectionChannelsError{
203+
Err: errors.New("failed to check channels connections"),
204+
}
205+
206+
type ThingNotFoundError struct {
207+
Err errors.Error
208+
}
209+
210+
func (tnfe *ThingNotFoundError) Error() string {
211+
return tnfe.Err.Error()
212+
}
213+
214+
var errThingNotFound = &ThingNotFoundError{
215+
Err: errors.New("failed to find thing"),
216+
}
217+
218+
type UpdateCertError struct {
219+
Err errors.Error
220+
}
221+
222+
func (uce *UpdateCertError) Error() string {
223+
return uce.Err.Error()
224+
}
225+
226+
var errUpdateCert = &UpdateCertError{
227+
Err: errors.New("failed to update cert"),
228+
}
50229

51230
var _ Service = (*bootstrapService)(nil)
52231

internal/api/common.go

Lines changed: 48 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -105,76 +105,71 @@ func EncodeError(_ context.Context, err error, w http.ResponseWriter) {
105105
}
106106

107107
w.Header().Set("Content-Type", ContentType)
108-
switch {
109-
case errors.Contains(err, svcerr.ErrAuthorization),
110-
errors.Contains(err, svcerr.ErrDomainAuthorization),
111-
errors.Contains(err, bootstrap.ErrExternalKey),
112-
errors.Contains(err, bootstrap.ErrExternalKeySecure):
108+
switch err.(type) {
109+
case *svcerr.AuthorizationError, *svcerr.DomainAuthorizationError, *bootstrap.ExternalKeyError, *bootstrap.ExternalKeySecureError:
113110
err = unwrap(err)
114111
w.WriteHeader(http.StatusForbidden)
115112

116-
case errors.Contains(err, svcerr.ErrAuthentication),
117-
errors.Contains(err, apiutil.ErrBearerToken),
118-
errors.Contains(err, svcerr.ErrLogin):
113+
case *svcerr.AuthenticationError, *apiutil.BearerTokenError, *svcerr.LoginError:
119114
err = unwrap(err)
120115
w.WriteHeader(http.StatusUnauthorized)
121-
case errors.Contains(err, svcerr.ErrMalformedEntity),
122-
errors.Contains(err, apiutil.ErrMalformedPolicy),
123-
errors.Contains(err, apiutil.ErrMissingSecret),
124-
errors.Contains(err, errors.ErrMalformedEntity),
125-
errors.Contains(err, apiutil.ErrMissingID),
126-
errors.Contains(err, apiutil.ErrMissingName),
127-
errors.Contains(err, apiutil.ErrMissingEmail),
128-
errors.Contains(err, apiutil.ErrMissingHost),
129-
errors.Contains(err, apiutil.ErrInvalidResetPass),
130-
errors.Contains(err, apiutil.ErrEmptyList),
131-
errors.Contains(err, apiutil.ErrMissingMemberKind),
132-
errors.Contains(err, apiutil.ErrMissingMemberType),
133-
errors.Contains(err, apiutil.ErrLimitSize),
134-
errors.Contains(err, apiutil.ErrBearerKey),
135-
errors.Contains(err, svcerr.ErrInvalidStatus),
136-
errors.Contains(err, apiutil.ErrNameSize),
137-
errors.Contains(err, apiutil.ErrInvalidIDFormat),
138-
errors.Contains(err, apiutil.ErrInvalidQueryParams),
139-
errors.Contains(err, apiutil.ErrMissingRelation),
140-
errors.Contains(err, apiutil.ErrValidation),
141-
errors.Contains(err, apiutil.ErrMissingIdentity),
142-
errors.Contains(err, apiutil.ErrMissingPass),
143-
errors.Contains(err, apiutil.ErrMissingConfPass),
144-
errors.Contains(err, apiutil.ErrPasswordFormat),
145-
errors.Contains(err, svcerr.ErrInvalidRole),
146-
errors.Contains(err, svcerr.ErrInvalidPolicy),
147-
errors.Contains(err, apiutil.ErrInvitationState),
148-
errors.Contains(err, apiutil.ErrInvalidAPIKey),
149-
errors.Contains(err, svcerr.ErrViewEntity),
150-
errors.Contains(err, apiutil.ErrBootstrapState),
151-
errors.Contains(err, apiutil.ErrMissingCertData),
152-
errors.Contains(err, apiutil.ErrInvalidContact),
153-
errors.Contains(err, apiutil.ErrInvalidTopic),
154-
errors.Contains(err, bootstrap.ErrAddBootstrap),
155-
errors.Contains(err, apiutil.ErrInvalidCertData),
156-
errors.Contains(err, apiutil.ErrEmptyMessage):
116+
case *svcerr.MalformedEntityError,
117+
*apiutil.MalformedPolicyError,
118+
*apiutil.MissingSecretError,
119+
*errors.MalformedEntityError,
120+
*apiutil.MissingIDError,
121+
*apiutil.MissingNameError,
122+
*apiutil.MissingEmailError,
123+
*apiutil.MissingHostError,
124+
*apiutil.InvalidResetPassError,
125+
*apiutil.EmptyListError,
126+
*apiutil.MissingMemberKindError,
127+
*apiutil.MissingMemberTypeError,
128+
*apiutil.LimitSizeError,
129+
*apiutil.BearerKeyError,
130+
*svcerr.InvalidStatusError,
131+
*apiutil.NameSizeError,
132+
*apiutil.InvalidIDFormatError,
133+
*apiutil.InvalidQueryParamsError,
134+
*apiutil.MissingRelationError,
135+
*apiutil.ValidationError,
136+
*apiutil.MissingIdentityError,
137+
*apiutil.MissingPassError,
138+
*apiutil.MissingConfPassError,
139+
*apiutil.PasswordFormatError,
140+
*svcerr.InvalidRoleError,
141+
*svcerr.InvalidPolicyError,
142+
*apiutil.InvitationStateError,
143+
*apiutil.InvalidAPIKeyError,
144+
*svcerr.ViewEntityError,
145+
*apiutil.BootstrapStateError,
146+
*apiutil.MissingCertDataError,
147+
*apiutil.InvalidContactError,
148+
*apiutil.InvalidTopicError,
149+
*bootstrap.AddBootstrapError,
150+
*apiutil.InvalidCertDataError,
151+
*apiutil.EmptyMessageError:
157152
err = unwrap(err)
158153
w.WriteHeader(http.StatusBadRequest)
159154

160-
case errors.Contains(err, svcerr.ErrCreateEntity),
161-
errors.Contains(err, svcerr.ErrUpdateEntity),
162-
errors.Contains(err, svcerr.ErrRemoveEntity),
163-
errors.Contains(err, svcerr.ErrEnableClient):
155+
case *svcerr.CreateEntityError,
156+
*svcerr.UpdateEntityError,
157+
*svcerr.RemoveEntityError,
158+
*svcerr.EnableClientError:
164159
err = unwrap(err)
165160
w.WriteHeader(http.StatusUnprocessableEntity)
166161

167-
case errors.Contains(err, svcerr.ErrNotFound),
168-
errors.Contains(err, bootstrap.ErrBootstrap):
162+
case *svcerr.NotFoundError,
163+
*bootstrap.BootstrapError:
169164
err = unwrap(err)
170165
w.WriteHeader(http.StatusNotFound)
171166

172-
case errors.Contains(err, errors.ErrStatusAlreadyAssigned),
173-
errors.Contains(err, svcerr.ErrConflict):
167+
case *errors.StatusAlreadyAssignedError,
168+
*svcerr.ConflictError:
174169
err = unwrap(err)
175170
w.WriteHeader(http.StatusConflict)
176171

177-
case errors.Contains(err, apiutil.ErrUnsupportedContentType):
172+
case *apiutil.UnsupportedContentTypeError:
178173
err = unwrap(err)
179174
w.WriteHeader(http.StatusUnsupportedMediaType)
180175

0 commit comments

Comments
 (0)