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..dccbc465f9 100644 --- a/services/clientlog/pkg/service/service.go +++ b/services/clientlog/pkg/service/service.go @@ -8,6 +8,8 @@ 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" "github.com/cs3org/reva/v2/pkg/events" @@ -97,23 +99,50 @@ 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" + + 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 } - evType = "postprocessing-finished" - data = FileReadyEvent{ - ParentItemID: storagespace.FormatResourceID(*info.GetParentId()), - ItemID: storagespace.FormatResourceID(*info.GetId()), - } + for _, item := range resp.GetRecycleItems() { + if item.GetKey() == e.ID.GetOpaqueId() { - users, err = utils.GetSpaceMembers(ctx, info.GetSpace().GetId().GetOpaqueId(), gwc, utils.ViewerRole) + 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) + 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 = "item-renamed" + users, data, err = processFileEvent(ctx, e.Ref, gwc) } 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 } @@ -136,3 +165,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 +}