From b7732df5fe7a149cd09f1942b1015ff5b35cf56f Mon Sep 17 00:00:00 2001 From: jkoberg Date: Tue, 15 Mar 2022 15:37:07 +0100 Subject: [PATCH 1/4] initial events Signed-off-by: jkoberg --- pkg/events/files.go | 36 +++++++++++++++++++++++++++++ pkg/events/{types.go => sharing.go} | 0 2 files changed, 36 insertions(+) create mode 100644 pkg/events/files.go rename pkg/events/{types.go => sharing.go} (100%) diff --git a/pkg/events/files.go b/pkg/events/files.go new file mode 100644 index 0000000000..269df6505f --- /dev/null +++ b/pkg/events/files.go @@ -0,0 +1,36 @@ +package events + +// FileUploaded is emitted when a file is uploaded +type FileUploaded struct { + FileID string +} + +//FileDownloaded is emitted when a file is downloaded +type FileDownloaded struct { + FileID string +} + +// ItemTrashed is emitted when a file or folder is trashed +type ItemTrashed struct { + FileID string +} + +// ItemMoved is emitted when a file or folder is moved +type ItemMoved struct { + FileID string +} + +// ItemPurged is emitted when a file or folder is removed from trashbin +type ItemPurged struct { + FileID string +} + +// ItemRestored is emitted when a file or folder is restored from trashbin +type ItemRestored struct { + FileID string +} + +// FileVersionRestored is emitted when a file version is restored +type FileVersionRestored struct { + FileID string +} diff --git a/pkg/events/types.go b/pkg/events/sharing.go similarity index 100% rename from pkg/events/types.go rename to pkg/events/sharing.go From 4be3f269955feda4438b5c9939ce6e245c2906f1 Mon Sep 17 00:00:00 2001 From: jkoberg Date: Tue, 15 Mar 2022 15:52:34 +0100 Subject: [PATCH 2/4] converter functions Signed-off-by: jkoberg --- .../eventsmiddleware/conversion.go | 36 +++++++++++++++++++ .../interceptors/eventsmiddleware/events.go | 29 +++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/internal/grpc/interceptors/eventsmiddleware/conversion.go b/internal/grpc/interceptors/eventsmiddleware/conversion.go index 4d637945ca..e298283c12 100644 --- a/internal/grpc/interceptors/eventsmiddleware/conversion.go +++ b/internal/grpc/interceptors/eventsmiddleware/conversion.go @@ -21,6 +21,7 @@ package eventsmiddleware import ( collaboration "github.com/cs3org/go-cs3apis/cs3/sharing/collaboration/v1beta1" link "github.com/cs3org/go-cs3apis/cs3/sharing/link/v1beta1" + provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" "github.com/cs3org/reva/v2/pkg/events" ) @@ -141,3 +142,38 @@ func LinkRemoved(r *link.RemovePublicShareResponse, req *link.RemovePublicShareR ShareToken: req.Ref.GetToken(), } } + +// FileUploaded converts the response to an event +func FileUploaded(r *provider.InitiateFileUploadResponse, req *provider.InitiateFileUploadRequest) events.FileUploaded { + return events.FileUploaded{} +} + +// FileDownloaded converts the response to an event +func FileDownloaded(r *provider.InitiateFileDownloadResponse, req *provider.InitiateFileDownloadRequest) events.FileDownloaded { + return events.FileDownloaded{} +} + +// ItemTrashed converts the response to an event +func ItemTrashed(r *provider.DeleteResponse, req *provider.DeleteRequest) events.ItemTrashed { + return events.ItemTrashed{} +} + +// ItemMoved converts the response to an event +func ItemMoved(r *provider.MoveResponse, req *provider.MoveRequest) events.ItemMoved { + return events.ItemMoved{} +} + +// ItemPurged converts the response to an event +func ItemPurged(r *provider.PurgeRecycleResponse, req *provider.PurgeRecycleRequest) events.ItemPurged { + return events.ItemPurged{} +} + +// ItemRestored converts the response to an event +func ItemRestored(r *provider.RestoreRecycleItemResponse, req *provider.RestoreRecycleItemRequest) events.ItemRestored { + return events.ItemRestored{} +} + +// FileVersionRestored converts the response to an event +func FileVersionRestored(r *provider.RestoreFileVersionResponse, req *provider.RestoreFileVersionRequest) events.FileVersionRestored { + return events.FileVersionRestored{} +} diff --git a/internal/grpc/interceptors/eventsmiddleware/events.go b/internal/grpc/interceptors/eventsmiddleware/events.go index 5ba24ef4cf..63259ac474 100644 --- a/internal/grpc/interceptors/eventsmiddleware/events.go +++ b/internal/grpc/interceptors/eventsmiddleware/events.go @@ -30,6 +30,7 @@ import ( v1beta12 "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" collaboration "github.com/cs3org/go-cs3apis/cs3/sharing/collaboration/v1beta1" link "github.com/cs3org/go-cs3apis/cs3/sharing/link/v1beta1" + provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" "github.com/cs3org/reva/v2/pkg/events" "github.com/cs3org/reva/v2/pkg/events/server" "github.com/cs3org/reva/v2/pkg/rgrpc" @@ -94,6 +95,34 @@ func NewUnary(m map[string]interface{}) (grpc.UnaryServerInterceptor, int, error } else { ev = LinkAccessFailed(v, req.(*link.GetPublicShareByTokenRequest)) } + case *provider.InitiateFileUploadResponse: + if isSuccess(v) { + ev = FileUploaded(v, req.(*provider.InitiateFileUploadRequest)) + } + case *provider.InitiateFileDownloadResponse: + if isSuccess(v) { + ev = FileDownloaded(v, req.(*provider.InitiateFileDownloadRequest)) + } + case *provider.DeleteResponse: + if isSuccess(v) { + ev = ItemTrashed(v, req.(*provider.DeleteRequest)) + } + case *provider.MoveResponse: + if isSuccess(v) { + ev = ItemMoved(v, req.(*provider.MoveRequest)) + } + case *provider.PurgeRecycleResponse: + if isSuccess(v) { + ev = ItemPurged(v, req.(*provider.PurgeRecycleRequest)) + } + case *provider.RestoreRecycleItemResponse: + if isSuccess(v) { + ev = ItemRestored(v, req.(*provider.RestoreRecycleItemRequest)) + } + case *provider.RestoreFileVersionResponse: + if isSuccess(v) { + ev = FileVersionRestored(v, req.(*provider.RestoreFileVersionRequest)) + } } if ev != nil { From c8c4b77529ad1529a7df728e2b6c5ed0806e9838 Mon Sep 17 00:00:00 2001 From: jkoberg Date: Tue, 15 Mar 2022 15:58:56 +0100 Subject: [PATCH 3/4] add changelog Signed-off-by: jkoberg --- changelog/unreleased/file-events.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 changelog/unreleased/file-events.md diff --git a/changelog/unreleased/file-events.md b/changelog/unreleased/file-events.md new file mode 100644 index 0000000000..670e5ce41a --- /dev/null +++ b/changelog/unreleased/file-events.md @@ -0,0 +1,5 @@ +Enhancement: File Events + +Adds file based events. See `pkg/events/files.go` for full list + +https://github.com/cs3org/reva/pull/2639 From fa86690ada3de0db8befce2ce062bebd7c9605e7 Mon Sep 17 00:00:00 2001 From: jkoberg Date: Wed, 16 Mar 2022 15:04:56 +0100 Subject: [PATCH 4/4] implementation Signed-off-by: jkoberg --- .../eventsmiddleware/conversion.go | 36 +++++-- pkg/events/files.go | 101 ++++++++++++++++-- 2 files changed, 122 insertions(+), 15 deletions(-) diff --git a/internal/grpc/interceptors/eventsmiddleware/conversion.go b/internal/grpc/interceptors/eventsmiddleware/conversion.go index e298283c12..76cc47d045 100644 --- a/internal/grpc/interceptors/eventsmiddleware/conversion.go +++ b/internal/grpc/interceptors/eventsmiddleware/conversion.go @@ -145,35 +145,57 @@ func LinkRemoved(r *link.RemovePublicShareResponse, req *link.RemovePublicShareR // FileUploaded converts the response to an event func FileUploaded(r *provider.InitiateFileUploadResponse, req *provider.InitiateFileUploadRequest) events.FileUploaded { - return events.FileUploaded{} + return events.FileUploaded{ + FileID: req.Ref, + } } // FileDownloaded converts the response to an event func FileDownloaded(r *provider.InitiateFileDownloadResponse, req *provider.InitiateFileDownloadRequest) events.FileDownloaded { - return events.FileDownloaded{} + return events.FileDownloaded{ + FileID: req.Ref, + } } // ItemTrashed converts the response to an event func ItemTrashed(r *provider.DeleteResponse, req *provider.DeleteRequest) events.ItemTrashed { - return events.ItemTrashed{} + return events.ItemTrashed{ + FileID: req.Ref, + } } // ItemMoved converts the response to an event func ItemMoved(r *provider.MoveResponse, req *provider.MoveRequest) events.ItemMoved { - return events.ItemMoved{} + return events.ItemMoved{ + FileID: req.Destination, + OldReference: req.Source, + } } // ItemPurged converts the response to an event func ItemPurged(r *provider.PurgeRecycleResponse, req *provider.PurgeRecycleRequest) events.ItemPurged { - return events.ItemPurged{} + return events.ItemPurged{ + FileID: req.Ref, + } } // ItemRestored converts the response to an event func ItemRestored(r *provider.RestoreRecycleItemResponse, req *provider.RestoreRecycleItemRequest) events.ItemRestored { - return events.ItemRestored{} + ref := req.Ref + if req.RestoreRef != nil { + ref = req.RestoreRef + } + return events.ItemRestored{ + FileID: ref, + OldReference: req.Ref, + Key: req.Key, + } } // FileVersionRestored converts the response to an event func FileVersionRestored(r *provider.RestoreFileVersionResponse, req *provider.RestoreFileVersionRequest) events.FileVersionRestored { - return events.FileVersionRestored{} + return events.FileVersionRestored{ + FileID: req.Ref, + Key: req.Key, + } } diff --git a/pkg/events/files.go b/pkg/events/files.go index 269df6505f..59a0e4615a 100644 --- a/pkg/events/files.go +++ b/pkg/events/files.go @@ -1,36 +1,121 @@ +// Copyright 2018-2022 CERN +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// In applying this license, CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + package events +import ( + "encoding/json" + + user "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" + provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" +) + // FileUploaded is emitted when a file is uploaded type FileUploaded struct { - FileID string + FileID *provider.Reference + Owner *user.UserId +} + +// Unmarshal to fulfill umarshaller interface +func (FileUploaded) Unmarshal(v []byte) (interface{}, error) { + e := FileUploaded{} + err := json.Unmarshal(v, &e) + return e, err } -//FileDownloaded is emitted when a file is downloaded +// FileDownloaded is emitted when a file is downloaded type FileDownloaded struct { - FileID string + FileID *provider.Reference + Owner *user.UserId +} + +// Unmarshal to fulfill umarshaller interface +func (FileDownloaded) Unmarshal(v []byte) (interface{}, error) { + e := FileDownloaded{} + err := json.Unmarshal(v, &e) + return e, err } // ItemTrashed is emitted when a file or folder is trashed type ItemTrashed struct { - FileID string + FileID *provider.Reference + Owner *user.UserId +} + +// Unmarshal to fulfill umarshaller interface +func (ItemTrashed) Unmarshal(v []byte) (interface{}, error) { + e := ItemTrashed{} + err := json.Unmarshal(v, &e) + return e, err } // ItemMoved is emitted when a file or folder is moved type ItemMoved struct { - FileID string + FileID *provider.Reference + Owner *user.UserId + OldReference *provider.Reference +} + +// Unmarshal to fulfill umarshaller interface +func (ItemMoved) Unmarshal(v []byte) (interface{}, error) { + e := ItemMoved{} + err := json.Unmarshal(v, &e) + return e, err } // ItemPurged is emitted when a file or folder is removed from trashbin type ItemPurged struct { - FileID string + FileID *provider.Reference + Owner *user.UserId +} + +// Unmarshal to fulfill umarshaller interface +func (ItemPurged) Unmarshal(v []byte) (interface{}, error) { + e := ItemPurged{} + err := json.Unmarshal(v, &e) + return e, err } // ItemRestored is emitted when a file or folder is restored from trashbin type ItemRestored struct { - FileID string + FileID *provider.Reference + Owner *user.UserId + OldReference *provider.Reference + Key string +} + +// Unmarshal to fulfill umarshaller interface +func (ItemRestored) Unmarshal(v []byte) (interface{}, error) { + e := ItemRestored{} + err := json.Unmarshal(v, &e) + return e, err } // FileVersionRestored is emitted when a file version is restored type FileVersionRestored struct { - FileID string + FileID *provider.Reference + Owner *user.UserId + Key string +} + +// Unmarshal to fulfill umarshaller interface +func (FileVersionRestored) Unmarshal(v []byte) (interface{}, error) { + e := FileVersionRestored{} + err := json.Unmarshal(v, &e) + return e, err }