Newer
Older
gitbucket_jkp / src / main / scala / service / MilestonesService.scala
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
}