package controllers; import common.controllers.ControllerDependency; import common.controllers.SunriseController; import io.sphere.sdk.products.search.ProductProjectionSearch; import org.apache.commons.io.IOUtils; import play.Application; import play.libs.F; import play.mvc.Http; import play.mvc.Result; import javax.inject.Inject; import javax.inject.Singleton; import java.io.IOException; import java.nio.charset.StandardCharsets; /** * Controller for health report. */ @Singleton public class StatusController extends SunriseController { private final Application application; @Inject public StatusController(final ControllerDependency controllerDependency, final Application application) { super(controllerDependency); this.application = application; } public Result version() throws IOException { final String jsonString = IOUtils.toString(application.resourceAsStream("internal/version.json"), StandardCharsets.UTF_8); return ok(jsonString).as(Http.MimeTypes.JSON); } public F.Promise<Result> health() throws IOException { return sphere().execute(ProductProjectionSearch.ofCurrent().withLimit(1)) .map(result -> { final boolean ok = !result.getResults().isEmpty(); if (!ok) { throw new RuntimeException("cannot fetch any product"); } return ok("{\n" + " \"self\" : {\n" + " \"healthy\" : true\n" + " }\n" + "}"); }) .recover(e -> status(Http.Status.SERVICE_UNAVAILABLE, "{\n" + " \"self\" : {\n" + " \"healthy\" : false\n" + " }\n" + "}")) .map(r -> r.as(Http.MimeTypes.JSON)); } }