package com.hubspot.blazar.resources;
import java.util.Set;
import javax.inject.Inject;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.NotFoundException;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import com.google.common.base.Optional;
import com.hubspot.blazar.base.BuildOptions;
import com.hubspot.blazar.base.BuildTrigger;
import com.hubspot.blazar.base.GitInfo;
import com.hubspot.blazar.base.ModuleBuild;
import com.hubspot.blazar.base.RepositoryBuild;
import com.hubspot.blazar.data.service.BranchService;
import com.hubspot.blazar.data.service.ModuleBuildService;
import com.hubspot.blazar.data.service.RepositoryBuildService;
import com.hubspot.blazar.data.service.StateService;
@Path("/branches/builds")
@Produces(MediaType.APPLICATION_JSON)
public class RepositoryBuildResource {
private final RepositoryBuildService repositoryBuildService;
private final ModuleBuildService moduleBuildService;
private StateService stateService;
private final BranchService branchService;
@Inject
public RepositoryBuildResource(RepositoryBuildService repositoryBuildService,
ModuleBuildService moduleBuildService,
StateService stateService,
BranchService branchService) {
this.repositoryBuildService = repositoryBuildService;
this.moduleBuildService = moduleBuildService;
this.stateService = stateService;
this.branchService = branchService;
}
@POST
@Path("/branch/{id}")
@Consumes(MediaType.APPLICATION_JSON)
public RepositoryBuild triggerWithOptions(@PathParam("id") int branchId, BuildOptions buildOptions, @QueryParam("username") Optional<String> username) {
Optional<GitInfo> gitInfo = branchService.get(branchId);
if (!gitInfo.isPresent()) {
throw new NotFoundException("No branch found with id: " + branchId);
}
BuildTrigger buildTrigger = BuildTrigger.forUser(username.or("unknown"));
long repositoryBuildId = repositoryBuildService.enqueue(gitInfo.get(), buildTrigger, buildOptions);
return repositoryBuildService.get(repositoryBuildId).get();
}
@GET
@Path("/{id}")
public Optional<RepositoryBuild> get(@PathParam("id") long repositoryBuildId) {
return repositoryBuildService.get(repositoryBuildId);
}
@GET
@Path("/{id}/modules")
public Set<ModuleBuild> getModuleBuilds(@PathParam("id") long repositoryBuildId) {
return moduleBuildService.getByRepositoryBuild(repositoryBuildId);
}
@POST
@Path("/{id}/cancel")
public void cancel(@PathParam("id") long repositoryBuildId) {
Optional<RepositoryBuild> build = get(repositoryBuildId);
if (!build.isPresent()) {
throw new NotFoundException("No build found for id: " + repositoryBuildId);
}
repositoryBuildService.cancel(build.get());
}
}