diff --git a/src/main/scala/ScalatraBootstrap.scala b/src/main/scala/ScalatraBootstrap.scala index 07348e7..f36a57f 100644 --- a/src/main/scala/ScalatraBootstrap.scala +++ b/src/main/scala/ScalatraBootstrap.scala @@ -7,10 +7,11 @@ context.mount(new IndexController, "/") context.mount(new SignInController, "/*") context.mount(new UsersController, "/*") + context.mount(new CreateRepositoryController, "/*") + context.mount(new AccountController, "/*") + context.mount(new RepositoryViewerController, "/*") context.mount(new WikiController, "/*") context.mount(new IssuesController, "/*") - context.mount(new CreateRepositoryController, "/*") - context.mount(new RepositoryViewerController, "/*") context.mount(new SettingsController, "/*") context.addListener(new ServletContextListener(){ diff --git a/src/main/scala/app/AccountController.scala b/src/main/scala/app/AccountController.scala new file mode 100644 index 0000000..1c46e03 --- /dev/null +++ b/src/main/scala/app/AccountController.scala @@ -0,0 +1,50 @@ +package app + +import service._ +import util.OwnerOnlyAuthenticator +import jp.sf.amateras.scalatra.forms._ + +class AccountController extends AccountControllerBase + with AccountService with RepositoryService with OwnerOnlyAuthenticator + +trait AccountControllerBase extends ControllerBase { + self: AccountService with RepositoryService with OwnerOnlyAuthenticator => + + case class AccountEditForm(mailAddress: String, url: Option[String]) + + val form = mapping( + "mailAddress" -> trim(label("Mail Address" , text(required, maxlength(100)))), + "url" -> trim(label("URL" , optional(text(maxlength(200))))) + )(AccountEditForm.apply) + + /** + * Displays user information. + */ + get("/:userName") { + val userName = params("userName") + getAccountByUserName(userName) match { + case Some(a) => account.html.userinfo(a, getRepositoriesOfUser(userName, servletContext)) + case None => NotFound() + } + } + + get("/:userName/_edit")(ownerOnly { + val userName = params("userName") + getAccountByUserName(userName) match { + case Some(a) => account.html.useredit(a) + case None => NotFound() + } + }) + + post("/:userName/_edit", form)(ownerOnly { form => + val userName = params("userName") + val currentDate = new java.sql.Date(System.currentTimeMillis) + updateAccount(getAccountByUserName(userName).get.copy( + mailAddress = form.mailAddress, + url = form.url, + updatedDate = currentDate)) + + redirect("/%s".format(userName)) + }) + +} diff --git a/src/main/scala/app/RepositoryViewerController.scala b/src/main/scala/app/RepositoryViewerController.scala index d63d431..e9c72a0 100644 --- a/src/main/scala/app/RepositoryViewerController.scala +++ b/src/main/scala/app/RepositoryViewerController.scala @@ -19,18 +19,6 @@ */ trait RepositoryViewerControllerBase extends ControllerBase { self: RepositoryService with AccountService with ReadableRepositoryAuthenticator => - - // TODO separate to AccountController? - /** - * Displays user information. - */ - get("/:owner") { - val owner = params("owner") - getAccountByUserName(owner) match { - case Some(account) => html.user(account, getRepositoriesOfUser(owner, servletContext)) - case None => NotFound() - } - } /** * Returns converted HTML from Markdown for preview. diff --git a/src/main/twirl/account/useredit.scala.html b/src/main/twirl/account/useredit.scala.html new file mode 100644 index 0000000..7870c98 --- /dev/null +++ b/src/main/twirl/account/useredit.scala.html @@ -0,0 +1,20 @@ +@(account: model.Account)(implicit context: app.Context) +@import context._ +@html.main(account.userName){ +
+} diff --git a/src/main/twirl/account/userinfo.scala.html b/src/main/twirl/account/userinfo.scala.html new file mode 100644 index 0000000..c0d2352 --- /dev/null +++ b/src/main/twirl/account/userinfo.scala.html @@ -0,0 +1,49 @@ +@(account: model.Account, repositories: List[service.RepositoryService.RepositoryInfo])(implicit context: app.Context) +@import context._ +@import service.RepositoryService._ +@html.main(account.userName){ +