use micro errors on handlers

This commit is contained in:
A.Unger
2020-08-20 11:25:39 +02:00
parent e510229bc1
commit c50399fb1d
3 changed files with 48 additions and 52 deletions
+27 -26
View File
@@ -4,6 +4,7 @@ import (
"context"
"github.com/golang/protobuf/ptypes/empty"
merrors "github.com/micro/go-micro/v2/errors"
"github.com/owncloud/ocis-pkg/v2/log"
"github.com/owncloud/ocis-pkg/v2/middleware"
"github.com/owncloud/ocis-settings/pkg/config"
@@ -51,11 +52,11 @@ func NewService(cfg *config.Config, logger log.Logger) Service {
func (g Service) SaveBundle(c context.Context, req *proto.SaveBundleRequest, res *proto.SaveBundleResponse) error {
cleanUpResource(c, req.Bundle.Resource)
if validationError := validateSaveBundle(req); validationError != nil {
return validationError
return merrors.FromError(validationError)
}
r, err := g.manager.WriteBundle(req.Bundle)
if err != nil {
return err
return merrors.FromError(err)
}
res.Bundle = r
return nil
@@ -64,11 +65,11 @@ func (g Service) SaveBundle(c context.Context, req *proto.SaveBundleRequest, res
// GetBundle implements the BundleServiceHandler interface
func (g Service) GetBundle(c context.Context, req *proto.GetBundleRequest, res *proto.GetBundleResponse) error {
if validationError := validateGetBundle(req); validationError != nil {
return validationError
return merrors.FromError(validationError)
}
r, err := g.manager.ReadBundle(req.BundleId)
if err != nil {
return err
return merrors.FromError(err)
}
res.Bundle = r
return nil
@@ -79,11 +80,11 @@ func (g Service) ListBundles(c context.Context, req *proto.ListBundlesRequest, r
// fetch all bundles
req.AccountUuid = getValidatedAccountUUID(c, req.AccountUuid)
if validationError := validateListBundles(req); validationError != nil {
return validationError
return merrors.FromError(validationError)
}
bundles, err := g.manager.ListBundles(proto.Bundle_TYPE_DEFAULT)
if err != nil {
return err
return merrors.FromError(err)
}
res.Bundles = bundles
return nil
@@ -93,11 +94,11 @@ func (g Service) ListBundles(c context.Context, req *proto.ListBundlesRequest, r
func (g Service) AddSettingToBundle(c context.Context, req *proto.AddSettingToBundleRequest, res *proto.AddSettingToBundleResponse) error {
cleanUpResource(c, req.Setting.Resource)
if validationError := validateAddSettingToBundle(req); validationError != nil {
return validationError
return merrors.FromError(validationError)
}
r, err := g.manager.AddSettingToBundle(req.BundleId, req.Setting)
if err != nil {
return err
return merrors.FromError(err)
}
res.Setting = r
return nil
@@ -106,7 +107,7 @@ func (g Service) AddSettingToBundle(c context.Context, req *proto.AddSettingToBu
// RemoveSettingFromBundle implements the BundleServiceHandler interface
func (g Service) RemoveSettingFromBundle(c context.Context, req *proto.RemoveSettingFromBundleRequest, _ *empty.Empty) error {
if validationError := validateRemoveSettingFromBundle(req); validationError != nil {
return validationError
return merrors.FromError(validationError)
}
return g.manager.RemoveSettingFromBundle(req.BundleId, req.SettingId)
}
@@ -117,15 +118,15 @@ func (g Service) SaveValue(c context.Context, req *proto.SaveValueRequest, res *
cleanUpResource(c, req.Value.Resource)
// TODO: we need to check, if the authenticated user has permission to write the value for the specified resource (e.g. global, file with id xy, ...)
if validationError := validateSaveValue(req); validationError != nil {
return validationError
return merrors.FromError(validationError)
}
r, err := g.manager.WriteValue(req.Value)
if err != nil {
return err
return merrors.FromError(err)
}
valueWithIdentifier, err := g.getValueWithIdentifier(r)
if err != nil {
return err
return merrors.FromError(err)
}
res.Value = valueWithIdentifier
return nil
@@ -134,15 +135,15 @@ func (g Service) SaveValue(c context.Context, req *proto.SaveValueRequest, res *
// GetValue implements the ValueServiceHandler interface
func (g Service) GetValue(c context.Context, req *proto.GetValueRequest, res *proto.GetValueResponse) error {
if validationError := validateGetValue(req); validationError != nil {
return validationError
return merrors.FromError(validationError)
}
r, err := g.manager.ReadValue(req.Id)
if err != nil {
return err
return merrors.FromError(err)
}
valueWithIdentifier, err := g.getValueWithIdentifier(r)
if err != nil {
return err
return merrors.FromError(err)
}
res.Value = valueWithIdentifier
return nil
@@ -152,13 +153,13 @@ func (g Service) GetValue(c context.Context, req *proto.GetValueRequest, res *pr
func (g Service) GetValueByUniqueIdentifiers(ctx context.Context, in *proto.GetValueByUniqueIdentifiersRequest, res *proto.GetValueResponse) error {
v, err := g.manager.ReadValueByUniqueIdentifiers(in.AccountUuid, in.SettingId)
if err != nil {
return err
return merrors.FromError(err)
}
if v.BundleId != "" {
valueWithIdentifier, err := g.getValueWithIdentifier(v)
if err != nil {
return err
return merrors.FromError(err)
}
res.Value = valueWithIdentifier
@@ -170,11 +171,11 @@ func (g Service) GetValueByUniqueIdentifiers(ctx context.Context, in *proto.GetV
func (g Service) ListValues(c context.Context, req *proto.ListValuesRequest, res *proto.ListValuesResponse) error {
req.AccountUuid = getValidatedAccountUUID(c, req.AccountUuid)
if validationError := validateListValues(req); validationError != nil {
return validationError
return merrors.FromError(validationError)
}
r, err := g.manager.ListValues(req.BundleId, req.AccountUuid)
if err != nil {
return err
return merrors.FromError(err)
}
var result []*proto.ValueWithIdentifier
for _, value := range r {
@@ -210,11 +211,11 @@ func (g Service) getValueWithIdentifier(value *proto.Value) (*proto.ValueWithIde
func (g Service) ListRoles(c context.Context, req *proto.ListBundlesRequest, res *proto.ListBundlesResponse) error {
req.AccountUuid = getValidatedAccountUUID(c, req.AccountUuid)
if validationError := validateListRoles(req); validationError != nil {
return validationError
return merrors.FromError(validationError)
}
r, err := g.manager.ListBundles(proto.Bundle_TYPE_ROLE)
if err != nil {
return err
return merrors.FromError(err)
}
res.Bundles = r
return nil
@@ -224,11 +225,11 @@ func (g Service) ListRoles(c context.Context, req *proto.ListBundlesRequest, res
func (g Service) ListRoleAssignments(c context.Context, req *proto.ListRoleAssignmentsRequest, res *proto.ListRoleAssignmentsResponse) error {
req.AccountUuid = getValidatedAccountUUID(c, req.AccountUuid)
if validationError := validateListRoleAssignments(req); validationError != nil {
return validationError
return merrors.FromError(validationError)
}
r, err := g.manager.ListRoleAssignments(req.AccountUuid)
if err != nil {
return err
return merrors.FromError(err)
}
res.Assignments = r
return nil
@@ -238,11 +239,11 @@ func (g Service) ListRoleAssignments(c context.Context, req *proto.ListRoleAssig
func (g Service) AssignRoleToUser(c context.Context, req *proto.AssignRoleToUserRequest, res *proto.AssignRoleToUserResponse) error {
req.AccountUuid = getValidatedAccountUUID(c, req.AccountUuid)
if validationError := validateAssignRoleToUser(req); validationError != nil {
return validationError
return merrors.FromError(validationError)
}
r, err := g.manager.WriteRoleAssignment(req.AccountUuid, req.RoleId)
if err != nil {
return err
return merrors.FromError(err)
}
res.Assignment = r
return nil
@@ -251,7 +252,7 @@ func (g Service) AssignRoleToUser(c context.Context, req *proto.AssignRoleToUser
// RemoveRoleFromUser implements the RoleServiceHandler interface
func (g Service) RemoveRoleFromUser(c context.Context, req *proto.RemoveRoleFromUserRequest, _ *empty.Empty) error {
if validationError := validateRemoveRoleFromUser(req); validationError != nil {
return validationError
return merrors.FromError(validationError)
}
return g.manager.RemoveRoleAssignment(req.Id)
}
+18 -18
View File
@@ -33,14 +33,14 @@ func validateSaveBundle(req *proto.SaveBundleRequest) error {
validation.Field(&req.Bundle.DisplayName, validation.Required),
validation.Field(&req.Bundle.Settings, validation.Required),
); err != nil {
return merrors.FromError(err)
return err
}
if err := validateResource(req.Bundle.Resource); err != nil {
return merrors.FromError(err)
return err
}
for i := range req.Bundle.Settings {
if err := validateSetting(req.Bundle.Settings[i]); err != nil {
return merrors.FromError(err)
return err
}
}
return nil
@@ -48,21 +48,21 @@ func validateSaveBundle(req *proto.SaveBundleRequest) error {
func validateGetBundle(req *proto.GetBundleRequest) error {
if err := validation.Validate(&req.BundleId, requireAccountID...); err != nil {
return merrors.FromError(err)
return err
}
return nil
}
func validateListBundles(req *proto.ListBundlesRequest) error {
if err := validation.Validate(&req.AccountUuid, requireAccountID...); err != nil {
return merrors.FromError(err)
return err
}
return nil
}
func validateAddSettingToBundle(req *proto.AddSettingToBundleRequest) error {
if err := validation.ValidateStruct(req, validation.Field(&req.BundleId, is.UUID)); err != nil {
return merrors.FromError(err)
return err
}
return validateSetting(req.Setting)
}
@@ -73,7 +73,7 @@ func validateRemoveSettingFromBundle(req *proto.RemoveSettingFromBundleRequest)
validation.Field(&req.BundleId, is.UUID),
validation.Field(&req.SettingId, is.UUID),
); err != nil {
return merrors.FromError(err)
return err
}
return nil
}
@@ -86,11 +86,11 @@ func validateSaveValue(req *proto.SaveValueRequest) error {
validation.Field(&req.Value.SettingId, is.UUID),
validation.Field(&req.Value.AccountUuid, requireAccountID...),
); err != nil {
return merrors.FromError(err)
return err
}
if err := validateResource(req.Value.Resource); err != nil {
return merrors.FromError(err)
return err
}
// TODO: validate values against the respective setting. need to check if constraints of the setting are fulfilled.
@@ -99,7 +99,7 @@ func validateSaveValue(req *proto.SaveValueRequest) error {
func validateGetValue(req *proto.GetValueRequest) error {
if err := validation.Validate(req.Id, is.UUID); err != nil {
return merrors.FromError(err)
return err
}
return nil
}
@@ -110,21 +110,21 @@ func validateListValues(req *proto.ListValuesRequest) error {
validation.Field(&req.BundleId, validation.When(req.BundleId != "", is.UUID)),
validation.Field(&req.AccountUuid, validation.When(req.AccountUuid != "", validation.Match(regexForAccountUUID))),
); err != nil {
return merrors.FromError(err)
return err
}
return nil
}
func validateListRoles(req *proto.ListBundlesRequest) error {
if err := validation.Validate(&req.AccountUuid, requireAccountID...); err != nil {
return merrors.FromError(err)
return err
}
return nil
}
func validateListRoleAssignments(req *proto.ListRoleAssignmentsRequest) error {
if err := validation.Validate(req.AccountUuid, requireAccountID...); err != nil {
return merrors.FromError(err)
return err
}
return nil
}
@@ -135,7 +135,7 @@ func validateAssignRoleToUser(req *proto.AssignRoleToUserRequest) error {
validation.Field(&req.AccountUuid, requireAccountID...),
validation.Field(&req.RoleId, is.UUID),
); err != nil {
return merrors.FromError(err)
return err
}
return nil
}
@@ -145,7 +145,7 @@ func validateRemoveRoleFromUser(req *proto.RemoveRoleFromUserRequest) error {
req,
validation.Field(&req.Id, is.UUID),
); err != nil {
return merrors.FromError(err)
return err
}
return nil
}
@@ -156,7 +156,7 @@ func validateResource(resource *proto.Resource) error {
return merrors.FromError(err)
}
if err := validation.Validate(&resource, validation.NotIn(proto.Resource_TYPE_UNKNOWN)); err != nil {
return merrors.FromError(err)
return err
}
return nil
}
@@ -169,10 +169,10 @@ func validateSetting(setting *proto.Setting) error {
validation.Field(&setting.Id, validation.When(setting.Id != "", is.UUID)),
validation.Field(&setting.Name, requireAlphanumeric...),
); err != nil {
return merrors.FromError(err)
return err
}
if err := validateResource(setting.Resource); err != nil {
return merrors.FromError(err)
return err
}
return nil
}
+3 -8
View File
@@ -5,21 +5,18 @@ import (
"github.com/golang/protobuf/jsonpb"
"github.com/golang/protobuf/proto"
merrors "github.com/micro/go-micro/v2/errors"
)
// Unmarshal file into record
func (s Store) parseRecordFromFile(record proto.Message, filePath string) error {
file, err := os.Open(filePath)
if err != nil {
s.Logger.Err(err).Msgf("error reading file %v: file not found", filePath)
return merrors.FromError(err)
return err
}
defer file.Close()
decoder := jsonpb.Unmarshaler{}
if err = decoder.Unmarshal(file, record); err != nil {
s.Logger.Err(err).Msgf("error reading file %v: unmarshalling failed", filePath)
return err
}
return nil
@@ -29,15 +26,13 @@ func (s Store) parseRecordFromFile(record proto.Message, filePath string) error
func (s Store) writeRecordToFile(record proto.Message, filePath string) error {
file, err := os.Create(filePath)
if err != nil {
s.Logger.Err(err).Msgf("error writing file %v: opening failed", filePath)
return merrors.FromError(err)
return err
}
defer file.Close()
encoder := jsonpb.Marshaler{}
if err = encoder.Marshal(file, record); err != nil {
s.Logger.Err(err).Msgf("error writing file %v: marshalling failed", filePath)
return merrors.FromError(err)
return err
}
return nil