package eu.ortlepp.notificationsender; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.LambdaLogger; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import eu.ortlepp.notificationsender.model.Notifications; import eu.ortlepp.notificationsender.model.Response; import eu.ortlepp.notificationsender.model.Status; import eu.ortlepp.notificationsender.service.NotificationSender; import eu.ortlepp.notificationsender.service.SnsNotificationSender; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; /** * AWS Lambda implementation. */ public class NotificationHandler implements RequestHandler, Response> { private LambdaLogger logger; private NotificationSender sender; /** * Standard constructor for AWS runtime. Uses default NotificationSender implementation. */ public NotificationHandler() { this.sender = null; } /** * Constructor with custom NotificationSender implementation. Mainly for testing purposes. * * @param sender A custom NotificationSender */ public NotificationHandler(final NotificationSender sender) { this.sender = sender; } /** * Constructor with custom NotificationSender and Context implementation. * Mainly for testing purposes. * * @param sender A custom NotificationSender * @param context A custom Context (to initialize the build-in logger) */ public NotificationHandler(final NotificationSender sender, final Context context) { this.sender = sender; this.logger = context.getLogger(); } /** * The AWS Lambda handler; executes the Lambda functionality. * * @param event The incoming event which triggered the Lambda * @param context The context of the Lambda execution * @return The final status of the execution */ public Response handleRequest(final Map event, final Context context) { logger = context.getLogger(); if (sender == null) { sender = new SnsNotificationSender(logger); } List notifications = extractNotifications(event.get("body")); if (!notifications.isEmpty() && sender.sendNotifications(notifications)) { return new Response(Status.SUCCESS); } return new Response(Status.FAILED); } /** * Extract the notifications from the input JSON. * * @param body The input JSON * @return The extracted messages; empty list if an error occurred while parsing the JSON */ protected List extractNotifications(final Object body) { try { Notifications notifications = new ObjectMapper().readValue(body.toString(), Notifications.class); return Arrays.asList(notifications.messages()); } catch (JsonProcessingException ex) { logger.log("parsing input JSON failed : " + ex.getMessage()); return new ArrayList<>(); } } }