package se.bjurr.prnfb.presentation;
import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
import static javax.ws.rs.core.Response.noContent;
import static javax.ws.rs.core.Response.ok;
import static javax.ws.rs.core.Response.status;
import static javax.ws.rs.core.Response.Status.UNAUTHORIZED;
import static se.bjurr.prnfb.transformer.SettingsTransformer.toDto;
import static se.bjurr.prnfb.transformer.SettingsTransformer.toPrnfbSettingsData;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
import com.atlassian.annotations.security.XsrfProtectionExcluded;
import com.google.common.base.Optional;
import se.bjurr.prnfb.presentation.dto.SettingsDataDTO;
import se.bjurr.prnfb.service.SettingsService;
import se.bjurr.prnfb.service.UserCheckService;
import se.bjurr.prnfb.settings.PrnfbSettingsData;
import se.bjurr.prnfb.settings.Restricted;
@Path("/settings")
public class SettingsDataServlet {
private final SettingsService settingsService;
private final UserCheckService userCheckService;
public SettingsDataServlet(UserCheckService userCheckService, SettingsService settingsService) {
this.userCheckService = userCheckService;
this.settingsService = settingsService;
}
@GET
@Produces(APPLICATION_JSON)
public Response get() {
if (!this.userCheckService.isViewAllowed()) {
return status(UNAUTHORIZED).build();
}
PrnfbSettingsData settingsData = this.settingsService.getPrnfbSettingsData();
SettingsDataDTO settingsDataDto = toDto(settingsData);
return ok(settingsDataDto).build();
}
@POST
@XsrfProtectionExcluded
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON)
public Response post(SettingsDataDTO settingsDataDto) {
if (!this.userCheckService.isAdminAllowed(
new Restricted() {
@Override
public Optional<String> getRepositorySlug() {
return Optional.absent();
}
@Override
public Optional<String> getProjectKey() {
return Optional.absent();
}
})) {
return status(UNAUTHORIZED).build();
}
PrnfbSettingsData prnfbSettingsData = toPrnfbSettingsData(settingsDataDto);
this.settingsService.setPrnfbSettingsData(prnfbSettingsData);
return noContent().build();
}
}