Newer
Older
gitbucket_jkp / src / main / scala / app / IssuesController.scala
@takezoe takezoe on 25 Jun 2013 3 KB Fix typo.
package app

import jp.sf.amateras.scalatra.forms._

import service._
import IssuesService._
import util.UsersOnlyAuthenticator

class IssuesController extends IssuesControllerBase
  with IssuesService with RepositoryService with AccountService with LabelsService with MilestonesService
  with UsersOnlyAuthenticator

trait IssuesControllerBase extends ControllerBase {
  self: IssuesService with RepositoryService with LabelsService with MilestonesService
    with UsersOnlyAuthenticator =>

  case class IssueForm(title: String, content: Option[String])
  case class CommentForm(issueId: Int, content: String)

  val form = mapping(
      "title"   -> trim(label("Title", text(required))),
      "content" -> trim(optional(text()))
    )(IssueForm.apply)
  val commentForm = mapping(
      "issueId" -> label("Issue Id", number()),
      "content" -> trim(label("Comment", text(required)))
    )(CommentForm.apply)

  get("/:owner/:repository/issues"){
    val owner      = params("owner")
    val repository = params("repository")
    val condition  = IssueSearchCondition(request)

    println(condition)

    getRepository(owner, repository, baseUrl) match {
      case None => NotFound()
      case Some(repositoryInfo) => {
        // search condition
        val closed = params.get("state") collect {
          case "closed" => true
        } getOrElse false

        issues.html.issues(searchIssue(owner, repository, closed),
          getLabels(owner, repository),
          getMilestones(owner, repository).filter(_.closedDate.isEmpty),
          condition, repositoryInfo, isWritable(owner, repository, context.loginAccount))
      }
    }
  }

  get("/:owner/:repository/issues/:id"){
    val owner = params("owner")
    val repository = params("repository")
    val issueId = params("id")

    getIssue(owner, repository, issueId) map {
      issues.html.issue(
          _,
          getComment(owner, repository, issueId.toInt),
          getRepository(owner, repository, baseUrl).get)
    } getOrElse NotFound
  }

  // TODO requires users only and readable repository checking
  get("/:owner/:repository/issues/new")( usersOnly {
    issues.html.issueedit(getRepository(params("owner"), params("repository"), baseUrl).get)
  })

  // TODO requires users only and readable repository checking
  post("/:owner/:repository/issues", form)( usersOnly { form =>
    val owner = params("owner")
    val repository = params("repository")

    redirect("/%s/%s/issues/%d".format(owner, repository,
        saveIssue(owner, repository, context.loginAccount.get.userName, form.title, form.content)))
  })

  // TODO requires users only and readable repository checking
  post("/:owner/:repository/issue_comments", commentForm)( usersOnly { form =>
    val owner = params("owner")
    val repository = params("repository")

    redirect("/%s/%s/issues/%d#comment-%d".format(owner, repository, form.issueId,
        saveComment(owner, repository, context.loginAccount.get.userName, form.issueId, form.content)))
  })

}