Newer
Older
gitbucket_jkp / src / main / scala / service / WebHookService.scala
@takezoe takezoe on 14 Sep 2013 2 KB Add ExecutionContext for Future.
package service

import scala.slick.driver.H2Driver.simple._
import Database.threadLocalSession

import model._
import org.slf4j.LoggerFactory

trait WebHookService {
  import WebHookService._

  private val logger = LoggerFactory.getLogger(classOf[WebHookService])

  def getWebHookURLs(owner: String, repository: String): List[WebHook] =
    Query(WebHooks).filter(_.byRepository(owner, repository)).sortBy(_.url).list

  def addWebHookURL(owner: String, repository: String, url :String): Unit =
    WebHooks.insert(WebHook(owner, repository, url))

  def deleteWebHookURL(owner: String, repository: String, url :String): Unit =
    Query(WebHooks).filter(_.byPrimaryKey(owner, repository, url)).delete

  def callWebHook(owner: String, repository: String, payload: WebHookPayload): Unit = {
    import org.json4s._
    import org.json4s.jackson.Serialization
    import org.json4s.jackson.Serialization.{read, write}
    import org.apache.http.client.methods.HttpPost
    import org.apache.http.impl.client.DefaultHttpClient
    import scala.concurrent._
    import ExecutionContext.Implicits.global

    implicit val formats = Serialization.formats(NoTypeHints)

    val webHookURLs = getWebHookURLs(owner, repository)

    if(webHookURLs.nonEmpty){
      val json = write(payload)
      val httpClient = new DefaultHttpClient()

      webHookURLs.foreach { webHookUrl =>
        val f = future {
          val httpPost = new HttpPost(webHookUrl.url)
          httpPost.getParams.setParameter("payload", json)
          httpClient.execute(httpPost)
          httpPost.releaseConnection()
        }
        f.onSuccess {
          case s => logger.debug(s"Success: web hook request to ${webHookUrl.url}")
        }
        f.onFailure {
          case t => logger.error(s"Failed: web hook request to ${webHookUrl.url}", t)
        }
      }
    }
  }

}

object WebHookService {

  case class WebHookPayload(
    ref: String,
    commits: List[WebHookCommit],
    repository: WebHookRepository)

  case class WebHookCommit(
    id: String,
    message: String,
    timestamp: String,
    url: String,
    added: List[String],
    removed: List[String],
    modified: List[String],
    author: WebHookUser)

  case class WebHookRepository(
    name: String,
    url: String,
    description: String,
    watchers: Int,
    forks: Int,
    `private`: Boolean,
    owner: WebHookUser)

  case class WebHookUser(
    name: String,
    email: String)

}