Implementing conditional issue searching.

This commit is contained in:
takezoe
2013-06-25 21:41:23 +09:00
parent ac3415f641
commit f335d30ac7
4 changed files with 38 additions and 23 deletions

View File

@@ -27,26 +27,15 @@ trait IssuesControllerBase extends ControllerBase {
)(CommentForm.apply) )(CommentForm.apply)
get("/:owner/:repository/issues"){ get("/:owner/:repository/issues"){
val owner = params("owner") searchIssues("all")
val repository = params("repository")
searchIssues(owner, repository, "all", None)
} }
get("/:owner/:repository/issues/assigned/:userName"){ get("/:owner/:repository/issues/assigned/:userName"){
val owner = params("owner") searchIssues("assigned")
val repository = params("repository")
val userName = params("userName")
searchIssues(owner, repository, "assigned", Some(userName))
} }
get("/:owner/:repository/issues/created_by/:userName"){ get("/:owner/:repository/issues/created_by/:userName"){
val owner = params("owner") searchIssues("created_by")
val repository = params("repository")
val userName = params("userName")
searchIssues(owner, repository, "created_by", Some(userName))
} }
get("/:owner/:repository/issues/:id"){ get("/:owner/:repository/issues/:id"){
@@ -85,7 +74,10 @@ trait IssuesControllerBase extends ControllerBase {
saveComment(owner, repository, context.loginAccount.get.userName, form.issueId, form.content))) saveComment(owner, repository, context.loginAccount.get.userName, form.issueId, form.content)))
}) })
private def searchIssues(owner: String, repository: String, filter: String, userName: Option[String]) = { private def searchIssues(filter: String) = {
val owner = params("owner")
val repository = params("repository")
val userName = if(filter != "all") Some(params("userName")) else None
val sessionKey = "%s/%s/issues".format(owner, repository) val sessionKey = "%s/%s/issues".format(owner, repository)
// retrieve search condition // retrieve search condition
@@ -96,7 +88,7 @@ trait IssuesControllerBase extends ControllerBase {
session.put(sessionKey, condition) session.put(sessionKey, condition)
getRepository(owner, repository, baseUrl).map { repositoryInfo => getRepository(owner, repository, baseUrl).map { repositoryInfo =>
issues.html.issues(searchIssue(owner, repository, condition.state == "closed"), issues.html.issues(searchIssue(owner, repository, condition, filter, userName),
getLabels(owner, repository), getLabels(owner, repository),
getMilestones(owner, repository).filter(_.closedDate.isEmpty), getMilestones(owner, repository).filter(_.closedDate.isEmpty),
condition, filter, repositoryInfo, isWritable(owner, repository, context.loginAccount)) condition, filter, repositoryInfo, isWritable(owner, repository, context.loginAccount))

View File

@@ -7,8 +7,11 @@ import Q.interpolation
import model._ import model._
import Issues._ import Issues._
import util.Implicits._
trait IssuesService { trait IssuesService {
import IssuesService._
def getIssue(owner: String, repository: String, issueId: String) = def getIssue(owner: String, repository: String, issueId: String) =
if (issueId forall (_.isDigit)) if (issueId forall (_.isDigit))
Query(Issues) filter { t => Query(Issues) filter { t =>
@@ -25,13 +28,26 @@ trait IssuesService {
(t.issueId is issueId.bind) (t.issueId is issueId.bind)
} list } list
def searchIssue(owner: String, repository: String, def searchIssue(owner: String, repository: String, condition: IssueSearchCondition, filter: String, userName: Option[String]) =
// TODO It is better to have a DTO
closed: Boolean) =
Query(Issues) filter { t => Query(Issues) filter { t =>
(t.userName is owner.bind) && (t.userName is owner.bind) &&
(t.repositoryName is repository.bind) && (t.repositoryName is repository.bind) &&
(t.closed is closed.bind) (t.closed is (condition.state == "closed").bind) &&
(t.milestoneId is condition.milestoneId.get.bind, condition.milestoneId.isDefined) &&
//if(condition.labels.nonEmpty) Some(Query(Issue)) else None,
(t.assignedUserName is userName.get.bind, filter == "assigned") &&
(t.openedUserName is userName.get.bind, filter == "created_by")
} sortBy { t =>
(condition.sort match {
case "created" => t.registeredDate
case "comments" => t.updatedDate
case "updated" => t.updatedDate
}) match {
case sort => condition.direction match {
case "asc" => sort asc
case "desc" => sort desc
}
}
} list } list
def saveIssue(owner: String, repository: String, loginUser: String, def saveIssue(owner: String, repository: String, loginUser: String,

View File

@@ -1,6 +1,7 @@
package util package util
import twirl.api.Html import twirl.api.Html
import scala.slick.driver.H2Driver.simple._
/** /**
* Provides some usable implicit conversions. * Provides some usable implicit conversions.
@@ -29,4 +30,8 @@ object Implicits {
def mkHtml(separator: scala.xml.Elem) = Html(seq.mkString(separator.toString)) def mkHtml(separator: scala.xml.Elem) = Html(seq.mkString(separator.toString))
} }
implicit def extendsColumn(c1: Column[Boolean]) = new {
def &&(c2: => Column[Boolean], guard: => Boolean): Column[Boolean] = if(guard) c1 && c2 else c1
}
} }

View File

@@ -1,4 +1,6 @@
@(issues: List[model.Issue], labels: List[model.Label], milestones: List[model.Milestone], condition: service.IssuesService.IssueSearchCondition, filter: String, repository: service.RepositoryService.RepositoryInfo, isWritable: Boolean)(implicit context: app.Context) @(issues: List[model.Issue], labels: List[model.Label], milestones: List[model.Milestone],
condition: service.IssuesService.IssueSearchCondition, filter: String,
repository: service.RepositoryService.RepositoryInfo, isWritable: Boolean)(implicit context: app.Context)
@import context._ @import context._
@import view.helpers._ @import view.helpers._
@html.main("Issues - " + repository.owner + "/" + repository.name){ @html.main("Issues - " + repository.owner + "/" + repository.name){