Search in sources :

Example 1 with UsageCostDetail

use of com.iluwatar.claimcheckpattern.domain.UsageCostDetail in project java-design-patterns by iluwatar.

the class UsageCostProcessorFunction method run.

/**
 * Azure function which gets triggered when event grid event send event to it.
 * After receiving event, it read input file from blob storage, calculate call cost details.
 * It creates new message with cost details and drop message to blob storage.
 * @param request represents HttpRequestMessage
 * @param context represents ExecutionContext
 * @return HttpResponseMessage
 */
@FunctionName("UsageCostProcessorFunction")
public HttpResponseMessage run(@HttpTrigger(name = "req", methods = { HttpMethod.GET, HttpMethod.POST }, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request, final ExecutionContext context) {
    try {
        var eventGridEvents = EventGridEvent.fromString(request.getBody().get());
        for (var eventGridEvent : eventGridEvents) {
            // Handle system events
            if (eventGridEvent.getEventType().equals("Microsoft.EventGrid.SubscriptionValidationEvent")) {
                SubscriptionValidationEventData subscriptionValidationEventData = eventGridEvent.getData().toObject(SubscriptionValidationEventData.class);
                // Handle the subscription validation event
                var responseData = new SubscriptionValidationResponse();
                responseData.setValidationResponse(subscriptionValidationEventData.getValidationCode());
                return request.createResponseBuilder(HttpStatus.OK).body(responseData).build();
            } else if (eventGridEvent.getEventType().equals("UsageDetail")) {
                // Get message header and reference
                var messageReference = eventGridEvent.getData().toObject(MessageReference.class);
                // Read message from persistent storage
                var message = this.messageHandlerUtilityForUsageDetail.readFromPersistantStorage(messageReference, context.getLogger());
                // Get Data and generate cost details
                List<UsageDetail> usageDetailsList = BinaryData.fromObject(message.getMessageBody().getData()).toObject(new TypeReference<>() {
                });
                var usageCostDetailsList = calculateUsageCostDetails(usageDetailsList);
                // Create message body
                var newMessageBody = new MessageBody<UsageCostDetail>();
                newMessageBody.setData(usageCostDetailsList);
                // Create message header
                var newMessageReference = new MessageReference("callusageapp", eventGridEvent.getId() + "/output.json");
                var newMessageHeader = new MessageHeader();
                newMessageHeader.setId(eventGridEvent.getId());
                newMessageHeader.setSubject("UsageCostProcessor");
                newMessageHeader.setTopic("");
                newMessageHeader.setEventType("UsageCostDetail");
                newMessageHeader.setEventTime(OffsetDateTime.now().toString());
                newMessageHeader.setData(newMessageReference);
                newMessageHeader.setDataVersion("v1.0");
                // Create entire message
                var newMessage = new Message<UsageCostDetail>();
                newMessage.setMessageHeader(newMessageHeader);
                newMessage.setMessageBody(newMessageBody);
                // Drop data to persistent storage
                this.messageHandlerUtilityForUsageCostDetail.dropToPersistantStorage(newMessage, context.getLogger());
                context.getLogger().info("Message is dropped successfully");
                return request.createResponseBuilder(HttpStatus.OK).body("Message is dropped successfully").build();
            }
        }
    } catch (Exception e) {
        context.getLogger().warning(e.getMessage());
    }
    return request.createResponseBuilder(HttpStatus.INTERNAL_SERVER_ERROR).body(null).build();
}
Also used : SubscriptionValidationResponse(com.azure.messaging.eventgrid.systemevents.SubscriptionValidationResponse) SubscriptionValidationEventData(com.azure.messaging.eventgrid.systemevents.SubscriptionValidationEventData) ArrayList(java.util.ArrayList) List(java.util.List) TypeReference(com.azure.core.util.serializer.TypeReference) MessageHeader(com.iluwatar.claimcheckpattern.domain.MessageHeader) MessageReference(com.iluwatar.claimcheckpattern.domain.MessageReference) UsageCostDetail(com.iluwatar.claimcheckpattern.domain.UsageCostDetail) FunctionName(com.microsoft.azure.functions.annotation.FunctionName)

Example 2 with UsageCostDetail

use of com.iluwatar.claimcheckpattern.domain.UsageCostDetail in project java-design-patterns by iluwatar.

the class UsageCostProcessorFunctionTest method setUp.

@BeforeEach
public void setUp() {
    var messageBodyUsageDetail = new MessageBody<UsageDetail>();
    var usageDetailsList = new ArrayList<UsageDetail>();
    var messageBodyUsageCostDetail = new MessageBody<UsageCostDetail>();
    var usageCostDetailsList = new ArrayList<UsageCostDetail>();
    for (int i = 0; i < 2; i++) {
        var usageDetail = new UsageDetail();
        usageDetail.setUserId("userId" + i);
        usageDetail.setData(i + 1);
        usageDetail.setDuration(i + 1);
        usageDetailsList.add(usageDetail);
        var usageCostDetail = new UsageCostDetail();
        usageCostDetail.setUserId(usageDetail.getUserId());
        usageCostDetail.setDataCost(usageDetail.getData() * 0.20);
        usageCostDetail.setCallCost(usageDetail.getDuration() * 0.30);
        usageCostDetailsList.add(usageCostDetail);
    }
    messageBodyUsageDetail.setData(usageDetailsList);
    messageBodyUsageCostDetail.setData(usageCostDetailsList);
    // Create message header
    var messageHeader = new MessageHeader();
    messageHeader.setId(UUID.randomUUID().toString());
    messageHeader.setSubject("UsageDetailPublisher");
    messageHeader.setTopic("usagecostprocessorfunction-topic");
    messageHeader.setEventType("UsageDetail");
    messageHeader.setEventTime(OffsetDateTime.now().toString());
    this.messageReference = new MessageReference("callusageapp", "d8284456-dfff-4bd4-9cef-ea99f70f4835/input.json");
    messageHeader.setData(messageReference);
    messageHeader.setDataVersion("v1.0");
    // Create entire message
    messageToRead = new Message<>();
    messageToRead.setMessageHeader(messageHeader);
    messageToRead.setMessageBody(messageBodyUsageDetail);
    messageToDrop = new Message<>();
    messageToDrop.setMessageHeader(messageHeader);
    messageToDrop.setMessageBody(messageBodyUsageCostDetail);
}
Also used : UsageDetail(com.iluwatar.claimcheckpattern.domain.UsageDetail) MessageHeader(com.iluwatar.claimcheckpattern.domain.MessageHeader) UsageCostDetail(com.iluwatar.claimcheckpattern.domain.UsageCostDetail) MessageReference(com.iluwatar.claimcheckpattern.domain.MessageReference) MessageBody(com.iluwatar.claimcheckpattern.domain.MessageBody) BeforeEach(org.junit.jupiter.api.BeforeEach)

Aggregations

MessageHeader (com.iluwatar.claimcheckpattern.domain.MessageHeader)2 MessageReference (com.iluwatar.claimcheckpattern.domain.MessageReference)2 UsageCostDetail (com.iluwatar.claimcheckpattern.domain.UsageCostDetail)2 TypeReference (com.azure.core.util.serializer.TypeReference)1 SubscriptionValidationEventData (com.azure.messaging.eventgrid.systemevents.SubscriptionValidationEventData)1 SubscriptionValidationResponse (com.azure.messaging.eventgrid.systemevents.SubscriptionValidationResponse)1 MessageBody (com.iluwatar.claimcheckpattern.domain.MessageBody)1 UsageDetail (com.iluwatar.claimcheckpattern.domain.UsageDetail)1 FunctionName (com.microsoft.azure.functions.annotation.FunctionName)1 ArrayList (java.util.ArrayList)1 List (java.util.List)1 BeforeEach (org.junit.jupiter.api.BeforeEach)1