package setupwidget.controllers;
import play.Logger;
import setupwidget.models.SphereCredentials;
import play.Configuration;
import play.data.Form;
import play.libs.F;
import play.mvc.Controller;
import play.mvc.Result;
import setupwidget.views.html.setup;
import setupwidget.views.html.success;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.function.Supplier;
import static play.libs.F.Promise.pure;
@Singleton
public class SetupController extends Controller {
private static final Form<SphereCredentials> SPHERE_CREDENTIALS_FORM = Form.form(SphereCredentials.class);
private static final Path PATH = FileSystems.getDefault().getPath("conf", "dev.conf");
private final Configuration config;
private boolean setupComplete;
@Inject
public SetupController(final Configuration config) {
this.config = config;
this.setupComplete = doesConfigFileExist();
}
public F.Promise<Result> handleOrFallback(final Supplier<F.Promise<Result>> fallback) {
final boolean isWidgetActionsRequired = isSettingsWidgetEnabled() && !isSetupComplete();
return isWidgetActionsRequired ? pure(renderForm()) : fallback.get();
}
public Result renderForm() {
return onWidgetEnabled(() -> ok(setup.render(SPHERE_CREDENTIALS_FORM)));
}
public Result processForm() {
return onWidgetEnabled(() -> {
final Form<SphereCredentials> boundForm = SPHERE_CREDENTIALS_FORM.bindFromRequest();
final Result result;
if (boundForm.hasErrors()) {
result = badRequest(setup.render(boundForm));
} else {
final SphereCredentials credentials = boundForm.get();
final String content = String.format("sphere.project=%s\n" +
"sphere.clientId=%s\n" +
"sphere.clientSecret=%s\n",
credentials.getProjectKey(), credentials.getClientId(), credentials.getClientSecret());
writeSettingsFile(content);
result = ok(success.render(PATH.toString()));
}
return result;
});
}
private Result onWidgetEnabled(final Supplier<Result> action) {
return isSettingsWidgetEnabled() ? action.get() : notFound();
}
private static void writeSettingsFile(String content) {
try {
Files.write(PATH, content.getBytes());
Logger.info("SPHERE.IO credentials saved in " + PATH.toString());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private boolean isSettingsWidgetEnabled() {
return config.getBoolean("application.settingsWidget.enabled", true);
}
private boolean isSetupComplete() {
if (!setupComplete) {
setupComplete = doesConfigFileExist();
Logger.debug("Setup is completed: " + setupComplete);
}
return setupComplete;
}
private boolean doesConfigFileExist() {
return Files.exists(PATH);
}
}