Skip to content

Commit

Permalink
improve logging and error handling
Browse files Browse the repository at this point in the history
Signed-off-by: jkoberg <jkoberg@owncloud.com>
  • Loading branch information
kobergj committed Jun 28, 2023
1 parent 8d9f01d commit ac8b399
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 26 deletions.
11 changes: 8 additions & 3 deletions services/userlog/pkg/service/http.go
Expand Up @@ -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")
Expand All @@ -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
}
Expand Down
64 changes: 41 additions & 23 deletions services/userlog/pkg/service/service.go
Expand Up @@ -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
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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
}

0 comments on commit ac8b399

Please sign in to comment.