public static String encode(Object obj) { return encode(obj, false); }
@Override public void sync() { Event message = streamHolder.messageQueue.poll(); StringBuilder builder = new StringBuilder("["); boolean isFirst = true; while (message != null) { if (!isFirst) { builder.append(","); } builder.append("{\"project\":") .append(JsonHelper.encode(message.project())) .append(", \"collection\":") .append(JsonHelper.encode(message.collection())) .append(", \"properties\": ") .append(message.properties().toString()).append("}"); isFirst = false; message = streamHolder.messageQueue.poll(); } builder.append("]"); response.send("data", builder.toString()); }
@Path("/check-sentry") @GET public void checkSentry(RakamHttpRequest request) { request.response(JsonHelper.encode(checkSentry()), OK).end(); }
@Path("/check-configuration") @GET public void checkConfiguration(RakamHttpRequest request) { request.response(JsonHelper.encode(ImmutableMap.of( "sentry", checkSentry(), "scheduledEmailEnabled", config.getScreenCaptureService() != null, "disableTracking", config.getDisableTracking())), OK).end(); }
@Override public <T> void setConfig(String project, String configName, T value) { try (Handle handle = dbi.open()) { handle.createStatement("INSERT INTO config (project, name, value) VALUES (:project, :name, :value) ON DUPLICATE KEY UPDATE value = :value") .bind("project", project) .bind("name", configName.toUpperCase(Locale.ENGLISH)) .bind("value", JsonHelper.encode(value)).execute(); } } }
@Override public <T> void setConfig(String project, String configName, @NotNull T value) { dynamoDBClient.putItem(new PutItemRequest() .withTableName(tableConfig.getTableName()) .withItem(of( "project", new AttributeValue(project), "id", new AttributeValue(configName), "value", new AttributeValue(JsonHelper.encode(value))))); }
public void save(String project, ABTestingReport report) { if (report.id != -1) { throw new RakamException("Report already has an id.", HttpResponseStatus.BAD_REQUEST); } try (Handle handle = dbi.open()) { handle.createStatement("INSERT INTO ab_testing (project, name, variants, collection_name, connector_field, goals, options)" + " VALUES (:project, :name, :variants, :collection_name, :goals, :options)") .bind("project", project) .bind("name", report.name) .bind("collection_name", report.collectionName) .bind("variants", JsonHelper.encode(report.variants)) .bind("goals", JsonHelper.encode(ImmutableList.of(report.goal))) .bind("options", JsonHelper.encode(report.options, false)) .execute(); } catch (UnableToExecuteStatementException e) { if (e.getCause() instanceof SQLException && ((SQLException) e.getCause()).getSQLState().equals("23505")) { // TODO: replace throw new RakamException("Report already exists", HttpResponseStatus.BAD_REQUEST); } } }
@Override public <T> void setConfig(String project, String configName, T value) { try (Handle handle = dbi.open()) { try { handle.createStatement("INSERT INTO config (project, name, value) VALUES (:project, :name, :value)") .bind("project", project) .bind("name", configName.toUpperCase(Locale.ENGLISH)) .bind("value", JsonHelper.encode(value)).execute(); } catch (Exception e) { handle.createStatement("UPDATE config SET value = :value WHERE project = :project AND name = :name") .bind("project", project) .bind("name", configName.toUpperCase(Locale.ENGLISH)) .bind("value", JsonHelper.encode(value)).execute(); } } } }
@Override public <T> T setConfigOnce(String project, String configName, @NotNull T value) { try { dynamoDBClient.putItem(new PutItemRequest() .withTableName(tableConfig.getTableName()) .withExpected(of("id", new ExpectedAttributeValue(false), "project", new ExpectedAttributeValue(false))) .withItem(of( "project", new AttributeValue(project), "id", new AttributeValue(configName), "value", new AttributeValue(JsonHelper.encode(value))))); return value; } catch (Exception e) { return getConfig(project, configName, (Class<T>) value.getClass()); } }
@Override public void createMaterializedView(String project, MaterializedView materializedView) { dynamoDBClient.putItem(new PutItemRequest().withTableName(tableConfig.getTableName()) .withItem(of( "project", new AttributeValue(project), "type_table_name", new AttributeValue("materialized_" + materializedView.tableName), "value", new AttributeValue(JsonHelper.encode(materializedView))))); }
@ApiOperation(value = "Create custom event mapper", authorizations = @Authorization(value = "master_key") ) @Path("/create") @JsonRequest public long create(@Named("project") RequestContext context, @ApiParam("name") String name, @ApiParam("script") String script, @ApiParam(value = "image", required = false) String image, @ApiParam(value = "parameters", required = false) Map<String, Parameter> parameters) { try (Handle handle = dbi.open()) { GeneratedKeys<Long> longs = handle.createStatement("INSERT INTO custom_event_mappers (project, name, script, parameters, image) " + "VALUES (:project, :name, :script, :parameters, :image)") .bind("project", context.project) .bind("script", script) .bind("name", name) .bind("image", image) .bind("parameters", JsonHelper.encode(ofNullable(parameters).orElse(ImmutableMap.of()))) .executeAndReturnGeneratedKeys((index, r, ctx) -> r.getLong(1)); return longs.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(); } } }
public ABTestingReport update(String project, ABTestingReport report) { if (report.id == 1) { throw new RakamException("Report doesn't have an id.", HttpResponseStatus.BAD_REQUEST); } try (Handle handle = dbi.open()) { int execute = handle.createStatement("UPDATE reports SET name = :name, variants = :variants, collection_name = :collection_name, connector_field = :connector_field, goals = :goals, options = :options WHERE project = :project AND id = :id") .bind("project", project) .bind("id", report.id) .bind("variants", report.variants) .bind("connector_field", report.connectorField) .bind("collection_name", report.collectionName) .bind("goals", JsonHelper.encode(ImmutableList.of(report.goal))) .bind("options", JsonHelper.encode(report.options, false)) .execute(); if (execute == 0) { throw new RakamException("Report does not exist", HttpResponseStatus.BAD_REQUEST); } } return report; } }
@Override public void run() { boolean finished = query.isFinished(); if (response.isClosed() && !finished && killOnConnectionClose) { query.kill(); } else if (!finished) { if (!response.isClosed()) { QueryStats stats = query.currentStats(); response.send("stats", encode(stats)); if (stats.state == QueryStats.State.FINISHED) { return; } } eventLoopGroup.schedule(this, 500, TimeUnit.MILLISECONDS); } } }, 500, TimeUnit.MILLISECONDS);
@Override public void update(int project, CustomReport report) { int execute; try (Handle handle = dbi.open()) { execute = handle.createStatement("UPDATE custom_reports SET data = :data WHERE report_type = :reportType AND name = :name AND project_id = :project") .bind("reportType", report.reportType) .bind("project", project) .bind("name", report.name) .bind("data", JsonHelper.encode(report.data)).execute(); } if (execute == 0) { throw new RakamException("Report does not exist.", HttpResponseStatus.BAD_REQUEST); } }
@ApiOperation(value = "Create custom event mapper", authorizations = @Authorization(value = "master_key") ) @Path("/update") @JsonRequest public SuccessMessage update(@Named("project") RequestContext context, @BodyParam JSEventMapperCode mapper) { try (Handle handle = dbi.open()) { int execute = handle.createStatement("UPDATE custom_event_mappers SET script = :script, parameters = :parameters, image = :image " + "WHERE id = :id AND project = :project") .bind("project", context.project) .bind("id", mapper.id) .bind("image", mapper.image) .bind("parameters", JsonHelper.encode(mapper.parameters)) .bind("script", mapper.script).execute(); if (execute == 0) { throw new RakamException(NOT_FOUND); } return SuccessMessage.success(); } }
public void save(Integer user, int project, Page page) { try (Handle handle = dbi.open()) { handle.createStatement("INSERT INTO custom_page (project_id, name, slug, category, data, user_id) VALUES (:project, :name, :slug, :category, :data, :user)") .bind("project", project) .bind("name", page.name) .bind("slug", page.slug) .bind("category", page.category) .bind("user", user) .bind("data", JsonHelper.encode(page.files)).execute(); } catch (Exception e) { // TODO move it to transaction if (get(project, page.slug) != null) { throw new AlreadyExistsException(String.format("Custom page %s", page.slug), BAD_REQUEST); } throw e; } }
@Override public void alter(String project, MaterializedView view) { try (Handle handle = dbi.open()) { int execute = handle.createStatement("UPDATE materialized_views SET query = :query, table_name = :table_name, update_interval = :update_interval, incremental = :incremental, real_time = :real_time, options = :options " + "WHERE project = :project AND table_name = :table_name") .bind("project", project) .bind("name", view.name) .bind("table_name", view.tableName) .bind("query", view.query) .bind("update_interval", view.updateInterval != null ? view.updateInterval.toMillis() : null) .bind("incremental", view.incremental) .bind("real_time", view.realTime) .bind("options", JsonHelper.encode(view.options)) .execute(); if (execute == 0) { throw new NotExistsException("Materialized view"); } } }
@Override public void save(Integer user, int project, CustomReport report) { try (Handle handle = dbi.open()) { handle.createStatement("INSERT INTO custom_reports (report_type, project_id, name, data, user_id) VALUES (:reportType, :project, :name, :data, :user)") .bind("reportType", report.reportType) .bind("project", project) .bind("name", report.name) .bind("user", user) .bind("data", JsonHelper.encode(report.data)).execute(); } catch (Exception e) { // TODO move it to transaction if (get(report.reportType, project, report.name) != null) { throw new AlreadyExistsException("Custom report", HttpResponseStatus.BAD_REQUEST); } throw e; } }
public Report update(Integer userId, int project, Report report) { try (Handle handle = dbi.open()) { int execute = handle.createStatement("UPDATE reports SET name = :name, query = :query, category = :category, options = :options" + " WHERE project_id = :project AND slug = :slug AND (user_id = :user or user_id is null or (SELECT user_id = :user FROM web_user_project WHERE id = :project))") .bind("project", project) .bind("name", report.name) .bind("query", report.query) .bind("category", report.category) .bind("slug", report.slug) .bind("user", userId) .bind("options", JsonHelper.encode(report.options, false)) .execute(); if (execute == 0) { throw new RakamException("Report does not exist or the user doesn't own the report", BAD_REQUEST); } } return report; } }