diff --git a/src/main/scala/app/CreateRepositoryController.scala b/src/main/scala/app/CreateRepositoryController.scala index 1461a09..a9d2861 100644 --- a/src/main/scala/app/CreateRepositoryController.scala +++ b/src/main/scala/app/CreateRepositoryController.scala @@ -16,12 +16,13 @@ * Creates new repository. */ trait CreateRepositoryControllerBase extends ControllerBase { - self: RepositoryService with WikiService with LabelsService with ActivityService + self: RepositoryService with AccountService with WikiService with LabelsService with ActivityService with UsersAuthenticator => - case class RepositoryCreationForm(name: String, description: Option[String], isPrivate: Boolean, createReadme: Boolean) + case class RepositoryCreationForm(owner: String, name: String, description: Option[String], isPrivate: Boolean, createReadme: Boolean) val form = mapping( + "owner" -> trim(label("Owner" , text(required, maxlength(40), identifier))), // TODO check existence. "name" -> trim(label("Repository name", text(required, maxlength(40), identifier, unique))), "description" -> trim(label("Description" , optional(text()))), "isPrivate" -> trim(label("Repository Type", boolean())), @@ -32,7 +33,7 @@ * Show the new repository form. */ get("/new")(usersOnly { - html.newrepo() + html.newrepo(getGroupsByUserName(context.loginAccount.get.userName)) }) /** @@ -43,22 +44,22 @@ val loginUserName = loginAccount.userName // Insert to the database at first - createRepository(form.name, loginUserName, form.description, form.isPrivate) + createRepository(form.name, form.owner, form.description, form.isPrivate) // Insert default labels - createLabel(loginUserName, form.name, "bug", "fc2929") - createLabel(loginUserName, form.name, "duplicate", "cccccc") - createLabel(loginUserName, form.name, "enhancement", "84b6eb") - createLabel(loginUserName, form.name, "invalid", "e6e6e6") - createLabel(loginUserName, form.name, "question", "cc317c") - createLabel(loginUserName, form.name, "wontfix", "ffffff") + createLabel(form.owner, form.name, "bug", "fc2929") + createLabel(form.owner, form.name, "duplicate", "cccccc") + createLabel(form.owner, form.name, "enhancement", "84b6eb") + createLabel(form.owner, form.name, "invalid", "e6e6e6") + createLabel(form.owner, form.name, "question", "cc317c") + createLabel(form.owner, form.name, "wontfix", "ffffff") // Create the actual repository - val gitdir = getRepositoryDir(loginUserName, form.name) + val gitdir = getRepositoryDir(form.owner, form.name) JGitUtil.initRepository(gitdir) if(form.createReadme){ - val tmpdir = getInitRepositoryDir(loginUserName, form.name) + val tmpdir = getInitRepositoryDir(form.owner, form.name) try { // Clone the repository Git.cloneRepository.setURI(gitdir.toURI.toString).setDirectory(tmpdir).call @@ -86,21 +87,23 @@ } // Create Wiki repository - createWikiRepository(loginAccount, form.name) + createWikiRepository(loginAccount, form.owner, form.name) // Record activity - recordCreateRepositoryActivity(loginUserName, form.name, loginUserName) + recordCreateRepositoryActivity(loginUserName, form.name, form.owner) // redirect to the repository - redirect(s"/${loginUserName}/${form.name}") + redirect(s"/${form.owner}/${form.name}") }) /** * Duplicate check for the repository name. */ private def unique: Constraint = new Constraint(){ - def validate(name: String, value: String): Option[String] = + def validate(name: String, value: String): Option[String] = { + // TODO fix to retreive user name from request parameter getRepositoryNamesOfUser(context.loginAccount.get.userName).find(_ == value).map(_ => "Repository already exists.") + } } } \ No newline at end of file diff --git a/src/main/scala/app/SignInController.scala b/src/main/scala/app/SignInController.scala index becc3b2..a94609a 100644 --- a/src/main/scala/app/SignInController.scala +++ b/src/main/scala/app/SignInController.scala @@ -24,20 +24,19 @@ } post("/signin", form){ form => - val account = getAccountByUserName(form.userName) - if(account.isEmpty || account.get.password != sha1(form.password)){ - redirect("/signin") - } else { - session.setAttribute("LOGIN_ACCOUNT", account.get) - updateLastLoginDate(account.get.userName) + getAccountByUserName(form.userName).collect { + case account if(!account.isGroupAccount && account.password == sha1(form.password)) => { + session.setAttribute("LOGIN_ACCOUNT", account) + updateLastLoginDate(account.userName) - session.get("REDIRECT").map { redirectUrl => - session.removeAttribute("REDIRECT") - redirect(redirectUrl.asInstanceOf[String]) - }.getOrElse { - redirect("/") + session.get("REDIRECT").map { redirectUrl => + session.removeAttribute("REDIRECT") + redirect(redirectUrl.asInstanceOf[String]) + }.getOrElse { + redirect("/") + } } - } + } getOrElse redirect("/signin") } get("/signout"){ diff --git a/src/main/scala/service/AccountService.scala b/src/main/scala/service/AccountService.scala index 5a9aea3..39ca18e 100644 --- a/src/main/scala/service/AccountService.scala +++ b/src/main/scala/service/AccountService.scala @@ -74,4 +74,11 @@ .map(_.userName) .list + def getGroupsByUserName(userName: String): List[String] = + Query(GroupMembers) + .filter(_.userName is userName.bind) + .sortBy(_.groupName) + .map(_.groupName) + .list + } diff --git a/src/main/scala/service/WikiService.scala b/src/main/scala/service/WikiService.scala index fb01cad..36c928a 100644 --- a/src/main/scala/service/WikiService.scala +++ b/src/main/scala/service/WikiService.scala @@ -63,16 +63,16 @@ trait WikiService { import WikiService._ - def createWikiRepository(owner: model.Account, repository: String): Unit = { - lock(owner.userName, repository){ - val dir = Directory.getWikiRepositoryDir(owner.userName, repository) + def createWikiRepository(loginAccount: model.Account, owner: String, repository: String): Unit = { + lock(owner, repository){ + val dir = Directory.getWikiRepositoryDir(owner, repository) if(!dir.exists){ try { JGitUtil.initRepository(dir) - saveWikiPage(owner.userName, repository, "Home", "Home", s"Welcome to the ${repository} wiki!!", owner, "Initial Commit") + saveWikiPage(owner, repository, "Home", "Home", s"Welcome to the ${repository} wiki!!", loginAccount, "Initial Commit") } finally { // once delete cloned repository because initial cloned repository does not have 'branch.master.merge' - FileUtils.deleteDirectory(Directory.getWikiWorkDir(owner.userName, repository)) + FileUtils.deleteDirectory(Directory.getWikiWorkDir(owner, repository)) } } } diff --git a/src/main/twirl/newrepo.scala.html b/src/main/twirl/newrepo.scala.html index 6cec56f..7cfcd01 100644 --- a/src/main/twirl/newrepo.scala.html +++ b/src/main/twirl/newrepo.scala.html @@ -1,47 +1,73 @@ -@()(implicit context: app.Context) +@(groupNames: List[String])(implicit context: app.Context) @import context._ +@import view.helpers._ @main("Create a New Repository"){
-
-
- - - -
-
- - -
-
-
+
+ + +
+
+ +
+
+ +
+
+ +
+
+ +
+
} +