package service
import scala.slick.driver.H2Driver.simple._
import Database.threadLocalSession
import model._
import Milestones._
trait MilestonesService {
def createMilestone(owner: String, repository: String,
title: String, description: Option[String], dueDate: Option[java.util.Date]) =
Milestones.autoInc insert (owner, repository, title, description, dueDate, None)
def updateMilestone(milestone: Milestone): Unit =
Query(Milestones)
.filter { m =>
(m.userName is milestone.userName.bind) &&
(m.repositoryName is milestone.repositoryName.bind) &&
(m.milestoneId is milestone.milestoneId.bind)
}
.map { m =>
m.title ~ m.description.? ~ m.dueDate.? ~ m.closedDate.?
}
.update (
milestone.title,
milestone.description,
milestone.dueDate,
milestone.closedDate)
def openMilestone(milestone: Milestone): Unit = updateMilestone(milestone.copy(closedDate = None))
def closeMilestone(milestone: Milestone): Unit = updateMilestone(milestone.copy(closedDate = Some(currentDate)))
def deleteMilestone(owner: String, repository: String, milestoneId: Int): Unit = {
Query(Issues)
.filter { t =>
(t.userName is owner.bind) &&
(t.repositoryName is repository.bind) &&
(t.milestoneId is milestoneId.bind)
}
.map(_.milestoneId.?)
.update(None)
Query(Milestones)
.filter { t =>
(t.userName is owner.bind) &&
(t.repositoryName is repository.bind) &&
(t.milestoneId is milestoneId.bind)
}
.delete
}
def getMilestone(owner: String, repository: String, milestoneId: Int): Option[Milestone] =
Query(Milestones)
.filter { m =>
(m.userName is owner.bind) &&
(m.repositoryName is repository.bind) &&
(m.milestoneId is milestoneId.bind)
}
.sortBy(_.milestoneId desc)
.firstOption
def getMilestoneIssueCounts(owner: String, repository: String): Map[(Int, Boolean), Int] =
Issues
.filter { t =>
(t.userName is owner.bind) &&
(t.repositoryName is repository.bind) &&
(t.milestoneId isNotNull)
}
.groupBy { t =>
t.milestoneId ~ t.closed
}
.map { case (t1, t2) =>
t1._1 ~ t1._2 ~ t2.length
}
.list
.map { case (milestoneId, closed, count) =>
(milestoneId, closed) -> count
}
.toMap
def getMilestones(owner: String, repository: String): List[Milestone] =
Query(Milestones)
.filter { t =>
(t.userName is owner.bind) && (t.repositoryName is repository.bind)
}
.sortBy(_.milestoneId desc)
.list
}