diff --git a/src/main/scala/app/AccountController.scala b/src/main/scala/app/AccountController.scala index f89cb7424..d35379b88 100644 --- a/src/main/scala/app/AccountController.scala +++ b/src/main/scala/app/AccountController.scala @@ -11,6 +11,7 @@ import org.scalatra.i18n.Messages import org.eclipse.jgit.api.Git import org.eclipse.jgit.lib.{FileMode, Constants} import org.eclipse.jgit.dircache.DirCache +import model.GroupMember class AccountController extends AccountControllerBase with AccountService with RepositoryService with ActivityService with WikiService with LabelsService @@ -94,8 +95,8 @@ trait AccountControllerBase extends AccountManagementControllerBase { // Members case "members" if(account.isGroupAccount) => { val members = getGroupMembers(account.userName) - _root_.account.html.members(account, members.map(_._1), - context.loginAccount.exists(x => members.exists { case (userName, isManager) => userName == x.userName && isManager })) + _root_.account.html.members(account, members.map(_.userName), + context.loginAccount.exists(x => members.exists { member => member.userName == x.userName && member.isManager })) } // Repositories @@ -104,7 +105,7 @@ trait AccountControllerBase extends AccountManagementControllerBase { _root_.account.html.repositories(account, if(account.isGroupAccount) Nil else getGroupsByUserName(userName), getVisibleRepositories(context.loginAccount, baseUrl, Some(userName)), - context.loginAccount.exists(x => members.exists { case (userName, isManager) => userName == x.userName && isManager })) + context.loginAccount.exists(x => members.exists { member => member.userName == x.userName && member.isManager })) } } } getOrElse NotFound @@ -182,7 +183,7 @@ trait AccountControllerBase extends AccountManagementControllerBase { } get("/groups/new")(usersOnly { - account.html.group(None, List((context.loginAccount.get.userName, true))) + account.html.group(None, List(GroupMember("", context.loginAccount.get.userName, true))) }) post("/groups/new", newGroupForm)(usersOnly { form => @@ -265,8 +266,8 @@ trait AccountControllerBase extends AccountManagementControllerBase { // Add collaborators for group repository if(ownerAccount.isGroupAccount){ - getGroupMembers(form.owner).foreach { case (userName, isManager) => - addCollaborator(form.owner, form.name, userName) + getGroupMembers(form.owner).foreach { member => + addCollaborator(form.owner, form.name, member.userName) } } diff --git a/src/main/scala/app/UserManagementController.scala b/src/main/scala/app/UserManagementController.scala index 37d5e0631..dc3543c00 100644 --- a/src/main/scala/app/UserManagementController.scala +++ b/src/main/scala/app/UserManagementController.scala @@ -69,11 +69,11 @@ trait UserManagementControllerBase extends AccountManagementControllerBase { get("/admin/users")(adminOnly { val includeRemoved = params.get("includeRemoved").map(_.toBoolean).getOrElse(false) - val users = getAllUsers(includeRemoved) - - val members = users.collect { case account if(account.isGroupAccount) => - account.userName -> getGroupMembers(account.userName).map(_._1) + val users = getAllUsers(includeRemoved) + val members = users.collect { case account if(account.isGroupAccount) => + account.userName -> getGroupMembers(account.userName).map(_.userName) }.toMap + admin.users.html.list(users, members, includeRemoved) }) @@ -181,9 +181,10 @@ trait UserManagementControllerBase extends AccountManagementControllerBase { } }) - post("/admin/users/_usercheck")(adminOnly { + // TODO Move to other generic controller? + post("/admin/users/_usercheck"){ getAccountByUserName(params("userName")).isDefined - }) + } private def members: Constraint = new Constraint(){ override def validate(name: String, value: String, messages: Messages): Option[String] = { diff --git a/src/main/scala/service/AccountService.scala b/src/main/scala/service/AccountService.scala index 2357f58b9..c57d0ce06 100644 --- a/src/main/scala/service/AccountService.scala +++ b/src/main/scala/service/AccountService.scala @@ -129,11 +129,10 @@ trait AccountService { } } - def getGroupMembers(groupName: String): List[(String, Boolean)] = + def getGroupMembers(groupName: String): List[GroupMember] = Query(GroupMembers) .filter(_.groupName is groupName.bind) .sortBy(_.userName) - .map(m => m.userName ~ m.isManager) .list def getGroupsByUserName(userName: String): List[String] = diff --git a/src/main/scala/service/RepositoryService.scala b/src/main/scala/service/RepositoryService.scala index 76e09a949..9038ea54d 100644 --- a/src/main/scala/service/RepositoryService.scala +++ b/src/main/scala/service/RepositoryService.scala @@ -204,7 +204,7 @@ trait RepositoryService { self: AccountService => private def getRepositoryManagers(userName: String): Seq[String] = if(getAccountByUserName(userName).exists(_.isGroupAccount)){ - getGroupMembers(userName).filter(_._2).map(_._1) + getGroupMembers(userName).collect { case x if(x.isManager) => x.userName } } else { Seq(userName) } diff --git a/src/main/scala/util/Authenticator.scala b/src/main/scala/util/Authenticator.scala index 0c56abff6..f40af7bcc 100644 --- a/src/main/scala/util/Authenticator.scala +++ b/src/main/scala/util/Authenticator.scala @@ -40,8 +40,8 @@ trait OwnerAuthenticator { self: ControllerBase with RepositoryService with Acco context.loginAccount match { case Some(x) if(x.isAdmin) => action(repository) case Some(x) if(repository.owner == x.userName) => action(repository) - case Some(x) if(getGroupMembers(repository.owner).exists { - case (userName, isManager) => userName == x.userName && isManager == true + case Some(x) if(getGroupMembers(repository.owner).exists { member => + member.userName == x.userName && member.isManager == true }) => action(repository) case _ => Unauthorized() } @@ -170,7 +170,9 @@ trait GroupManagerAuthenticator { self: ControllerBase with AccountService => { defining(request.paths){ paths => context.loginAccount match { - case Some(x) if(getGroupMembers(paths(0)).exists { case (userName, isManager) => userName == x.userName && isManager }) => action + case Some(x) if(getGroupMembers(paths(0)).exists { member => + member.userName == x.userName && member.isManager + }) => action case _ => Unauthorized() } } diff --git a/src/main/twirl/account/group.scala.html b/src/main/twirl/account/group.scala.html index 7afdbc338..482635229 100644 --- a/src/main/twirl/account/group.scala.html +++ b/src/main/twirl/account/group.scala.html @@ -1,4 +1,4 @@ -@(account: Option[model.Account], members: List[(String, Boolean)])(implicit context: app.Context) +@(account: Option[model.Account], members: List[model.GroupMember])(implicit context: app.Context) @import context._ @import view.helpers._ @html.main(if(account.isEmpty) "Create group" else "Edit group"){ @@ -32,7 +32,7 @@ @helper.html.account("memberName", 200) - +
@@ -102,8 +102,8 @@ $(function(){ return confirm('Once you delete this group, there is no going back.\nAre you sure?'); }); - @members.map { case (userName, isManager) => - addMemberHTML('@userName', @isManager); + @members.map { member => + addMemberHTML('@member.userName', @member.isManager); } function addMemberHTML(userName, isManager){ diff --git a/src/main/twirl/admin/users/group.scala.html b/src/main/twirl/admin/users/group.scala.html index 5661d8e76..37369aa9a 100644 --- a/src/main/twirl/admin/users/group.scala.html +++ b/src/main/twirl/admin/users/group.scala.html @@ -1,4 +1,4 @@ -@(account: Option[model.Account], members: List[(String, Boolean)])(implicit context: app.Context) +@(account: Option[model.Account], members: List[model.GroupMember])(implicit context: app.Context) @import context._ @import view.helpers._ @html.main(if(account.isEmpty) "New Group" else "Update Group"){ @@ -38,7 +38,7 @@ @helper.html.account("memberName", 200) - +
@@ -97,8 +97,8 @@ $(function(){ return !(e.keyCode == 13); }); - @members.map { case (userName, isManager) => - addMemberHTML('@userName', @isManager); + @members.map { member => + addMemberHTML('@member.userName', @member.isManager); } function addMemberHTML(userName, isManager){ diff --git a/src/test/scala/service/AccountServiceServiceSpec.scala b/src/test/scala/service/AccountServiceSpec.scala similarity index 92% rename from src/test/scala/service/AccountServiceServiceSpec.scala rename to src/test/scala/service/AccountServiceSpec.scala index 2c307f1aa..344f8e3c8 100644 --- a/src/test/scala/service/AccountServiceServiceSpec.scala +++ b/src/test/scala/service/AccountServiceSpec.scala @@ -2,8 +2,9 @@ package service import org.specs2.mutable.Specification import java.util.Date +import model.GroupMember -class AccountServiceServiceSpec extends Specification with ServiceSpecBase { +class AccountServiceSpec extends Specification with ServiceSpecBase { "AccountService" should { val RootMailAddress = "root@localhost" @@ -65,7 +66,7 @@ class AccountServiceServiceSpec extends Specification with ServiceSpecBase { AccountService.updateGroupMembers(group1, List((user1, true))) - AccountService.getGroupMembers(group1) must_== List((user1, true)) + AccountService.getGroupMembers(group1) must_== List(GroupMember(group1, user1, true)) AccountService.getGroupsByUserName(user1) must_== List(group1) AccountService.updateGroupMembers(group1, Nil)