package app import jp.sf.amateras.scalatra.forms._ import service._ import util.{CollaboratorsAuthenticator, ReferrerAuthenticator, UsersAuthenticator} class MilestonesController extends MilestonesControllerBase with MilestonesService with RepositoryService with AccountService with ReferrerAuthenticator with CollaboratorsAuthenticator trait MilestonesControllerBase extends ControllerBase { self: MilestonesService with RepositoryService with ReferrerAuthenticator with CollaboratorsAuthenticator => case class MilestoneForm(title: String, description: Option[String], dueDate: Option[java.util.Date]) val milestoneForm = mapping( "title" -> trim(label("Title", text(required, maxlength(100)))), "description" -> trim(label("Description", optional(text()))), "dueDate" -> trim(label("Due Date", optional(date()))) )(MilestoneForm.apply) get("/:owner/:repository/issues/milestones")(referrersOnly { repository => issues.milestones.html.list( params.getOrElse("state", "open"), getMilestonesWithIssueCount(repository.owner, repository.name), repository, hasWritePermission(repository.owner, repository.name, context.loginAccount)) }) get("/:owner/:repository/issues/milestones/new")(collaboratorsOnly { issues.milestones.html.edit(None, _) }) post("/:owner/:repository/issues/milestones/new", milestoneForm)(collaboratorsOnly { (form, repository) => createMilestone(repository.owner, repository.name, form.title, form.description, form.dueDate) redirect(s"/${repository.owner}/${repository.name}/issues/milestones") }) get("/:owner/:repository/issues/milestones/:milestoneId/edit")(collaboratorsOnly { repository => issues.milestones.html.edit(getMilestone(repository.owner, repository.name, params("milestoneId").toInt), repository) }) post("/:owner/:repository/issues/milestones/:milestoneId/edit", milestoneForm)(collaboratorsOnly { (form, repository) => getMilestone(repository.owner, repository.name, params("milestoneId").toInt).map { milestone => updateMilestone(milestone.copy(title = form.title, description = form.description, dueDate = form.dueDate)) redirect(s"/${repository.owner}/${repository.name}/issues/milestones") } getOrElse NotFound }) get("/:owner/:repository/issues/milestones/:milestoneId/close")(collaboratorsOnly { repository => getMilestone(repository.owner, repository.name, params("milestoneId").toInt).map { milestone => closeMilestone(milestone) redirect(s"/${repository.owner}/${repository.name}/issues/milestones") } getOrElse NotFound }) get("/:owner/:repository/issues/milestones/:milestoneId/open")(collaboratorsOnly { repository => getMilestone(repository.owner, repository.name, params("milestoneId").toInt).map { milestone => openMilestone(milestone) redirect(s"/${repository.owner}/${repository.name}/issues/milestones") } getOrElse NotFound }) get("/:owner/:repository/issues/milestones/:milestoneId/delete")(collaboratorsOnly { repository => getMilestone(repository.owner, repository.name, params("milestoneId").toInt).map { milestone => deleteMilestone(repository.owner, repository.name, milestone.milestoneId) redirect(s"/${repository.owner}/${repository.name}/issues/milestones") } getOrElse NotFound }) }