/*
* Copyright (c) 2014 Jacob D. Parr
*
* This software may not be used without permission.
*/
package com.cosmicpush.app.resources.api;
import com.cosmicpush.app.domain.accounts.Account;
import com.cosmicpush.app.domain.clients.ApiClient;
import com.cosmicpush.app.domain.requests.ApiRequest;
import com.cosmicpush.app.resources.RequestConfig;
import com.cosmicpush.app.resources.api.userevent.UserEventDelegate;
import com.cosmicpush.pub.common.Push;
import com.cosmicpush.pub.common.PushResponse;
import com.cosmicpush.pub.internal.EndPoints;
import com.cosmicpush.pub.push.*;
import java.net.InetAddress;
import javax.ws.rs.*;
import javax.ws.rs.core.*;
import org.crazyyak.dev.common.StringUtils;
public class ApiResource {
private final Account account;
private final ApiClient apiClient;
private final RequestConfig config;
private final InetAddress inetAddress;
public ApiResource(ApiRequestConfig config, Account account, ApiClient apiClient) throws Exception {
this.config = config;
this.account = account;
this.apiClient = apiClient;
String remoteAddress = config.getRequest().getRemoteAddr();
inetAddress = InetAddress.getByName(remoteAddress);
}
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Path("/callback")
public Response callback(String msg) throws Exception {
return Response.ok().build();
}
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Path(EndPoints.PUSH_NOTIFICATION)
public Response sendNotification(NotificationPush push) throws Exception {
ApiRequest apiRequest = new ApiRequest(apiClient, push, inetAddress);
config.getApiRequestStore().create(apiRequest);
NotificationDelegate delegate = new NotificationDelegate(config.getObjectMapper(), config.getApiRequestStore(), account, apiClient, apiRequest, push);
new Thread(delegate).start();
return buildResponse(apiRequest);
}
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Path(EndPoints.PUSH_USER_EVENT)
public Response sendUserEvent(UserEventPush push) throws Exception {
ApiRequest apiRequest = new ApiRequest(apiClient, push, inetAddress);
config.getApiRequestStore().create(apiRequest);
UserEventDelegate delegate = new UserEventDelegate(config.getObjectMapper(), config.getApiRequestStore(), account, apiClient, apiRequest, push);
new Thread(delegate).start();
return buildResponse(apiRequest);
}
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Path(EndPoints.PUSH_IM)
public Response sendGoogleTalk(ImPush push) throws Exception {
ApiRequest apiRequest = new ApiRequest(apiClient, push, inetAddress);
config.getApiRequestStore().create(apiRequest);
GoolgeTalkDelegate delegate = new GoolgeTalkDelegate(config.getObjectMapper(), config.getApiRequestStore(), account, apiClient, apiRequest, push);
new Thread(delegate).start();
return buildResponse(apiRequest);
}
private boolean useAwsEmail() {
return apiClient.getAwsEmailConfig() != null &&
StringUtils.isNotBlank(apiClient.getAwsEmailConfig().getSecretKey()) &&
StringUtils.isNotBlank(apiClient.getAwsEmailConfig().getAccessKeyId());
}
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Path(EndPoints.PUSH_EMAIL)
public Response sendEmailMessage(EmailPush push) throws Exception {
ApiRequest apiRequest = new ApiRequest(apiClient, push, inetAddress);
config.getApiRequestStore().create(apiRequest);
if (useAwsEmail()) {
AwsEmailDelegate delegate = new AwsEmailDelegate(config.getObjectMapper(), config.getApiRequestStore(), account, apiClient, apiRequest, push);
new Thread(delegate).start();
} else {
SmtpEmailDelegate delegate = new SmtpEmailDelegate(config.getObjectMapper(), config.getApiRequestStore(), account, apiClient, apiRequest, push);
new Thread(delegate).start();
}
return buildResponse(apiRequest);
}
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Path(EndPoints.PUSH_EMAIL_TO_SMS)
public Response sendEmailToSmsMessage(EmailToSmsPush push) throws Exception {
ApiRequest apiRequest = new ApiRequest(apiClient, push, inetAddress);
config.getApiRequestStore().create(apiRequest);
if (useAwsEmail()) {
AwsSmsDelegate delegate = new AwsSmsDelegate(config.getObjectMapper(), config.getApiRequestStore(), account, apiClient, apiRequest, push);
new Thread(delegate).start();
} else {
SmtpSmsDelegate delegate = new SmtpSmsDelegate(config.getObjectMapper(), config.getApiRequestStore(), account, apiClient, apiRequest, push);
new Thread(delegate).start();
}
return buildResponse(apiRequest);
}
private Response buildResponse(ApiRequest apiRequest) throws Exception {
PushResponse response = new PushResponse(
account.getAccountId(),
apiClient.getApiClientId(),
apiRequest.getApiRequestId(),
apiRequest.getCreatedAt(),
apiRequest.getRequestStatus(),
apiRequest.getNotes()
);
return Response.ok(response, MediaType.APPLICATION_JSON).build();
}
}