package org.rakam.analysis.abtesting; import org.rakam.analysis.ApiKeyService; import org.rakam.server.http.HttpService; import org.rakam.server.http.RakamHttpRequest; import org.rakam.server.http.annotations.Api; import org.rakam.server.http.annotations.ApiOperation; import org.rakam.server.http.annotations.ApiParam; import org.rakam.server.http.annotations.Authorization; import org.rakam.server.http.annotations.BodyParam; import org.rakam.server.http.annotations.IgnoreApi; import org.rakam.server.http.annotations.JsonRequest; import org.rakam.util.JsonHelper; import org.rakam.util.SuccessMessage; import javax.inject.Inject; import javax.inject.Named; import javax.ws.rs.GET; import javax.ws.rs.Path; import java.util.List; import java.util.Map; import static io.netty.handler.codec.http.HttpResponseStatus.BAD_REQUEST; @Path("/ab-testing") @Api(value = "/ab-testing", nickname = "abTesting", description = "A/B Testing module", tags = "ab-testing") public class ABTestingHttpService extends HttpService { private final ABTestingMetastore metadata; private final ApiKeyService apiKeyService; @Inject public ABTestingHttpService(ApiKeyService apiKeyService, ABTestingMetastore metadata) { this.metadata = metadata; this.apiKeyService = apiKeyService; } @GET @ApiOperation(value = "List reports", authorizations = @Authorization(value = "read_key")) @Path("/list") public List<ABTestingReport> list(@Named("project") String project) { return metadata.getReports(project); } @JsonRequest @ApiOperation(value = "Create test", authorizations = @Authorization(value = "master_key")) @Path("/create") public SuccessMessage create(@Named("project") String project, @BodyParam ABTestingReport report) { metadata.save(project, report); return SuccessMessage.success(); } @Path("/data") @GET @IgnoreApi public void data(RakamHttpRequest request) { Map<String, List<String>> params = request.params(); List<String> api_key = params.get("read_key"); if(api_key == null || api_key.isEmpty()) { request.response("\"read_key is missing\"", BAD_REQUEST).end(); return; } // since this endpoint is created for clients to read the ab-testing rule, // the permission is WRITE_KEY String project = apiKeyService.getProjectOfApiKey(api_key.get(0), ApiKeyService.AccessKeyType.WRITE_KEY); request.response(JsonHelper.encodeAsBytes(metadata.getReports(project))) .end(); } @JsonRequest @ApiOperation(value = "Delete report", authorizations = @Authorization(value = "master_key")) @Path("/delete") public SuccessMessage delete(@Named("project") String project, @ApiParam("id") int id) { metadata.delete(project, id); return SuccessMessage.success(); } @JsonRequest @ApiOperation(value = "Get report", authorizations = @Authorization(value = "read_key")) @Path("/get") public ABTestingReport get(@Named("project") String project, @ApiParam("id") int id) { return metadata.get(project, id); } @JsonRequest @ApiOperation(value = "Update report", authorizations = @Authorization(value = "master_key")) @Path("/update") public ABTestingReport update(@Named("project") String project, @BodyParam ABTestingReport report) { return metadata.update(project, report); } }