diff --git a/src/main/scala/app/ControllerBase.scala b/src/main/scala/app/ControllerBase.scala index bc71e11..98b3aca 100644 --- a/src/main/scala/app/ControllerBase.scala +++ b/src/main/scala/app/ControllerBase.scala @@ -171,12 +171,12 @@ protected def uniqueUserName: Constraint = new Constraint(){ override def validate(name: String, value: String, messages: Messages): Option[String] = - getAccountByUserName(value).map { _ => "User already exists." } + getAccountByUserName(value, true).map { _ => "User already exists." } } protected def uniqueMailAddress(paramName: String = ""): Constraint = new Constraint(){ override def validate(name: String, value: String, params: Map[String, String], messages: Messages): Option[String] = - getAccountByMailAddress(value) + getAccountByMailAddress(value, true) .filter { x => if(paramName.isEmpty) true else Some(x.userName) != params.get(paramName) } .map { _ => "Mail address is already registered." } } diff --git a/src/main/scala/app/UserManagementController.scala b/src/main/scala/app/UserManagementController.scala index 9cf3005..f5a4dec 100644 --- a/src/main/scala/app/UserManagementController.scala +++ b/src/main/scala/app/UserManagementController.scala @@ -5,6 +5,8 @@ import util.StringUtil._ import util.ControlUtil._ import jp.sf.amateras.scalatra.forms._ +import org.apache.commons.io.FileUtils +import util.Directory._ class UserManagementController extends UserManagementControllerBase with AccountService with RepositoryService with AdminAuthenticator @@ -85,12 +87,25 @@ get("/admin/users/:userName/_edituser")(adminOnly { val userName = params("userName") - admin.users.html.user(getAccountByUserName(userName)) + admin.users.html.user(getAccountByUserName(userName, true)) }) post("/admin/users/:name/_edituser", editUserForm)(adminOnly { form => val userName = params("userName") - getAccountByUserName(userName).map { account => + getAccountByUserName(userName, true).map { account => + + if(account.isRemoved == false && form.isRemoved == true){ + // Remove repositories + getRepositoryNamesOfUser(userName).foreach { repositoryName => + deleteRepository(userName, repositoryName) + FileUtils.deleteDirectory(getRepositoryDir(userName, repositoryName)) + FileUtils.deleteDirectory(getWikiRepositoryDir(userName, repositoryName)) + FileUtils.deleteDirectory(getTemporaryDir(userName, repositoryName)) + } + // Remove from GROUP_MEMBER, COLLABORATOR and REPOSITORY + removeUserRelatedData(userName) + } + updateAccount(getAccountByUserName(userName).get.copy( password = form.password.map(sha1).getOrElse(account.password), fullName = form.fullName, @@ -118,13 +133,13 @@ get("/admin/users/:groupName/_editgroup")(adminOnly { defining(params("groupName")){ groupName => - admin.users.html.group(getAccountByUserName(groupName), getGroupMembers(groupName)) + admin.users.html.group(getAccountByUserName(groupName, true), getGroupMembers(groupName)) } }) post("/admin/users/:groupName/_editgroup", editGroupForm)(adminOnly { form => defining(params("groupName"), form.memberNames.map(_.split(",").toList).getOrElse(Nil)){ case (groupName, memberNames) => - getAccountByUserName(groupName).map { account => + getAccountByUserName(groupName, true).map { account => updateGroup(groupName, form.url) updateGroupMembers(form.groupName, memberNames) diff --git a/src/main/scala/service/AccountService.scala b/src/main/scala/service/AccountService.scala index ecc4206..549fe36 100644 --- a/src/main/scala/service/AccountService.scala +++ b/src/main/scala/service/AccountService.scala @@ -51,11 +51,11 @@ } } - def getAccountByUserName(userName: String): Option[Account] = - Query(Accounts) filter(_.userName is userName.bind) firstOption + def getAccountByUserName(userName: String, includeRemoved: Boolean = false): Option[Account] = + Query(Accounts) filter(t => (t.userName is userName.bind) && (t.removed is false.bind, !includeRemoved)) firstOption - def getAccountByMailAddress(mailAddress: String): Option[Account] = - Query(Accounts) filter(_.mailAddress is mailAddress.bind) firstOption + def getAccountByMailAddress(mailAddress: String, includeRemoved: Boolean = false): Option[Account] = + Query(Accounts) filter(t => (t.mailAddress is mailAddress.bind) && (t.removed is false.bind, !includeRemoved)) firstOption def getAllUsers(includeRemoved: Boolean = true): List[Account] = if(includeRemoved){ @@ -139,6 +139,12 @@ .map(_.groupName) .list + def removeUserRelatedData(userName: String): Unit = { + Query(GroupMembers).filter(_.userName is userName.bind).delete + Query(Collaborators).filter(_.collaboratorName is userName.bind).delete + Query(Repositories).filter(_.userName is userName.bind).delete + } + } -object AccountService extends AccountService +//object AccountService extends AccountService