diff --git a/src/main/scala/app/AccountController.scala b/src/main/scala/app/AccountController.scala index f89cb74..d35379b 100644 --- a/src/main/scala/app/AccountController.scala +++ b/src/main/scala/app/AccountController.scala @@ -11,6 +11,7 @@ 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 @@ // 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 @@ _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 @@ } 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 @@ // 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 37d5e06..dc3543c 100644 --- a/src/main/scala/app/UserManagementController.scala +++ b/src/main/scala/app/UserManagementController.scala @@ -69,11 +69,11 @@ 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 @@ } }) - 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 2357f58..c57d0ce 100644 --- a/src/main/scala/service/AccountService.scala +++ b/src/main/scala/service/AccountService.scala @@ -129,11 +129,10 @@ } } - 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 76e09a9..9038ea5 100644 --- a/src/main/scala/service/RepositoryService.scala +++ b/src/main/scala/service/RepositoryService.scala @@ -204,7 +204,7 @@ 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 0c56abf..f40af7b 100644 --- a/src/main/scala/util/Authenticator.scala +++ b/src/main/scala/util/Authenticator.scala @@ -40,8 +40,8 @@ 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 @@ { 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 7afdbc3..4826352 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 @@ 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 5661d8e..37369aa 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 @@ 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/AccountServiceServiceSpec.scala deleted file mode 100644 index 2c307f1..0000000 --- a/src/test/scala/service/AccountServiceServiceSpec.scala +++ /dev/null @@ -1,78 +0,0 @@ -package service - -import org.specs2.mutable.Specification -import java.util.Date - -class AccountServiceServiceSpec extends Specification with ServiceSpecBase { - - "AccountService" should { - val RootMailAddress = "root@localhost" - - "getAllUsers" in { withTestDB{ - AccountService.getAllUsers() must be like{ - case List(model.Account("root", "root", RootMailAddress, _, true, _, _, _, None, None, false, false)) => ok - } - }} - - "getAccountByUserName" in { withTestDB{ - AccountService.getAccountByUserName("root") must beSome.like{ - case user => user.userName must_== "root" - } - - AccountService.getAccountByUserName("invalid user name") must beNone - }} - - "getAccountByMailAddress" in { withTestDB{ - AccountService.getAccountByMailAddress(RootMailAddress) must beSome - }} - - "updateLastLoginDate" in { withTestDB{ - val root = "root" - def user() = - AccountService.getAccountByUserName(root).getOrElse(sys.error(s"user $root does not exists")) - - user().lastLoginDate must beNone - val date1 = new Date - AccountService.updateLastLoginDate(root) - user().lastLoginDate must beSome.like{ case date => - date must be_>(date1) - } - val date2 = new Date - Thread.sleep(1000) - AccountService.updateLastLoginDate(root) - user().lastLoginDate must beSome.like{ case date => - date must be_>(date2) - } - }} - - "updateAccount" in { withTestDB{ - val root = "root" - def user() = - AccountService.getAccountByUserName(root).getOrElse(sys.error(s"user $root does not exists")) - - val newAddress = "new mail address" - AccountService.updateAccount(user().copy(mailAddress = newAddress)) - user().mailAddress must_== newAddress - }} - - "group" in { withTestDB { - val group1 = "group1" - val user1 = "root" - AccountService.createGroup(group1, None) - - AccountService.getGroupMembers(group1) must_== Nil - AccountService.getGroupsByUserName(user1) must_== Nil - - AccountService.updateGroupMembers(group1, List((user1, true))) - - AccountService.getGroupMembers(group1) must_== List((user1, true)) - AccountService.getGroupsByUserName(user1) must_== List(group1) - - AccountService.updateGroupMembers(group1, Nil) - - AccountService.getGroupMembers(group1) must_== Nil - AccountService.getGroupsByUserName(user1) must_== Nil - }} - } -} - diff --git a/src/test/scala/service/AccountServiceSpec.scala b/src/test/scala/service/AccountServiceSpec.scala new file mode 100644 index 0000000..344f8e3 --- /dev/null +++ b/src/test/scala/service/AccountServiceSpec.scala @@ -0,0 +1,79 @@ +package service + +import org.specs2.mutable.Specification +import java.util.Date +import model.GroupMember + +class AccountServiceSpec extends Specification with ServiceSpecBase { + + "AccountService" should { + val RootMailAddress = "root@localhost" + + "getAllUsers" in { withTestDB{ + AccountService.getAllUsers() must be like{ + case List(model.Account("root", "root", RootMailAddress, _, true, _, _, _, None, None, false, false)) => ok + } + }} + + "getAccountByUserName" in { withTestDB{ + AccountService.getAccountByUserName("root") must beSome.like{ + case user => user.userName must_== "root" + } + + AccountService.getAccountByUserName("invalid user name") must beNone + }} + + "getAccountByMailAddress" in { withTestDB{ + AccountService.getAccountByMailAddress(RootMailAddress) must beSome + }} + + "updateLastLoginDate" in { withTestDB{ + val root = "root" + def user() = + AccountService.getAccountByUserName(root).getOrElse(sys.error(s"user $root does not exists")) + + user().lastLoginDate must beNone + val date1 = new Date + AccountService.updateLastLoginDate(root) + user().lastLoginDate must beSome.like{ case date => + date must be_>(date1) + } + val date2 = new Date + Thread.sleep(1000) + AccountService.updateLastLoginDate(root) + user().lastLoginDate must beSome.like{ case date => + date must be_>(date2) + } + }} + + "updateAccount" in { withTestDB{ + val root = "root" + def user() = + AccountService.getAccountByUserName(root).getOrElse(sys.error(s"user $root does not exists")) + + val newAddress = "new mail address" + AccountService.updateAccount(user().copy(mailAddress = newAddress)) + user().mailAddress must_== newAddress + }} + + "group" in { withTestDB { + val group1 = "group1" + val user1 = "root" + AccountService.createGroup(group1, None) + + AccountService.getGroupMembers(group1) must_== Nil + AccountService.getGroupsByUserName(user1) must_== Nil + + AccountService.updateGroupMembers(group1, List((user1, true))) + + AccountService.getGroupMembers(group1) must_== List(GroupMember(group1, user1, true)) + AccountService.getGroupsByUserName(user1) must_== List(group1) + + AccountService.updateGroupMembers(group1, Nil) + + AccountService.getGroupMembers(group1) must_== Nil + AccountService.getGroupsByUserName(user1) must_== Nil + }} + } +} +