package service import scala.slick.driver.H2Driver.simple._ import Database.threadLocalSession import scala.slick.jdbc.{StaticQuery => Q} import Q.interpolation import model._ import Issues._ trait IssuesService { def getIssue(owner: String, repository: String, issueId: String) = if (issueId forall (_.isDigit)) Query(Issues) filter { t => (t.userName is owner.bind) && (t.repositoryName is repository.bind) && (t.issueId is issueId.toInt.bind) } firstOption else None def getComment(owner: String, repository: String, issueId: Int) = Query(IssueComments) filter { t => (t.userName is owner.bind) && (t.repositoryName is repository.bind) && (t.issueId is issueId.bind) } list def searchIssue(owner: String, repository: String, // TODO It is better to have a DTO closed: Boolean) = Query(Issues) filter { t => (t.userName is owner.bind) && (t.repositoryName is repository.bind) && (t.closed is closed.bind) } list def saveIssue(owner: String, repository: String, loginUser: String, title: String, content: Option[String]) = // next id number sql"SELECT ISSUE_ID + 1 FROM ISSUE_ID WHERE USER_NAME = $owner AND REPOSITORY_NAME = $repository FOR UPDATE".as[Int] .firstOption.filter { id => Issues insert Issue( owner, repository, id, loginUser, None, None, title, content, false, currentDate, currentDate) // increment issue id IssueId.filter { t => (t.userName is owner.bind) && (t.repositoryName is repository.bind) }.map(_.issueId).update(id) > 0 } get def saveComment(owner: String, repository: String, loginUser: String, issueId: Int, content: String) = IssueComments.autoInc insert ( owner, repository, issueId, loginUser, content, currentDate, currentDate) }