diff --git a/src/main/scala/app/IndexController.scala b/src/main/scala/app/IndexController.scala index 8866795..5742d02 100644 --- a/src/main/scala/app/IndexController.scala +++ b/src/main/scala/app/IndexController.scala @@ -1,85 +1,92 @@ -package app - -import util._ -import service._ -import jp.sf.amateras.scalatra.forms._ - -class IndexController extends IndexControllerBase - with RepositoryService with ActivityService with AccountService with UsersAuthenticator - -trait IndexControllerBase extends ControllerBase { - self: RepositoryService with ActivityService with AccountService with UsersAuthenticator => - - case class SignInForm(userName: String, password: String) - - val form = mapping( - "userName" -> trim(label("Username", text(required))), - "password" -> trim(label("Password", text(required))) - )(SignInForm.apply) - - get("/"){ - val loginAccount = context.loginAccount - - html.index(getRecentActivities(), - getVisibleRepositories(loginAccount, context.baseUrl, withoutPhysicalInfo = true), - loginAccount.map{ account => getUserRepositories(account.userName, context.baseUrl, withoutPhysicalInfo = true) }.getOrElse(Nil) - ) - } - - get("/signin"){ - val redirect = params.get("redirect") - if(redirect.isDefined && redirect.get.startsWith("/")){ - flash += Keys.Flash.Redirect -> redirect.get - } - html.signin() - } - - post("/signin", form){ form => - authenticate(context.settings, form.userName, form.password) match { - case Some(account) => signin(account) - case None => redirect("/signin") - } - } - - get("/signout"){ - session.invalidate - redirect("/") - } - - get("/activities.atom"){ - contentType = "application/atom+xml; type=feed" - helper.xml.feed(getRecentActivities()) - } - - /** - * Set account information into HttpSession and redirect. - */ - private def signin(account: model.Account) = { - session.setAttribute(Keys.Session.LoginAccount, account) - updateLastLoginDate(account.userName) - - flash.get(Keys.Flash.Redirect).asInstanceOf[Option[String]].map { redirectUrl => - if(redirectUrl.stripSuffix("/") == request.getContextPath){ - redirect("/") - } else { - redirect(redirectUrl) - } - }.getOrElse { - redirect("/") - } - } - - /** - * JSON API for collaborator completion. - * - * TODO Move to other controller? - */ - get("/_user/proposals")(usersOnly { - contentType = formats("json") - org.json4s.jackson.Serialization.write( - Map("options" -> getAllUsers().filter(!_.isGroupAccount).map(_.userName).toArray) - ) - }) - - -} +package app + +import util._ +import service._ +import jp.sf.amateras.scalatra.forms._ + +class IndexController extends IndexControllerBase + with RepositoryService with ActivityService with AccountService with UsersAuthenticator + +trait IndexControllerBase extends ControllerBase { + self: RepositoryService with ActivityService with AccountService with UsersAuthenticator => + + case class SignInForm(userName: String, password: String) + + val form = mapping( + "userName" -> trim(label("Username", text(required))), + "password" -> trim(label("Password", text(required))) + )(SignInForm.apply) + + get("/"){ + val loginAccount = context.loginAccount + + if(loginAccount.isEmpty) { + html.index(getRecentActivities(), + getVisibleRepositories(loginAccount, context.baseUrl, withoutPhysicalInfo = true), + loginAccount.map{ account => getUserRepositories(account.userName, context.baseUrl, withoutPhysicalInfo = true) }.getOrElse(Nil) + ) + } else { + html.index(getRecentActivitiesByUser(loginAccount.get.userName), + getVisibleRepositories(loginAccount, context.baseUrl, withoutPhysicalInfo = true), + loginAccount.map{ account => getUserRepositories(account.userName, context.baseUrl, withoutPhysicalInfo = true) }.getOrElse(Nil) + ) + } + } + + get("/signin"){ + val redirect = params.get("redirect") + if(redirect.isDefined && redirect.get.startsWith("/")){ + flash += Keys.Flash.Redirect -> redirect.get + } + html.signin() + } + + post("/signin", form){ form => + authenticate(context.settings, form.userName, form.password) match { + case Some(account) => signin(account) + case None => redirect("/signin") + } + } + + get("/signout"){ + session.invalidate + redirect("/") + } + + get("/activities.atom"){ + contentType = "application/atom+xml; type=feed" + helper.xml.feed(getRecentActivities()) + } + + /** + * Set account information into HttpSession and redirect. + */ + private def signin(account: model.Account) = { + session.setAttribute(Keys.Session.LoginAccount, account) + updateLastLoginDate(account.userName) + + flash.get(Keys.Flash.Redirect).asInstanceOf[Option[String]].map { redirectUrl => + if(redirectUrl.stripSuffix("/") == request.getContextPath){ + redirect("/") + } else { + redirect(redirectUrl) + } + }.getOrElse { + redirect("/") + } + } + + /** + * JSON API for collaborator completion. + * + * TODO Move to other controller? + */ + get("/_user/proposals")(usersOnly { + contentType = formats("json") + org.json4s.jackson.Serialization.write( + Map("options" -> getAllUsers().filter(!_.isGroupAccount).map(_.userName).toArray) + ) + }) + + +} diff --git a/src/main/scala/service/ActivityService.scala b/src/main/scala/service/ActivityService.scala index 64fbb4e..34a0105 100644 --- a/src/main/scala/service/ActivityService.scala +++ b/src/main/scala/service/ActivityService.scala @@ -3,6 +3,7 @@ import model._ import scala.slick.driver.H2Driver.simple._ import Database.threadLocalSession +import util.JGitUtil.RepositoryInfo trait ActivityService { @@ -24,12 +25,20 @@ def getRecentActivities(): List[Activity] = Activities .innerJoin(Repositories).on((t1, t2) => t1.byRepository(t2.userName, t2.repositoryName)) - .filter { case (t1, t2) => t2.isPrivate is false.bind } + .filter { case (t1, t2) => t2.isPrivate is false.bind } .sortBy { case (t1, t2) => t1.activityId desc } .map { case (t1, t2) => t1 } .take(30) .list + def getRecentActivitiesByUser(loginUserName : String): List[Activity] = + Activities + .innerJoin(Repositories).on((t1, t2) => t1.byRepository(t2.userName, t2.repositoryName)) + .filter { case (t1, t2) => (t2.isPrivate is false.bind) || (t2.userName is loginUserName.bind) } + .sortBy { case (t1, t2) => t1.activityId desc } + .map { case (t1, t2) => t1 } + .take(30) + .list def recordCreateRepositoryActivity(userName: String, repositoryName: String, activityUserName: String): Unit = Activities.autoInc insert(userName, repositoryName, activityUserName,