Newer
Older
GitBucket / src / main / scala / gitbucket / core / service / ReleaseService.scala
@KOUNOIKE Yuusuke KOUNOIKE Yuusuke on 16 Apr 2017 4 KB Add Release page. (close #607)
package gitbucket.core.service

import gitbucket.core.controller.Context
import gitbucket.core.model.{Account, Release, ReleaseAsset}
import gitbucket.core.util.StringUtil._
import gitbucket.core.util.Implicits._
import gitbucket.core.model.Profile.profile.blockingApi._
import gitbucket.core.model.Profile._
import gitbucket.core.model.Profile.profile._
import gitbucket.core.model.Profile.dateColumnType
import gitbucket.core.service.RepositoryService.RepositoryInfo

trait ReleaseService {
  self: AccountService with RepositoryService =>

  def createReleaseAsset(owner: String, repository: String, releaseId: Int, fileName: String, label: String, size: Long, loginAccount: Account)(implicit s: Session): Unit = {
    ReleaseAssets insert ReleaseAsset(
      owner,
      repository,
      releaseId,
      fileName,
      label,
      size,
      loginAccount.userName,
      currentDate,
      currentDate
    )
  }

  def getReleaseAssets(owner: String, repository: String, releaseId: Int)(implicit s: Session): List[ReleaseAsset] = {
    ReleaseAssets.filter(x => x.byRelease(owner, repository, releaseId)).list
  }

  def getReleaseAssets(owner: String, repository: String, releaseId: String)(implicit s: Session): List[ReleaseAsset] = {
    if (isInteger(releaseId))
      getReleaseAssets(owner, repository, releaseId.toInt)
    else
      List.empty
  }

  def getReleaseAssetsMap(owner: String, repository: String)(implicit s: Session): Map[Release, List[ReleaseAsset]] = {
    val releases = getReleases(owner, repository)
    releases.map(rel => (rel -> getReleaseAssets(owner, repository, rel.releaseId))).toMap
  }

  def getReleaseAsset(owner: String, repository: String, releaseId: String, fileId: String)(implicit s: Session): Option[ReleaseAsset] = {
    if (isInteger(releaseId))
      ReleaseAssets.filter(x => x.byPrimaryKey(owner, repository, releaseId.toInt, fileId)) firstOption
    else None
  }

  def deleteReleaseAssets(owner: String, repository: String, releaseId: Int)(implicit s: Session): Unit = {
    ReleaseAssets.filter(x => x.byRelease(owner, repository, releaseId)) delete
  }

  def createRelease(repository: RepositoryInfo, name: String, content:Option[String], tag: String,
    isDraft: Boolean, isPrerelease: Boolean, loginAccount: Account)(implicit context: Context, s: Session): Release = {
    val releaseId = insertRelease(repository.owner, repository.name, loginAccount.userName, name, tag,
    content, isDraft, isPrerelease)
    val release = getRelease(repository.owner, repository.name, releaseId.toString).get
    release
  }

  def getReleases(owner: String, repository: String)(implicit s: Session): List[Release] = {
    Releases.filter(x => x.byRepository(owner, repository)).list
  }

  def getRelease(owner: String, repository: String, releaseId: Int)(implicit s: Session): Option[Release] = {
    Releases filter (_.byPrimaryKey(owner, repository, releaseId)) firstOption
  }

  def getRelease(owner: String, repository: String, releaseId: String)(implicit s: Session): Option[Release] = {
    if (isInteger(releaseId))
      getRelease(owner, repository, releaseId.toInt)
    else None
  }

  def getReleaseTagMap(owner: String, repository: String)(implicit s: Session): Map[String, Release] = {
    val releases = getReleases(owner, repository)
    releases.map(rel => (rel.tag -> rel)).toMap
  }

  def insertRelease(owner: String, repository: String, loginUser: String, name: String, tag: String,
    content: Option[String], isDraft: Boolean, isPrerelease: Boolean)(implicit s: Session): Int = {
    // next id number
    val id = sql"SELECT RELEASE_ID + 1 FROM RELEASE_ID WHERE USER_NAME = $owner AND REPOSITORY_NAME = $repository FOR UPDATE".as[Int]
      .firstOption.getOrElse(1)
    Releases insert Release(
      owner,
      repository,
      id,
      name,
      tag,
      loginUser,
      content,
      isDraft,
      isPrerelease,
      currentDate,
      currentDate
    )

    // increment issue id
    if (id > 1){
      ReleaseId
        .filter(_.byPrimaryKey(owner, repository))
        .map(_.releaseId)
        .update(id) > 0
    }else{
      ReleaseId.insert(owner, repository, id)
    }

    id
  }

  def updateRelease(owner: String, repository: String, releaseId: Int, title: String, content: Option[String])(implicit s: Session): Int = {
    Releases
      .filter (_.byPrimaryKey(owner, repository, releaseId))
      .map { t => (t.name, t.content, t.updatedDate) }
      .update (title, content, currentDate)
  }

  def deleteRelease(owner: String, repository: String, releaseId: String)(implicit s: Session): Unit = {
    if (isInteger(releaseId)){
      val relId = releaseId.toInt
      deleteReleaseAssets(owner, repository, relId)
      Releases filter (_.byPrimaryKey(owner, repository, relId)) delete
    }
  }
}