From d9d6da856f5d7d7e4070eab2a723425fdf3906fa Mon Sep 17 00:00:00 2001 From: jkoberg Date: Wed, 28 Jun 2023 10:58:49 +0200 Subject: [PATCH] improve logging and error handling Signed-off-by: jkoberg --- services/userlog/pkg/service/http.go | 11 +++-- services/userlog/pkg/service/service.go | 64 ++++++++++++++++--------- 2 files changed, 49 insertions(+), 26 deletions(-) diff --git a/services/userlog/pkg/service/http.go b/services/userlog/pkg/service/http.go index f674fa3460..b1a9e82588 100644 --- a/services/userlog/pkg/service/http.go +++ b/services/userlog/pkg/service/http.go @@ -32,19 +32,22 @@ func (ul *UserlogService) HandleGetEvents(w http.ResponseWriter, r *http.Request return } - conv := NewConverter(r.Header.Get(HeaderAcceptLanguage), ul.gatewaySelector, ul.cfg.MachineAuthAPIKey, ul.cfg.Service.Name, ul.cfg.TranslationPath) + conv := ul.getConverter(r.Header.Get(HeaderAcceptLanguage)) resp := GetEventResponseOC10{} for _, e := range evs { etype, ok := ul.registeredEvents[e.Type] if !ok { - // this should not happen + ul.log.Error().Str("eventid", e.Id).Str("eventtype", e.Type).Msg("event not registered") + continue } einterface, err := etype.Unmarshal(e.Event) if err != nil { - // this shouldn't happen either + ul.log.Error().Str("eventid", e.Id).Str("eventtype", e.Type).Msg("failed to umarshal event") + continue } + noti, err := conv.ConvertEvent(e.Id, einterface) if err != nil { ul.log.Error().Err(err).Str("eventid", e.Id).Str("eventtype", e.Type).Msg("failed to convert event") @@ -63,12 +66,14 @@ func (ul *UserlogService) HandleGetEvents(w http.ResponseWriter, r *http.Request func (ul *UserlogService) HandleSSE(w http.ResponseWriter, r *http.Request) { u, ok := ctx.ContextGetUser(r.Context()) if !ok { + ul.log.Error().Msg("sse: no user in context") w.WriteHeader(http.StatusInternalServerError) return } uid := u.GetId().GetOpaqueId() if uid == "" { + ul.log.Error().Msg("sse: user in context is broken") w.WriteHeader(http.StatusInternalServerError) return } diff --git a/services/userlog/pkg/service/service.go b/services/userlog/pkg/service/service.go index d2aec63428..717e8c77c1 100644 --- a/services/userlog/pkg/service/service.go +++ b/services/userlog/pkg/service/service.go @@ -30,8 +30,6 @@ import ( "google.golang.org/grpc/metadata" ) -var _defaultLocale = "en" - // UserlogService is the service responsible for user activities type UserlogService struct { log log.Logger @@ -232,16 +230,29 @@ func (ul *UserlogService) DeleteEvents(userid string, evids []string) error { } func (ul *UserlogService) addEventToUser(userid string, event events.Event) error { - loc := getUserLang(context.Background(), userid, ul.valueClient) - ev, _ := NewConverter(loc, ul.gatewaySelector, ul.cfg.MachineAuthAPIKey, ul.cfg.Service.Name, ul.cfg.TranslationPath).ConvertEvent(event.ID, event.Event) - b, _ := json.Marshal(ev) - - ul.sse.Publish(userid, &sse.Event{Data: b}) + if err := ul.sendSSE(userid, event); err != nil { + ul.log.Error().Err(err).Str("userid", userid).Str("eventid", event.ID).Msg("cannot create sse event") + } return ul.alterUserEventList(userid, func(ids []string) []string { return append(ids, event.ID) }) } +func (ul *UserlogService) sendSSE(userid string, event events.Event) error { + ev, err := ul.getConverter(ul.getUserLocale(userid)).ConvertEvent(event.ID, event.Event) + if err != nil { + return err + } + + b, err := json.Marshal(ev) + if err != nil { + return err + } + + ul.sse.Publish(userid, &sse.Event{Data: b}) + return nil +} + func (ul *UserlogService) removeExpiredEvents(userid string, all []string, received []*ehmsg.Event) error { exists := make(map[string]struct{}, len(received)) for _, e := range received { @@ -412,6 +423,29 @@ func (ul *UserlogService) impersonate(uid *user.UserId) context.Context { return ctx } +func (ul *UserlogService) getUserLocale(userid string) string { + resp, err := ul.valueClient.GetValueByUniqueIdentifiers( + micrometadata.Set(context.Background(), middleware.AccountID, userid), + &settingssvc.GetValueByUniqueIdentifiersRequest{ + AccountUuid: userid, + SettingId: defaults.SettingUUIDProfileLanguage, + }, + ) + if err != nil { + ul.log.Error().Err(err).Str("userid", userid).Msg("cannot get users locale") + return "" + } + val := resp.GetValue().GetValue().GetListValue().GetValues() + if len(val) == 0 { + return "" + } + return val[0].GetStringValue() +} + +func (ul *UserlogService) getConverter(locale string) *Converter { + return NewConverter(locale, ul.gatewaySelector, ul.cfg.MachineAuthAPIKey, ul.cfg.Service.Name, ul.cfg.TranslationPath) +} + func authenticate(usr *user.User, gatewaySelector pool.Selectable[gateway.GatewayAPIClient], machineAuthAPIKey string) (context.Context, error) { gatewayClient, err := gatewaySelector.Next() if err != nil { @@ -550,19 +584,3 @@ func editor(perms *storageprovider.ResourcePermissions) bool { func manager(perms *storageprovider.ResourcePermissions) bool { return perms.DenyGrant } - -func getUserLang(ctx context.Context, userid string, vs settingssvc.ValueService) string { - granteeCtx := micrometadata.Set(ctx, middleware.AccountID, userid) - if resp, err := vs.GetValueByUniqueIdentifiers(granteeCtx, - &settingssvc.GetValueByUniqueIdentifiersRequest{ - AccountUuid: userid, - SettingId: defaults.SettingUUIDProfileLanguage, - }, - ); err == nil { - val := resp.GetValue().GetValue().GetListValue().GetValues() - if len(val) > 0 && val[0] != nil { - return val[0].GetStringValue() - } - } - return _defaultLocale -}