add notification for space unshares

This commit is contained in:
David Christofas
2022-12-20 15:20:32 +01:00
parent 68ead43000
commit 445e594eff
5 changed files with 134 additions and 3 deletions

View File

@@ -36,6 +36,7 @@ func Server(cfg *config.Config) *cli.Command {
evs := []events.Unmarshaller{
events.ShareCreated{},
events.SpaceShared{},
events.SpaceUnshared{},
}
evtsCfg := cfg.Notifications.Events

View File

@@ -0,0 +1,18 @@
Hello {{ .SpaceGrantee }},
{{ .SpaceSharer }} has removed you from "{{ .SpaceName }}".
You might still have access through your other groups or direct membership. Click here to check it: {{ .ShareLink }}
----------------------------------------------------------
Hallo {{ .SpaceGrantee }},
{{ .SpaceSharer }} hat dich aus dem Space "{{ .SpaceName }}" entfernt.
Du könntest über deine anderen Gruppen oder deiner direkten Mitgliedschaft noch Zugriff haben. Klicke hier zum Überprüfen: {{ .ShareLink }}
---
ownCloud - Store. Share. Work.
https://owncloud.com

View File

@@ -0,0 +1 @@
{{ .SpaceSharer }} removed you from {{ .SpaceName }}

View File

@@ -68,6 +68,8 @@ func (s eventsNotifier) Run() error {
switch e := evt.(type) {
case events.SpaceShared:
s.handleSpaceShared(e)
case events.SpaceUnshared:
s.handleSpaceUnshared(e)
case events.ShareCreated:
s.handleShareCreated(e)
}

View File

@@ -67,7 +67,7 @@ func (s eventsNotifier) handleSpaceShared(e events.SpaceShared) {
Msg("Could not get user response from gatway client")
return
}
spaceGrantee = granteeUserResponse.GetUser().DisplayName
spaceGrantee = granteeUserResponse.GetUser().GetDisplayName()
case e.GranteeGroupID != nil:
granteeGroupResponse, err := s.gwClient.GetGroup(ownerCtx, &groupv1beta1.GetGroupRequest{
GroupId: e.GranteeGroupID,
@@ -78,14 +78,14 @@ func (s eventsNotifier) handleSpaceShared(e events.SpaceShared) {
Msg("Could not get group response from gatway client")
return
}
spaceGrantee = granteeGroupResponse.GetGroup().DisplayName
spaceGrantee = granteeGroupResponse.GetGroup().GetDisplayName()
default:
logger.Error().
Msg("Event 'SpaceShared' has no grantee")
return
}
sharerDisplayName := impersonateRes.GetUser().DisplayName
sharerDisplayName := impersonateRes.GetUser().GetDisplayName()
msg, err := email.RenderEmailTemplate("spaces/sharedSpace.email.body.tmpl", map[string]string{
"SpaceGrantee": spaceGrantee,
"SpaceSharer": sharerDisplayName,
@@ -121,3 +121,112 @@ func (s eventsNotifier) handleSpaceShared(e events.SpaceShared) {
Msg("failed to send a message")
}
}
func (s eventsNotifier) handleSpaceUnshared(e events.SpaceUnshared) {
logger := s.logger.With().
Str("event", "SpaceUnshared").
Str("itemid", e.ID.OpaqueId).
Logger()
impersonateRes, err := s.impersonate(e.Executant)
if err != nil {
logger.Error().
Err(err).
Msg("could not handle space unshared event")
return
}
ownerCtx := metadata.AppendToOutgoingContext(context.Background(), revactx.TokenHeader, impersonateRes.Token)
resourceID, err := storagespace.ParseID(e.ID.OpaqueId)
if err != nil {
logger.Error().
Err(err).
Msg("could not parse resourceid from ItemID ")
return
}
resourceInfo, err := s.getResourceInfo(ownerCtx, &resourceID, nil)
if err != nil {
logger.Error().
Err(err).
Msg("could not get space info")
return
}
shareLink, err := urlJoinPath(s.ocisURL, "f", e.ID.OpaqueId)
if err != nil {
logger.Error().
Err(err).
Msg("could not create link to the share")
return
}
spaceGrantee := ""
switch {
// Note: We're using the 'ownerCtx' (authenticated as the share owner) here for requesting
// the Grantees of the shares. Ideally the notfication service would use some kind of service
// user for this.
case e.GranteeUserID != nil:
granteeUserResponse, err := s.gwClient.GetUser(ownerCtx, &userv1beta1.GetUserRequest{
UserId: e.GranteeUserID,
})
if err != nil || granteeUserResponse.Status.Code != rpcv1beta1.Code_CODE_OK {
logger.Error().
Err(err).
Msg("Could not get user response from gatway client")
return
}
spaceGrantee = granteeUserResponse.GetUser().GetDisplayName()
case e.GranteeGroupID != nil:
granteeGroupResponse, err := s.gwClient.GetGroup(ownerCtx, &groupv1beta1.GetGroupRequest{
GroupId: e.GranteeGroupID,
})
if err != nil || granteeGroupResponse.Status.Code != rpcv1beta1.Code_CODE_OK {
logger.Error().
Err(err).
Msg("Could not get group response from gatway client")
return
}
spaceGrantee = granteeGroupResponse.GetGroup().GetDisplayName()
default:
logger.Error().
Msg("Event 'SpaceShared' has no grantee")
return
}
sharerDisplayName := impersonateRes.GetUser().GetDisplayName()
msg, err := email.RenderEmailTemplate("spaces/unsharedSpace.email.body.tmpl", map[string]string{
"SpaceGrantee": spaceGrantee,
"SpaceSharer": sharerDisplayName,
"SpaceName": resourceInfo.GetSpace().Name,
"ShareLink": shareLink,
}, s.emailTemplatePath)
if err != nil {
logger.Error().
Err(err).
Msg("Could not render E-Mail body template for spaces")
}
emailSubject, err := email.RenderEmailTemplate("spaces/unsharedSpace.email.subject.tmpl", map[string]string{
"SpaceSharer": sharerDisplayName,
"SpaceName": resourceInfo.GetSpace().Name,
}, s.emailTemplatePath)
if err != nil {
logger.Error().
Err(err).
Msg("Could not render E-Mail subject template for spaces")
}
if e.GranteeUserID != nil {
err = s.channel.SendMessage(ownerCtx, []string{e.GranteeUserID.OpaqueId}, msg, emailSubject, sharerDisplayName)
} else if e.GranteeGroupID != nil {
err = s.channel.SendMessageToGroup(ownerCtx, e.GranteeGroupID, msg, emailSubject, sharerDisplayName)
}
if err != nil {
logger.Error().
Err(err).
Msg("failed to send a message")
}
}