package org.rakam.ui; import org.rakam.server.http.annotations.ApiParam; import org.rakam.util.JsonHelper; import org.skife.jdbi.v2.Handle; import org.skife.jdbi.v2.tweak.ResultSetMapper; import javax.inject.Inject; import javax.inject.Named; import java.util.AbstractMap; import java.util.Locale; import java.util.Map; import java.util.stream.Collectors; //@Path("/ui/user-default") //@IgnoreApi public class UserDefaultService { @Inject public UserDefaultService() { } public Map<String, Object> getAll(Handle handle, @Named("user_id") UIPermissionParameterProvider.Project project) { return handle.createQuery("SELECT name, value FROM ui_user_defaults WHERE user_id = :user AND project_id = :project") .bind("project", project.project) .bind("user", project.userId) .map((ResultSetMapper<Map.Entry<String, Object>>) (index, r, ctx) -> new AbstractMap.SimpleImmutableEntry<>(r.getString(1), JsonHelper.read(r.getString(2), Object.class))) .list().stream().collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue())); } public <T> T get(Handle handle, @Named("user_id") UIPermissionParameterProvider.Project project, @ApiParam("name") String name) { return (T) handle.createQuery("SELECT value FROM ui_user_defaults WHERE user_id = :user AND project_id = :project AND name = :name") .bind("project", project.project) .bind("user", project.userId) .bind("name", name.toUpperCase(Locale.ENGLISH)) .map((index, r, ctx) -> { return JsonHelper.read(r.getString(1), Object.class); }).first(); } @ProtectEndpoint(writeOperation = true) public void set( Handle handle, @Named("user_id") UIPermissionParameterProvider.Project project, @ApiParam("name") String name, @ApiParam("value") Object value) { try { handle.createStatement("INSERT INTO ui_user_defaults (project_id, user_id, name, value) VALUES (:project, :user, :name, :value)") .bind("project", project.project) .bind("user", project.userId) .bind("name", name.toUpperCase(Locale.ENGLISH)) .bind("value", JsonHelper.encode(value)).execute(); } catch (Exception e) { handle.createStatement("UPDATE ui_user_defaults SET value = :value WHERE project_id = :project AND user_id = :user AND name = :name") .bind("project", project.project) .bind("user", project.userId) .bind("name", name.toUpperCase(Locale.ENGLISH)) .bind("value", JsonHelper.encode(value)).execute(); } } }