diff --git a/src/main/scala/ScalatraBootstrap.scala b/src/main/scala/ScalatraBootstrap.scala index f84c99c..0a24e73 100644 --- a/src/main/scala/ScalatraBootstrap.scala +++ b/src/main/scala/ScalatraBootstrap.scala @@ -5,6 +5,7 @@ class ScalatraBootstrap extends LifeCycle { override def init(context: ServletContext) { context.mount(new IndexController, "/") + context.mount(new SearchController, "/") context.mount(new FileUploadController, "/upload") context.mount(new SignInController, "/*") context.mount(new UserManagementController, "/*") diff --git a/src/main/scala/app/IndexController.scala b/src/main/scala/app/IndexController.scala index 664a55a..6857cbd 100644 --- a/src/main/scala/app/IndexController.scala +++ b/src/main/scala/app/IndexController.scala @@ -6,20 +6,9 @@ class IndexController extends IndexControllerBase with RepositoryService with AccountService with SystemSettingsService with ActivityService - with RepositorySearchService with IssuesService - with ReferrerAuthenticator trait IndexControllerBase extends ControllerBase { self: RepositoryService - with SystemSettingsService with ActivityService with RepositorySearchService - with ReferrerAuthenticator => - - val searchForm = mapping( - "query" -> trim(text(required)), - "owner" -> trim(text(required)), - "repository" -> trim(text(required)) - )(SearchForm.apply) - - case class SearchForm(query: String, owner: String, repository: String) + with SystemSettingsService with ActivityService => get("/"){ val loginAccount = context.loginAccount @@ -31,31 +20,4 @@ ) } - post("/search", searchForm){ form => - redirect(s"${form.owner}/${form.repository}/search?q=${StringUtil.urlEncode(form.query)}") - } - - get("/:owner/:repository/search")(referrersOnly { repository => - val query = params("q").trim - val target = params.getOrElse("type", "code") - val page = try { - val i = params.getOrElse("page", "1").toInt - if(i <= 0) 1 else i - } catch { - case e: NumberFormatException => 1 - } - - target.toLowerCase match { - case "issue" => search.html.issues( - searchIssues(repository.owner, repository.name, query), - countFiles(repository.owner, repository.name, query), - query, page, repository) - - case _ => search.html.code( - searchFiles(repository.owner, repository.name, query), - countIssues(repository.owner, repository.name, query), - query, page, repository) - } - }) - } diff --git a/src/main/scala/app/SearchController.scala b/src/main/scala/app/SearchController.scala new file mode 100644 index 0000000..38bf35a --- /dev/null +++ b/src/main/scala/app/SearchController.scala @@ -0,0 +1,51 @@ +package app + +import util._ +import service._ +import jp.sf.amateras.scalatra.forms._ + +class SearchController extends SearchControllerBase +with RepositoryService with AccountService with SystemSettingsService with ActivityService +with RepositorySearchService with IssuesService +with ReferrerAuthenticator + +trait SearchControllerBase extends ControllerBase { self: RepositoryService + with SystemSettingsService with ActivityService with RepositorySearchService + with ReferrerAuthenticator => + + val searchForm = mapping( + "query" -> trim(text(required)), + "owner" -> trim(text(required)), + "repository" -> trim(text(required)) + )(SearchForm.apply) + + case class SearchForm(query: String, owner: String, repository: String) + + post("/search", searchForm){ form => + redirect(s"${form.owner}/${form.repository}/search?q=${StringUtil.urlEncode(form.query)}") + } + + get("/:owner/:repository/search")(referrersOnly { repository => + val query = params("q").trim + val target = params.getOrElse("type", "code") + val page = try { + val i = params.getOrElse("page", "1").toInt + if(i <= 0) 1 else i + } catch { + case e: NumberFormatException => 1 + } + + target.toLowerCase match { + case "issue" => search.html.issues( + searchIssues(repository.owner, repository.name, query), + countFiles(repository.owner, repository.name, query), + query, page, repository) + + case _ => search.html.code( + searchFiles(repository.owner, repository.name, query), + countIssues(repository.owner, repository.name, query), + query, page, repository) + } + }) + +} diff --git a/src/main/scala/service/IssuesService.scala b/src/main/scala/service/IssuesService.scala index 8962609..c0f90e0 100644 --- a/src/main/scala/service/IssuesService.scala +++ b/src/main/scala/service/IssuesService.scala @@ -255,7 +255,7 @@ (t.title.toLowerCase like (s"%${likeEncode(keyword)}%", '^')) || (t.content.toLowerCase like (s"%${likeEncode(keyword)}%", '^')) } .reduceLeft(_ && _) - }.map { t => (t, 0, t.content) } + }.map { t => (t, 0, t.content.?) } // Search IssueComment val comments = Query(IssueComments).innerJoin(Issues).on { case (t1, t2) => @@ -264,7 +264,7 @@ keywords.map { query => t1.content.toLowerCase like (s"%${likeEncode(query)}%", '^') }.reduceLeft(_ && _) - }.map { case (t1, t2) => (t2, t1.commentId, t1.content) } + }.map { case (t1, t2) => (t2, t1.commentId, t1.content.?) } def getCommentCount(issue: Issue): Int = { Query(IssueComments) @@ -282,7 +282,7 @@ issue1.issueId == issue2.issueId }.map { result => val (issue, _, content) = result.head - (issue, getCommentCount(issue) , content) + (issue, getCommentCount(issue) , content.getOrElse("")) }.toList } diff --git a/src/main/twirl/search/issues.scala.html b/src/main/twirl/search/issues.scala.html index e56f042..7cd0cbf 100644 --- a/src/main/twirl/search/issues.scala.html +++ b/src/main/twirl/search/issues.scala.html @@ -17,7 +17,9 @@
#@issue.issueId

@issue.title

-
@Html(issue.highlightText)
+ @if(issue.highlightText.nonEmpty){ +
@Html(issue.highlightText)
+ }
Opened by @issue.openedUserName at @datetime(issue.registeredDate)