diff --git a/CHANGELOG.md b/CHANGELOG.md index dcc19e237..05eab3b54 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). + +## Unreleased + +### Fixed +- Send email to all admins in a single email when a user submits 'Request access' for a space +- Send email to all admins and request user in a single email when any admin accepts/rejects 'Request access' for a space [#330](https://github.com/clowder-framework/clowder/issues/330) + ## 1.20.3 - 2022-06-10 ### Fixed @@ -13,6 +20,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ### Changed - docker builds images for amd64 and arm64 [#322](https://github.com/clowder-framework/clowder/issues/322) + ## 1.20.2 - 2022-04-30 ### Fixed diff --git a/app/api/Spaces.scala b/app/api/Spaces.scala index 36894f105..8dd34edda 100644 --- a/app/api/Spaces.scala +++ b/app/api/Spaces.scala @@ -13,6 +13,7 @@ import util.Mail import java.util.Date import javax.inject.Inject +import scala.collection.mutable.ListBuffer /** * Spaces allow users to partition the data into realms only accessible to users with the right permissions. @@ -687,9 +688,8 @@ class Spaces @Inject()(spaces: SpaceService, } if(requestUser.email.isDefined) { val subject: String = "Authorization Request from " + AppConfiguration.getDisplayName + " Accepted" - val recipient: String = requestUser.email.get.toString val body = views.html.spaces.requestresponseemail(user.get, id.toString, s.name, "accepted your request and assigned you as " + role + " to") - Mail.sendEmail(subject, request.user, recipient, body) + Mail.sendEmail(subject, request.user, getRecipientsList(s, requestUser), body) } Ok(Json.obj("status" -> "success")) } @@ -700,6 +700,22 @@ class Spaces @Inject()(spaces: SpaceService, } } + def getRecipientsList(s: ProjectSpace, requestUser: User): List[String] = { + val recipients = new ListBuffer[String]() + recipients += requestUser.email.get.toString + + for (requestReceiver <- spaces.getUsersInSpace(s.id, None)) { + spaces.getRoleForUserInSpace(s.id, requestReceiver.id) match { + case Some(aRole) => { + if (aRole.permissions.contains(Permission.EditSpace.toString) && requestReceiver.id != requestUser.id) { + recipients += requestReceiver.toString + } + } + } + } + return recipients.toList + } + def rejectRequest(id:UUID, requestuser:String) = PermissionAction(Permission.EditSpace, Some(ResourceRef(ResourceRef.space, id))) { implicit request => implicit val user = request.user spaces.get(id) match { @@ -711,9 +727,8 @@ class Spaces @Inject()(spaces: SpaceService, spaces.removeRequest(id, requestUser.id) if(requestUser.email.isDefined) { val subject: String = "Authorization Request from " + AppConfiguration.getDisplayName + " Rejected" - val recipient: String = requestUser.email.get.toString val body = views.html.spaces.requestresponseemail(user.get, id.toString, s.name, "rejected your request to") - Mail.sendEmail(subject, request.user, recipient, body) + Mail.sendEmail(subject, request.user, getRecipientsList(s, requestUser), body) } Ok(Json.obj("status" -> "success")) } diff --git a/app/controllers/Spaces.scala b/app/controllers/Spaces.scala index 885750209..a8388812f 100644 --- a/app/controllers/Spaces.scala +++ b/app/controllers/Spaces.scala @@ -354,7 +354,7 @@ class Spaces @Inject() (spaces: SpaceService, users: UserService, events: EventS def addRequest(id: UUID) = AuthenticatedAction { implicit request => implicit val requestuser = request.user requestuser match { - case Some(user) => { + case Some(user) => spaces.get(id) match { case Some(s) => { // when permission is public, user can reach the authorization request button, so we check if the request is @@ -367,24 +367,25 @@ class Spaces @Inject() (spaces: SpaceService, users: UserService, events: EventS Logger.debug("Request submitted in controller.Space.addRequest ") val subject: String = "Request for access from " + AppConfiguration.getDisplayName val body = views.html.spaces.requestemail(user, id.toString, s.name) + val spaceAdminRecipients = new ListBuffer[String] for (requestReceiver <- spaces.getUsersInSpace(s.id, None)) { spaces.getRoleForUserInSpace(s.id, requestReceiver.id) match { case Some(aRole) => { if (aRole.permissions.contains(Permission.EditSpace.toString)) { events.addRequestEvent(Some(user), requestReceiver, id, s.name, "postrequest_space") - Mail.sendEmail(subject, request.user, requestReceiver, body) + spaceAdminRecipients += requestReceiver.toString } } } } + Mail.sendEmail(subject, request.user, spaceAdminRecipients.toList, body) spaces.addRequest(id, user.id, user.fullName) Ok(views.html.authorizationMessage("Request submitted for " + spaceTitle + " " + s.name, s)) } } case None => InternalServerError(spaceTitle + " not found") } - } case None => InternalServerError("User not found") }