diff --git a/build.sbt b/build.sbt index 8f3776021..def1ef784 100644 --- a/build.sbt +++ b/build.sbt @@ -2,10 +2,9 @@ import CompilerOptions._ import Dependencies._ import microsites._ import org.scalafmt.sbt.ScalafmtPlugin._ -import scoverage.ScoverageKeys.{coverageFailOnMinimum, coverageMinimum} +import scoverage.ScoverageKeys.{coverageMinimum, coverageFailOnMinimum} import scala.language.postfixOps -import scala.sys.env import scala.util.Try lazy val IntegrationTest = config("it").extend(Test) @@ -38,7 +37,7 @@ lazy val sharedSettings = Seq( // coverage options coverageMinimum := 85, coverageFailOnMinimum := true, - coverageHighlighting := true, + coverageHighlighting := true ) lazy val testSettings = Seq( @@ -206,9 +205,11 @@ lazy val portalSettings = Seq( routesGenerator := InjectedRoutesGenerator, coverageExcludedPackages := ";views.html.*;router.*;controllers\\.javascript.*;.*Reverse.*", javaOptions in Test += "-Dconfig.file=conf/application-test.conf", - // ads the version when working locally with sbt run + // Adds the version when working locally with sbt run PlayKeys.devSettings += "vinyldns.base-version" -> (version in ThisBuild).value, - // adds an extra classpath to the portal loading so we can externalize jars, make sure to create the lib_extra + // Automatically run the prepare portal script before `run` + PlayKeys.playRunHooks += PreparePortalHook(baseDirectory.value), + // Adds an extra classpath to the portal loading so we can externalize jars, make sure to create the lib_extra // directory and lay down any dependencies that are required when deploying scriptClasspath in bashScriptDefines ~= (cp => cp :+ "lib_extra/*"), mainClass in reStart := None, @@ -241,7 +242,7 @@ lazy val portal = (project in file("modules/portal")) .settings(testSettings) .settings(portalSettings) .settings( - name := "portal", + name := "portal" ) .dependsOn(mysql) diff --git a/modules/api/src/main/scala/vinyldns/api/domain/membership/MembershipProtocol.scala b/modules/api/src/main/scala/vinyldns/api/domain/membership/MembershipProtocol.scala index 6db87bb29..b9db14e49 100644 --- a/modules/api/src/main/scala/vinyldns/api/domain/membership/MembershipProtocol.scala +++ b/modules/api/src/main/scala/vinyldns/api/domain/membership/MembershipProtocol.scala @@ -17,8 +17,8 @@ package vinyldns.api.domain.membership import java.util.UUID - import org.joda.time.DateTime +import vinyldns.core.domain.auth.AuthPrincipal import vinyldns.core.domain.membership.GroupChangeType.GroupChangeType import vinyldns.core.domain.membership.GroupStatus.GroupStatus import vinyldns.core.domain.membership.LockStatus.LockStatus @@ -36,15 +36,20 @@ final case class GroupInfo( admins: Set[UserId] = Set.empty ) object GroupInfo { - def apply(group: Group): GroupInfo = GroupInfo( + def apply(group: Group): GroupInfo = fromGroup(group, abridged = false, None) + + def fromGroup(group: Group, abridged: Boolean = false, + authPrincipal: Option[AuthPrincipal]): GroupInfo = GroupInfo( id = group.id, name = group.name, email = group.email, description = group.description, - created = group.created, - status = group.status, - members = group.memberIds.map(UserId), - admins = group.adminUserIds.map(UserId) + created = if (abridged) null else group.created, + status = if (abridged) null else group.status, + members = (if (abridged && authPrincipal.isDefined) group.memberIds.filter(x => authPrincipal.get.userId == x && authPrincipal.get.isGroupMember(group.id)) + else group.memberIds).map(UserId), + admins = (if (abridged && authPrincipal.isDefined) group.adminUserIds.filter(x => authPrincipal.get.userId == x && authPrincipal.get.isGroupAdmin(group)) + else group.memberIds).map(UserId) ) } diff --git a/modules/api/src/main/scala/vinyldns/api/domain/membership/MembershipService.scala b/modules/api/src/main/scala/vinyldns/api/domain/membership/MembershipService.scala index 5d24297e6..32537aeb5 100644 --- a/modules/api/src/main/scala/vinyldns/api/domain/membership/MembershipService.scala +++ b/modules/api/src/main/scala/vinyldns/api/domain/membership/MembershipService.scala @@ -188,7 +188,8 @@ class MembershipService( startFrom: Option[String], maxItems: Int, authPrincipal: AuthPrincipal, - ignoreAccess: Boolean + ignoreAccess: Boolean, + abridged: Boolean = false ): Result[ListMyGroupsResponse] = { val groupsCall = if (authPrincipal.isSystemAdmin || ignoreAccess) { @@ -198,7 +199,7 @@ class MembershipService( } groupsCall.map { grp => - pageListGroupsResponse(grp.toList, groupNameFilter, startFrom, maxItems, ignoreAccess) + pageListGroupsResponse(grp.toList, groupNameFilter, startFrom, maxItems, ignoreAccess, abridged, authPrincipal) } }.toResult @@ -207,12 +208,14 @@ class MembershipService( groupNameFilter: Option[String], startFrom: Option[String], maxItems: Int, - ignoreAccess: Boolean - ): ListMyGroupsResponse = { + ignoreAccess: Boolean, + abridged: Boolean = false, + authPrincipal: AuthPrincipal + ): ListMyGroupsResponse = { val allMyGroups = allGroups .filter(_.status == GroupStatus.Active) .sortBy(_.id) - .map(GroupInfo.apply) + .map(x => GroupInfo.fromGroup(x, abridged, Some(authPrincipal))) val filtered = allMyGroups .filter(grp => groupNameFilter.forall(grp.name.contains(_))) diff --git a/modules/api/src/main/scala/vinyldns/api/domain/membership/MembershipServiceAlgebra.scala b/modules/api/src/main/scala/vinyldns/api/domain/membership/MembershipServiceAlgebra.scala index 4879c520b..ffb9d9118 100644 --- a/modules/api/src/main/scala/vinyldns/api/domain/membership/MembershipServiceAlgebra.scala +++ b/modules/api/src/main/scala/vinyldns/api/domain/membership/MembershipServiceAlgebra.scala @@ -44,7 +44,8 @@ trait MembershipServiceAlgebra { startFrom: Option[String], maxItems: Int, authPrincipal: AuthPrincipal, - ignoreAccess: Boolean + ignoreAccess: Boolean, + abridged: Boolean = false ): Result[ListMyGroupsResponse] def listMembers( diff --git a/modules/api/src/main/scala/vinyldns/api/route/MembershipRouting.scala b/modules/api/src/main/scala/vinyldns/api/route/MembershipRouting.scala index 6611a7346..c863c869e 100644 --- a/modules/api/src/main/scala/vinyldns/api/route/MembershipRouting.scala +++ b/modules/api/src/main/scala/vinyldns/api/route/MembershipRouting.scala @@ -82,13 +82,15 @@ class MembershipRoute( "startFrom".?, "maxItems".as[Int].?(DEFAULT_MAX_ITEMS), "groupNameFilter".?, - "ignoreAccess".as[Boolean].?(false) + "ignoreAccess".as[Boolean].?(false), + "abridged".as[Boolean].?(false), ) { ( startFrom: Option[String], maxItems: Int, groupNameFilter: Option[String], - ignoreAccess: Boolean + ignoreAccess: Boolean, + abridged: Boolean ) => { handleRejections(invalidQueryHandler) { @@ -101,7 +103,7 @@ class MembershipRoute( ) { authenticateAndExecute( membershipService - .listMyGroups(groupNameFilter, startFrom, maxItems, _, ignoreAccess) + .listMyGroups(groupNameFilter, startFrom, maxItems, _, ignoreAccess, abridged) ) { groups => complete(StatusCodes.OK, groups) } diff --git a/modules/portal/app/views/groups/groups.scala.html b/modules/portal/app/views/groups/groups.scala.html index c75818c56..5e4ba60da 100644 --- a/modules/portal/app/views/groups/groups.scala.html +++ b/modules/portal/app/views/groups/groups.scala.html @@ -79,8 +79,7 @@ - {{group.name}} - {{group.name}} + {{group.name}} {{group.email}} {{group.description}} @@ -279,4 +278,4 @@ } -@main(rootAccountName)("GroupsController")("Groups")(content)(plugins) \ No newline at end of file +@main(rootAccountName)("GroupsController")("Groups")(content)(plugins) diff --git a/modules/portal/app/views/zones/zoneTabs/manageZone.scala.html b/modules/portal/app/views/zones/zoneTabs/manageZone.scala.html index 6675a8c1d..269a1bfbd 100644 --- a/modules/portal/app/views/zones/zoneTabs/manageZone.scala.html +++ b/modules/portal/app/views/zones/zoneTabs/manageZone.scala.html @@ -352,7 +352,7 @@
-