mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-02 11:36:05 +01:00
(refs #3)Separate search actions to SearchController.
This commit is contained in:
@@ -5,6 +5,7 @@ import javax.servlet._
|
|||||||
class ScalatraBootstrap extends LifeCycle {
|
class ScalatraBootstrap extends LifeCycle {
|
||||||
override def init(context: ServletContext) {
|
override def init(context: ServletContext) {
|
||||||
context.mount(new IndexController, "/")
|
context.mount(new IndexController, "/")
|
||||||
|
context.mount(new SearchController, "/")
|
||||||
context.mount(new FileUploadController, "/upload")
|
context.mount(new FileUploadController, "/upload")
|
||||||
context.mount(new SignInController, "/*")
|
context.mount(new SignInController, "/*")
|
||||||
context.mount(new UserManagementController, "/*")
|
context.mount(new UserManagementController, "/*")
|
||||||
|
|||||||
@@ -6,20 +6,9 @@ import jp.sf.amateras.scalatra.forms._
|
|||||||
|
|
||||||
class IndexController extends IndexControllerBase
|
class IndexController extends IndexControllerBase
|
||||||
with RepositoryService with AccountService with SystemSettingsService with ActivityService
|
with RepositoryService with AccountService with SystemSettingsService with ActivityService
|
||||||
with RepositorySearchService with IssuesService
|
|
||||||
with ReferrerAuthenticator
|
|
||||||
|
|
||||||
trait IndexControllerBase extends ControllerBase { self: RepositoryService
|
trait IndexControllerBase extends ControllerBase { self: RepositoryService
|
||||||
with SystemSettingsService with ActivityService with RepositorySearchService
|
with SystemSettingsService with ActivityService =>
|
||||||
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)
|
|
||||||
|
|
||||||
get("/"){
|
get("/"){
|
||||||
val loginAccount = context.loginAccount
|
val loginAccount = context.loginAccount
|
||||||
@@ -31,31 +20,4 @@ trait IndexControllerBase extends ControllerBase { self: RepositoryService
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
51
src/main/scala/app/SearchController.scala
Normal file
51
src/main/scala/app/SearchController.scala
Normal file
@@ -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)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
@@ -255,7 +255,7 @@ trait IssuesService {
|
|||||||
(t.title.toLowerCase like (s"%${likeEncode(keyword)}%", '^')) ||
|
(t.title.toLowerCase like (s"%${likeEncode(keyword)}%", '^')) ||
|
||||||
(t.content.toLowerCase like (s"%${likeEncode(keyword)}%", '^'))
|
(t.content.toLowerCase like (s"%${likeEncode(keyword)}%", '^'))
|
||||||
} .reduceLeft(_ && _)
|
} .reduceLeft(_ && _)
|
||||||
}.map { t => (t, 0, t.content) }
|
}.map { t => (t, 0, t.content.?) }
|
||||||
|
|
||||||
// Search IssueComment
|
// Search IssueComment
|
||||||
val comments = Query(IssueComments).innerJoin(Issues).on { case (t1, t2) =>
|
val comments = Query(IssueComments).innerJoin(Issues).on { case (t1, t2) =>
|
||||||
@@ -264,7 +264,7 @@ trait IssuesService {
|
|||||||
keywords.map { query =>
|
keywords.map { query =>
|
||||||
t1.content.toLowerCase like (s"%${likeEncode(query)}%", '^')
|
t1.content.toLowerCase like (s"%${likeEncode(query)}%", '^')
|
||||||
}.reduceLeft(_ && _)
|
}.reduceLeft(_ && _)
|
||||||
}.map { case (t1, t2) => (t2, t1.commentId, t1.content) }
|
}.map { case (t1, t2) => (t2, t1.commentId, t1.content.?) }
|
||||||
|
|
||||||
def getCommentCount(issue: Issue): Int = {
|
def getCommentCount(issue: Issue): Int = {
|
||||||
Query(IssueComments)
|
Query(IssueComments)
|
||||||
@@ -282,7 +282,7 @@ trait IssuesService {
|
|||||||
issue1.issueId == issue2.issueId
|
issue1.issueId == issue2.issueId
|
||||||
}.map { result =>
|
}.map { result =>
|
||||||
val (issue, _, content) = result.head
|
val (issue, _, content) = result.head
|
||||||
(issue, getCommentCount(issue) , content)
|
(issue, getCommentCount(issue) , content.getOrElse(""))
|
||||||
}.toList
|
}.toList
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,9 @@
|
|||||||
<div class="block">
|
<div class="block">
|
||||||
<div class="pull-right muted">#@issue.issueId</div>
|
<div class="pull-right muted">#@issue.issueId</div>
|
||||||
<h4 style="margin-top: 0px;"><a href="@url(repository)/issues/@issue.issueId">@issue.title</a></h4>
|
<h4 style="margin-top: 0px;"><a href="@url(repository)/issues/@issue.issueId">@issue.title</a></h4>
|
||||||
<pre>@Html(issue.highlightText)</pre>
|
@if(issue.highlightText.nonEmpty){
|
||||||
|
<pre>@Html(issue.highlightText)</pre>
|
||||||
|
}
|
||||||
<div class="small muted">
|
<div class="small muted">
|
||||||
Opened by <a href="@url(issue.openedUserName)" class="username">@issue.openedUserName</a>
|
Opened by <a href="@url(issue.openedUserName)" class="username">@issue.openedUserName</a>
|
||||||
at @datetime(issue.registeredDate)
|
at @datetime(issue.registeredDate)
|
||||||
|
|||||||
Reference in New Issue
Block a user