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){ +
+
+ + + +
+
+ + + +
+
+ + Cancel +
+
+} 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){ +
+
+
+
+
@account.userName
+
+
+
@account.url
+
Joined on @account.registeredDate
+
+
+
+ + @repositories.map { repository => +
+
+ @repository.owner + / + @repository.name + @if(repository.repository.repositoryType == Private){ + + } +
+ @if(repository.repository.description.isDefined){ +
@repository.repository.description
+ } +
Last updated: @repository.repository.lastActivityDate
+
+ } +
+
+
+} diff --git a/src/main/twirl/user.scala.html b/src/main/twirl/user.scala.html deleted file mode 100644 index 7b6e2b7..0000000 --- a/src/main/twirl/user.scala.html +++ /dev/null @@ -1,45 +0,0 @@ -@(account: model.Account, repositories: List[service.RepositoryService.RepositoryInfo])(implicit context: app.Context) -@import context._ -@import service.RepositoryService._ -@main(account.userName){ -
-
-
-
-
@account.userName
-
-
-
@account.url
-
Joined on @account.registeredDate
-
-
-
- - @repositories.map { repository => -
-
- @repository.owner - / - @repository.name - @if(repository.repository.repositoryType == Private){ - - } -
- @if(repository.repository.description.isDefined){ -
@repository.repository.description
- } -
Last updated: @repository.repository.lastActivityDate
-
- } -
-
-
-}