package sagan.projects.support;
import sagan.projects.Project;
import sagan.projects.ProjectRelease;
import sagan.support.JsonPController;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import static org.springframework.web.bind.annotation.RequestMethod.*;
/**
* Controller that handles ajax requests for project metadata, typically from the
* individual Spring project pages managed via GitHub's "GH Pages" infrastructure at
* http://projects.spring.io. See https://github.com/spring-projects/gh-pages#readme for
* more information.
*/
@JsonPController
@RequestMapping("/project_metadata")
class ProjectMetadataController {
private final ProjectMetadataService service;
@Autowired
public ProjectMetadataController(ProjectMetadataService service) {
this.service = service;
}
@RequestMapping(value = "/{projectId}", method = { GET, HEAD })
public Project projectMetadata(@PathVariable("projectId") String projectId) throws IOException {
Project project = service.getProject(projectId);
return project;
}
@RequestMapping(value = "/{projectId}/releases/{version:.*}", method = GET)
public ProjectRelease releaseMetadata(@PathVariable("projectId") String projectId,
@PathVariable("version") String version) throws IOException {
Project project = service.getProject(projectId);
if (project == null) {
throw new MetadataNotFoundException("Cannot find project " + projectId);
}
ProjectRelease release = project.getProjectRelease(version);
if (release == null) {
throw new MetadataNotFoundException("Could not find " + version + " for " + projectId);
}
return release.createWithVersionPattern();
}
@RequestMapping(value = "/{projectId}/releases", method = GET)
public List<ProjectRelease> releaseMetadata(@PathVariable("projectId") String projectId) throws IOException {
Project project = service.getProject(projectId);
if (project == null) {
throw new MetadataNotFoundException("Cannot find project " + projectId);
}
List<ProjectRelease> releases = new ArrayList<>();
for (ProjectRelease release : project.getProjectReleases()) {
releases.add(release.createWithVersionPattern());
}
return releases;
}
@RequestMapping(value = "/{projectId}/releases", method = PUT)
public Project updateProjectMetadata(@PathVariable("projectId") String projectId,
@RequestBody List<ProjectRelease> releases)
throws IOException {
Project project = service.getProject(projectId);
for (ProjectRelease release : releases) {
project.updateProjectRelease(release);
}
service.save(project);
return project;
}
@RequestMapping(value = "/{projectId}/releases", method = POST)
public ProjectRelease updateReleaseMetadata(@PathVariable("projectId") String projectId,
@RequestBody ProjectRelease release) throws IOException {
Project project = service.getProject(projectId);
if (project == null) {
throw new MetadataNotFoundException("Cannot find project " + projectId);
}
boolean found = project.updateProjectRelease(release);
if (found) {
service.save(project);
}
return release;
}
@RequestMapping(value = "/{projectId}/releases/{version:.*}", method = DELETE)
public ProjectRelease removeReleaseMetadata(@PathVariable("projectId") String projectId,
@PathVariable("version") String version) throws IOException {
Project project = service.getProject(projectId);
if (project == null) {
throw new MetadataNotFoundException("Cannot find project " + projectId);
}
ProjectRelease found = project.removeProjectRelease(version);
if (found == null) {
throw new MetadataNotFoundException("Could not find " + version + " for " + projectId);
}
service.save(project);
return found;
}
@ExceptionHandler(MetadataNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public void handle() {
}
static class MetadataNotFoundException extends RuntimeException {
public MetadataNotFoundException(String string) {
super(string);
}
}
}