From 9786be50ae3c824eeda4f14499e5e5aacd819fd5 Mon Sep 17 00:00:00 2001 From: jkoberg Date: Wed, 6 Mar 2024 11:01:38 +0100 Subject: [PATCH 1/2] feat: add more sse events Signed-off-by: jkoberg --- changelog/unreleased/more-sse-events.md | 5 +++ services/clientlog/pkg/command/server.go | 4 +++ services/clientlog/pkg/service/events.go | 4 +-- services/clientlog/pkg/service/service.go | 43 +++++++++++++++++------ 4 files changed, 43 insertions(+), 13 deletions(-) create mode 100644 changelog/unreleased/more-sse-events.md diff --git a/changelog/unreleased/more-sse-events.md b/changelog/unreleased/more-sse-events.md new file mode 100644 index 0000000000..8be1faee9e --- /dev/null +++ b/changelog/unreleased/more-sse-events.md @@ -0,0 +1,5 @@ +Enhancement: Send more sse events + +We added sse events for `ItemTrashed`, `ItemRestored`,`ContainerCreated` and `FileRenamed` + +https://github.com/owncloud/ocis/pull/8587 diff --git a/services/clientlog/pkg/command/server.go b/services/clientlog/pkg/command/server.go index 4dcc14da71..6a76158cbe 100644 --- a/services/clientlog/pkg/command/server.go +++ b/services/clientlog/pkg/command/server.go @@ -26,6 +26,10 @@ import ( // all events we care about var _registeredEvents = []events.Unmarshaller{ events.UploadReady{}, + events.ItemTrashed{}, + events.ItemRestored{}, + events.ItemMoved{}, + events.ContainerCreated{}, } // Server is the entrypoint for the server command. diff --git a/services/clientlog/pkg/service/events.go b/services/clientlog/pkg/service/events.go index 7435ea877d..16d4a278b9 100644 --- a/services/clientlog/pkg/service/events.go +++ b/services/clientlog/pkg/service/events.go @@ -1,7 +1,7 @@ package service -// FileReadyEvent is emitted when the postprocessing of a file is finished -type FileReadyEvent struct { +// FileEvent is emitted when a file is uploaded/renamed/deleted/... +type FileEvent struct { ParentItemID string `json:"parentitemid"` ItemID string `json:"itemid"` } diff --git a/services/clientlog/pkg/service/service.go b/services/clientlog/pkg/service/service.go index f905c8984c..bd2a5a1c87 100644 --- a/services/clientlog/pkg/service/service.go +++ b/services/clientlog/pkg/service/service.go @@ -8,6 +8,7 @@ import ( "reflect" gateway "github.com/cs3org/go-cs3apis/cs3/gateway/v1beta1" + provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" "go.opentelemetry.io/otel/trace" "github.com/cs3org/reva/v2/pkg/events" @@ -97,19 +98,24 @@ func (cl *ClientlogService) processEvent(event events.Event) { default: err = errors.New("unhandled event") case events.UploadReady: - info, err := utils.GetResource(ctx, e.FileRef, gwc) - if err != nil { - cl.log.Error().Err(err).Interface("event", event).Msg("error getting resource") + evType = "postprocessing-finished" + users, data, err = processFileEvent(ctx, e.FileRef, gwc) + case events.ItemTrashed: + evType = "item-trashed" + users, data, err = processFileEvent(ctx, e.Ref, gwc) + case events.ItemRestored: + evType = "item-restored" + users, data, err = processFileEvent(ctx, e.Ref, gwc) + case events.ContainerCreated: + evType = "folder-created" + users, data, err = processFileEvent(ctx, e.Ref, gwc) + case events.ItemMoved: + // we are only interested in the rename case + if !utils.ResourceIDEqual(e.OldReference.GetResourceId(), e.Ref.GetResourceId()) || e.Ref.GetPath() == e.OldReference.GetPath() { return } - - evType = "postprocessing-finished" - data = FileReadyEvent{ - ParentItemID: storagespace.FormatResourceID(*info.GetParentId()), - ItemID: storagespace.FormatResourceID(*info.GetId()), - } - - users, err = utils.GetSpaceMembers(ctx, info.GetSpace().GetId().GetOpaqueId(), gwc, utils.ViewerRole) + evType = "item-renamed" + users, data, err = processFileEvent(ctx, e.Ref, gwc) } if err != nil { @@ -136,3 +142,18 @@ func (cl *ClientlogService) sendSSE(userIDs []string, evType string, data interf Message: b, }) } + +func processFileEvent(ctx context.Context, ref *provider.Reference, gwc gateway.GatewayAPIClient) ([]string, FileEvent, error) { + info, err := utils.GetResource(ctx, ref, gwc) + if err != nil { + return nil, FileEvent{}, err + } + + data := FileEvent{ + ParentItemID: storagespace.FormatResourceID(*info.GetParentId()), + ItemID: storagespace.FormatResourceID(*info.GetId()), + } + + users, err := utils.GetSpaceMembers(ctx, info.GetSpace().GetId().GetOpaqueId(), gwc, utils.ViewerRole) + return users, data, err +} From 78755e330f20fb2ba0398956c36bd445931c4af7 Mon Sep 17 00:00:00 2001 From: jkoberg Date: Wed, 6 Mar 2024 12:13:12 +0100 Subject: [PATCH 2/2] fix item-trashed sse Signed-off-by: jkoberg --- services/clientlog/pkg/service/service.go | 27 +++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/services/clientlog/pkg/service/service.go b/services/clientlog/pkg/service/service.go index bd2a5a1c87..dccbc465f9 100644 --- a/services/clientlog/pkg/service/service.go +++ b/services/clientlog/pkg/service/service.go @@ -8,6 +8,7 @@ import ( "reflect" gateway "github.com/cs3org/go-cs3apis/cs3/gateway/v1beta1" + rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" "go.opentelemetry.io/otel/trace" @@ -102,7 +103,29 @@ func (cl *ClientlogService) processEvent(event events.Event) { users, data, err = processFileEvent(ctx, e.FileRef, gwc) case events.ItemTrashed: evType = "item-trashed" - users, data, err = processFileEvent(ctx, e.Ref, gwc) + + var resp *provider.ListRecycleResponse + resp, err = gwc.ListRecycle(ctx, &provider.ListRecycleRequest{ + Ref: e.Ref, + }) + if err != nil || resp.GetStatus().GetCode() != rpc.Code_CODE_OK { + cl.log.Error().Err(err).Interface("event", event).Str("status code", resp.GetStatus().GetMessage()).Msg("error listing recycle") + return + } + + for _, item := range resp.GetRecycleItems() { + if item.GetKey() == e.ID.GetOpaqueId() { + + data = FileEvent{ + ItemID: storagespace.FormatResourceID(*e.ID), + // TODO: check with web if parentID is needed + // ParentItemID: storagespace.FormatResourceID(*item.GetRef().GetResourceId()), + } + + users, err = utils.GetSpaceMembers(ctx, e.ID.GetSpaceId(), gwc, utils.ViewerRole) + break + } + } case events.ItemRestored: evType = "item-restored" users, data, err = processFileEvent(ctx, e.Ref, gwc) @@ -119,7 +142,7 @@ func (cl *ClientlogService) processEvent(event events.Event) { } if err != nil { - cl.log.Info().Err(err).Interface("event", event).Msg("error gathering members for event") + cl.log.Error().Err(err).Interface("event", event).Msg("error gathering members for event") return }