Skip to content

Commit

Permalink
Added subscription support
Browse files Browse the repository at this point in the history
Still requires the latest java API release (with subscription support) to be added to POM of each project. Then, this will all need to be tested.
matthewtanner91 committed Feb 29, 2024
1 parent d5a806b commit 1c204ed
Showing 11 changed files with 554 additions and 0 deletions.
57 changes: 57 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -726,6 +726,63 @@ CompanyModel company = new CompanyBuilder()
filter.updateCompaniesBatch(companies);
```

## Update a Single Subscription

Create or update a subscription profile in Moesif. The metadata field can store any subscription-related information you wish to keep. The `subscription_id`, `company_id`, and `status` fields are all required. This method is a convenient helper that calls the Moesif API library. For details, visit the [Java API Reference](https://www.moesif.com/docs/api?java#update-a-subscription).

```java
MoesifFilter filter = new MoesifFilter("Your Moesif Application Id", new MoesifConfiguration());

// Only subscriptionId, companyId, and status are required
// metadata can be any custom object
SubscriptionModel subscription = new SubscriptionBuilder()
.subscriptionId("sub_12345")
.companyId("67890")
.status("active")
.metadata(APIHelper.deserialize("{" +
"\"email\": \"[email protected]\"," +
"\"string_field\": \"value_1\"," +
"\"number_field\": 0," +
"\"object_field\": {" +
"\"field_1\": \"value_1\"," +
"\"field_2\": \"value_2\"" +
"}" +
"}"))
.build();

filter.updateSubscription(subscription);
```

## Update Subscriptions in Batch

Similar to `updateSubscription`, but used to update a list of subscriptions in one batch. The `subscription_id`, `company_id`, and `status` fields are required for each subscription in the list. This method is a convenient helper that calls the Moesif API library. For details, visit the [Java API Reference](https://www.moesif.com/docs/api?java#update-subscriptions-in-batch).

You can update subscriptions _synchronously_ or _asynchronously_ on a background thread. Unless you require synchronous behavior, we recommend the async versions.

```java
MoesifFilter filter = new MoesifFilter("Your Moesif Application Id", new MoesifConfiguration());

List<SubscriptionModel> subscriptions = new ArrayList<>();
subscriptions.add(new SubscriptionBuilder()
.subscriptionId("sub_12345")
.companyId("67890")
.status("active")
.metadata(APIHelper.deserialize("{" +
"\"email\": \"[email protected]\"," +
"\"string_field\": \"value_1\"," +
"\"number_field\": 0," +
"\"object_field\": {" +
"\"field_1\": \"value_1\"," +
"\"field_2\": \"value_2\"" +
"}" +
"}"))
.build());

// Add more subscriptions as needed

filter.updateSubscriptionsBatch(subscriptions);
```

## Troubleshooting

### How to print debug logs
Original file line number Diff line number Diff line change
@@ -2,6 +2,7 @@

import java.io.IOException;
import java.util.concurrent.atomic.AtomicLong;
import java.util.Date;
import com.moesif.api.APIHelper;
import com.moesif.api.models.*;
import com.moesif.servlet.MoesifConfiguration;
@@ -162,4 +163,36 @@ public String updateCompany(@PathVariable("id") String id) throws IOException {

return "{ \"update_company\": true }";
}

@RequestMapping(value = "/api/subscriptions/{id}", method = RequestMethod.POST)
@ResponseBody
@ResponseStatus(code = HttpStatus.CREATED)
public String updateSubscription(@PathVariable("id") String id) throws IOException {
// Only subscriptionId is required
// metadata can be any custom object
SubscriptionModel subscription = new SubscriptionBuilder()
.subscriptionId("sub_12345")
.companyId("67890")
.currentPeriodStart(new Date())
.currentPeriodEnd(new Date())
.status("active")
.metadata(APIHelper.deserialize("{" +
"\"email\": \"[email protected]\"," +
"\"string_field\": \"value_1\"," +
"\"number_field\": 0," +
"\"object_field\": {" +
"\"field_1\": \"value_1\"," +
"\"field_2\": \"value_2\"" +
"}" +
"}"))
.build();

try {
moesifFilter.updateSubscription(subscription);
} catch (Throwable t) {
System.out.println("Error while updating the subscription profile.");
}

return "{ \"update_subscription\": true }";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package com.moesif.servlet.jersey.example;

import java.util.Date;

import javax.annotation.PostConstruct;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Configuration;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import com.moesif.api.MoesifAPIClient;
import com.moesif.api.APIHelper;
import com.moesif.api.controllers.APIController;
import com.moesif.api.models.SubscriptionModel;
import com.moesif.api.models.SubscriptionBuilder;

/**
* Root resource (exposed at "subscriptions" path)
*/
@Path("subscriptions/{id}")
public class SubscriptionsServlet {

private APIController apiClient;

@Context
private Configuration config;

@PostConstruct
public void init() {
String applicationId = (String) config.getProperty("application-id");
apiClient = new MoesifAPIClient(applicationId).getAPI();
}

/**
* Method handling HTTP POST requests. The returned object will be sent
* to the client as "application/json" media type.
*
* @return Response that will be returned as an application/json.
*/
@POST
@Produces(MediaType.APPLICATION_JSON)
public Response updateSubscription(@PathParam("id") String id) throws Throwable {

// Only subscriptionId, companyId, and status are required
// metadata can be any custom object
SubscriptionModel subscription = new SubscriptionBuilder()
.subscriptionId("sub_12345")
.companyId("67890")
.currentPeriodStart(new Date())
.currentPeriodEnd(new Date())
.status("active")
.metadata(APIHelper.deserialize("{" +
"\"email\": \"[email protected]\"," +
"\"string_field\": \"value_1\"," +
"\"number_field\": 0," +
"\"object_field\": {" +
"\"field_1\": \"value_1\"," +
"\"field_2\": \"value_2\"" +
"}" +
"}"))
.build();

apiClient.updateSubscription(subscription);

return Response.status(Status.CREATED).entity("{"
+ "\"updated_company\": true"
+ "}").build();
}
}
Original file line number Diff line number Diff line change
@@ -285,6 +285,69 @@ public void updateCompaniesBatch(List<CompanyModel> companiesModel) throws Throw
}
}

public void updateSubscription(SubscriptionModel subscriptionModel) throws Throwable{

if (this.moesifApi != null) {
String subscriptionId = subscriptionModel.getSubscriptionId();
String companyId = subscriptionModel.getCompanyId();
String status = subscriptionModel.getStatus();

if (subscriptionId != null && !subscriptionId.isEmpty()
|| companyId != null && !companyId.isEmpty()
|| status != null && !status.isEmpty()
) {
try {
moesifApi.getAPI().updateSubscription(subscriptionModel);
}
catch(Exception e) {
if (debug) {
logger.warning("Update Subscription to Moesif failed " + e.toString());
}
}
}
else {
throw new IllegalArgumentException("To update a subscription, the subscriptionId, companyId, and status fields are required");
}
}
else {
logger.warning("The application Id should be set before using MoesifFilter");
}
}

public void updateSubscriptionsBatch(List<SubscriptionModel> subscriptionsModel) throws Throwable{

List<SubscriptionModel> subscriptions = new ArrayList<SubscriptionModel>();
if (this.moesifApi != null) {
for (SubscriptionModel subscription : subscriptionsModel) {
String subscriptionId = subscription.getSubscriptionId();
String companyId = subscription.getCompanyId();
String status = subscription.getStatus();

if (subscriptionId != null && !subscriptionId.isEmpty()
|| companyId != null && !companyId.isEmpty()
|| status != null && !status.isEmpty()
) {
subscriptions.add(subscription);
} else {
throw new IllegalArgumentException("To update a subscription, the subscriptionId, companyId, and status fields are required");
}
}
}
else {
logger.warning("The application Id should be set before using MoesifFilter");
}

if (!subscriptions.isEmpty()) {
try {
moesifApi.getAPI().updateSubscriptionsBatch(subscriptions);
} catch (Exception e) {
if (debug) {
logger.warning("Update Subscriptions to Moesif failed " + e.toString());
}
}
}
}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
if (debug) {
63 changes: 63 additions & 0 deletions moesif-servlet/src/main/java/com/moesif/servlet/MoesifFilter.java
Original file line number Diff line number Diff line change
@@ -280,6 +280,69 @@ public void updateCompaniesBatch(List<CompanyModel> companiesModel) throws Throw
}
}

public void updateSubscription(SubscriptionModel subscriptionModel) throws Throwable{

if (this.moesifApi != null) {
String subscriptionId = subscriptionModel.getSubscriptionId();
String companyId = subscriptionModel.getCompanyId();
String status = subscriptionModel.getStatus();

if (subscriptionId != null && !subscriptionId.isEmpty()
|| companyId != null && !companyId.isEmpty()
|| status != null && !status.isEmpty()
) {
try {
moesifApi.getAPI().updateSubscription(subscriptionModel);
}
catch(Exception e) {
if (debug) {
logger.warning("Update Subscription to Moesif failed " + e.toString());
}
}
}
else {
throw new IllegalArgumentException("To update a subscription, the subscriptionId, companyId, and status fields are required");
}
}
else {
logger.warning("The application Id should be set before using MoesifFilter");
}
}

public void updateSubscriptionsBatch(List<SubscriptionModel> subscriptionsModel) throws Throwable{

List<SubscriptionModel> subscriptions = new ArrayList<SubscriptionModel>();
if (this.moesifApi != null) {
for (SubscriptionModel subscription : subscriptionsModel) {
String subscriptionId = subscription.getSubscriptionId();
String companyId = subscription.getCompanyId();
String status = subscription.getStatus();

if (subscriptionId != null && !subscriptionId.isEmpty()
|| companyId != null && !companyId.isEmpty()
|| status != null && !status.isEmpty()
) {
subscriptions.add(subscription);
} else {
throw new IllegalArgumentException("To update a subscription, the subscriptionId, companyId, and status fields are required");
}
}
}
else {
logger.warning("The application Id should be set before using MoesifFilter");
}

if (!subscriptions.isEmpty()) {
try {
moesifApi.getAPI().updateSubscriptionsBatch(subscriptions);
} catch (Exception e) {
if (debug) {
logger.warning("Update Subscriptions to Moesif failed " + e.toString());
}
}
}
}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
if (debug) {
Original file line number Diff line number Diff line change
@@ -9,6 +9,8 @@
import com.moesif.api.APIHelper;
import com.moesif.api.models.CompanyBuilder;
import com.moesif.api.models.CompanyModel;
import com.moesif.api.models.SubscriptionBuilder;
import com.moesif.api.models.SubscriptionModel;
import com.moesif.api.models.UserBuilder;
import junit.framework.TestCase;
import org.mockito.Mockito;
@@ -241,5 +243,60 @@ public void testUpdateCompaniesBatch() throws Throwable {
filter.updateCompaniesBatch(companies);
}

public void testUpdateSubscription() throws Throwable {

// Only subscriptionId, companyId, and status
// metadata can be any custom object
SubscriptionModel subscription = new SubscriptionBuilder()
.subscriptionId("sub_12345")
.companyId("67890")
.currentPeriodStart(new Date())
.currentPeriodEnd(new Date())
.status("active")
.metadata(APIHelper.deserialize("{" +
"\"email\": \"[email protected]\"," +
"\"string_field\": \"value_1\"," +
"\"number_field\": 0," +
"\"object_field\": {" +
"\"field_1\": \"value_1\"," +
"\"field_2\": \"value_2\"" +
"}" +
"}"))
.build();

filter.updateSubscription(subscription);
}

public void testUpdateSubscriptionsBatch() throws Throwable {
List<SubscriptionModel> subscriptions = new ArrayList<SubscriptionModel>();

SubscriptionModel subscriptionA = new SubscriptionBuilder()
.subscriptionId("sub_12345")
.companyId("67890")
.currentPeriodStart(new Date())
.currentPeriodEnd(new Date())
.status("active")
.build();
subscriptions.add(subscriptionA);

SubscriptionModel subscriptionB = new SubscriptionBuilder()
.subscriptionId("sub_54321")
.companyId("67890")
.currentPeriodStart(new Date())
.currentPeriodEnd(new Date())
.status("active")
.metadata(APIHelper.deserialize("{" +
"\"email\": \"[email protected]\"," +
"\"string_field\": \"value_1\"," +
"\"number_field\": 0," +
"\"object_field\": {" +
"\"field_1\": \"value_1\"," +
"\"field_2\": \"value_2\"" +
"}" +
"}"))
.build();
subscriptions.add(subscriptionB);

filter.updateSubscriptionsBatch(subscriptions);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package com.moesif.servlet.example;

import java.util.Date;

import com.moesif.api.APIHelper;
import com.moesif.api.models.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import com.moesif.servlet.MoesifFilter;

public class SubscriptionsServlet extends HttpServlet {

private MoesifFilter moesifFilter;

@Override
public void init() throws ServletException {
String applicationId = getInitParameter("application-id");
moesifFilter = new MoesifFilter();
moesifFilter.setApplicationId(applicationId);
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException {

if (request.getPathInfo() != null && !request.getPathInfo().isEmpty()) {
// Only subscriptionId, companyId, and status
// metadata can be any custom object

SubscriptionModel subscription = new SubscriptionBuilder()
.subscriptionId("sub_12345")
.companyId("67890")
.currentPeriodStart(new Date())
.currentPeriodEnd(new Date())
.status("active")
.metadata(APIHelper.deserialize("{" +
"\"email\": \"johndoe@acmeinc.com\"," +
"\"string_field\": \"value_1\"," +
"\"number_field\": 0," +
"\"object_field\": {" +
"\"field_1\": \"value_1\"," +
"\"field_2\": \"value_2\"" +
"}" +
"}"))
.build();

try {
moesifFilter.updateSubscription(subscription);
} catch (Throwable t) {
System.out.println("Error while updating the subscription profile.");
}

response.setHeader("Content-Type", "application/json");
response.setStatus(201);
PrintWriter out = response.getWriter();
String json = "{"
+ "\"updated_subscription\": true"
+ "}";
out.println(json);
} else {
response.setHeader("Content-Type", "application/json");
response.setStatus(400);
PrintWriter out = response.getWriter();
String json = "{"
+ "\"msg\": \"subscription_id, company_id, and status are required.\""
+ "}";
out.println(json);
}
}
}

Original file line number Diff line number Diff line change
@@ -150,6 +150,42 @@ public void init() {
}
);

Spark.post("/api/subscriptions/:id",
(Request request, Response response) -> {

// Only subscriptionId, companyId, and status are required
// metadata can be any custom object
SubscriptionModel subscription = new SubscriptionBuilder()
.subscriptionId("sub_12345")
.companyId("67890")
.currentPeriodStart(new Date())
.currentPeriodEnd(new Date())
.status("active")
.metadata(APIHelper.deserialize("{" +
"\"email\": \"johndoe@acmeinc.com\"," +
"\"string_field\": \"value_1\"," +
"\"number_field\": 0," +
"\"object_field\": {" +
"\"field_1\": \"value_1\"," +
"\"field_2\": \"value_2\"" +
"}" +
"}"))
.build();

try {
apiClient.updateSubscription(subscription);
} catch (Throwable t) {
System.out.println("Error while updating the subscription profile.");
}

response.header("Content-Type", "application/json");
response.status(201);
return "{"
+ "\"updated_subscription\": true"
+ "}";
}
);


Spark.post("/api/upload/file", (req, res) -> {
final File upload = new File("/tmp");
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.moesif.servlet.spring;

import java.io.IOException;
import java.util.Date;
import java.util.concurrent.atomic.AtomicLong;

import com.moesif.api.APIHelper;
@@ -127,4 +128,36 @@ public String updateCompany(@PathVariable("id") String id) throws IOException {

return "{ \"update_company\": true }";
}

@RequestMapping(value = "/api/subscriptions/{id}", method = RequestMethod.POST)
@ResponseBody
@ResponseStatus(code = HttpStatus.CREATED)
public String updateSubscription(@PathVariable("id") String id) throws IOException {
// Only subscriptionId, companyId, and status
// metadata can be any custom object
SubscriptionModel subscription = new SubscriptionBuilder()
.subscriptionId("sub_12345")
.companyId("67890")
.currentPeriodStart(new Date())
.currentPeriodEnd(new Date())
.status("active")
.metadata(APIHelper.deserialize("{" +
"\"email\": \"johndoe@acmeinc.com\"," +
"\"string_field\": \"value_1\"," +
"\"number_field\": 0," +
"\"object_field\": {" +
"\"field_1\": \"value_1\"," +
"\"field_2\": \"value_2\"" +
"}" +
"}"))
.build();

try {
moesifFilter.updateSubscription(subscription);
} catch (Throwable t) {
System.out.println("Error while updating the subscription profile.");
}

return "{ \"update_subscription\": true }";
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.moesif.servlet.spring;

import java.io.IOException;
import java.util.Date;
import java.util.concurrent.atomic.AtomicLong;
import com.moesif.api.APIHelper;
import com.moesif.api.models.*;
@@ -127,4 +128,35 @@ public String updateCompany(@PathVariable("id") String id) throws IOException {

return "{ \"update_company\": true }";
}

@RequestMapping(value = "/api/subscriptions/{id}", method = RequestMethod.POST)
@ResponseBody
@ResponseStatus(code = HttpStatus.CREATED)
public String updateSubscription(@PathVariable("id") String id) throws IOException {
// Only subscriptionId, companyId, and status
// metadata can be any custom object
SubscriptionModel subscription = new SubscriptionBuilder()
.subscriptionId("sub_12345")
.companyId("67890")
.currentPeriodStart(new Date())
.currentPeriodEnd(new Date())
.status("active")
.metadata(APIHelper.deserialize("{" +
"\"email\": \"johndoe@acmeinc.com\"," +
"\"string_field\": \"value_1\"," +
"\"number_field\": 0," +
"\"object_field\": {" +
"\"field_1\": \"value_1\"," +
"\"field_2\": \"value_2\"" +
"}" +
"}"))
.build();

try {
moesifFilter.updateSubscription(subscription);
} catch (Throwable t) {
System.out.println("Error while updating the subscription profile.");
}
return "{ \"update_subscription\": true }";
}
}
Original file line number Diff line number Diff line change
@@ -10,6 +10,7 @@
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.util.Date;

@RestController
public class PostController {
@@ -113,4 +114,36 @@ public String updateCompany(@PathVariable("id") String id) throws IOException {

return "{ \"update_company\": true }";
}

@RequestMapping(value = "/api/subscriptions/{id}", method = RequestMethod.POST)
@ResponseBody
@ResponseStatus(code = HttpStatus.CREATED)
public String updateSubscription(@PathVariable("id") String id) throws IOException {
// Only subscriptionId, companyId, and status are required
// metadata can be any custom object
SubscriptionModel subscription = new SubscriptionBuilder()
.subscriptionId("sub_12345")
.companyId("67890")
.currentPeriodStart(new Date())
.currentPeriodEnd(new Date())
.status("active")
.metadata(APIHelper.deserialize("{" +
"\"email\": \"johndoe@acmeinc.com\"," +
"\"string_field\": \"value_1\"," +
"\"number_field\": 0," +
"\"object_field\": {" +
"\"field_1\": \"value_1\"," +
"\"field_2\": \"value_2\"" +
"}" +
"}"))
.build();

try {
apiClient.updateSubscription(subscription);
} catch (Throwable t) {
System.out.println("Error while updating the subscription profile.");
}

return "{ \"update_subscription\": true }";
}
}

0 comments on commit 1c204ed

Please sign in to comment.