From 4d7523595edb53f392c54328a529f48e809f15e5 Mon Sep 17 00:00:00 2001
From: Johan de Klerk <jdeklerk00@gmail.com>
Date: Wed, 9 Feb 2022 09:59:33 +0200
Subject: [PATCH] #24: Retrieve message from S3

---
 handler_utils/sqs.go | 28 ++++++++++++++++++++++++----
 1 file changed, 24 insertions(+), 4 deletions(-)

diff --git a/handler_utils/sqs.go b/handler_utils/sqs.go
index 5a92358..855bf1f 100644
--- a/handler_utils/sqs.go
+++ b/handler_utils/sqs.go
@@ -5,6 +5,8 @@ import (
 	"github.com/aws/aws-lambda-go/events"
 	"gitlab.com/uafrica/go-utils/errors"
 	"gitlab.com/uafrica/go-utils/logs"
+	"gitlab.com/uafrica/go-utils/s3"
+	"gitlab.com/uafrica/go-utils/sqs"
 	"reflect"
 )
 
@@ -30,11 +32,29 @@ func ValidateSQSEndpoints(endpoints map[string]interface{}) (map[string]interfac
 	return endpoints, nil
 }
 
-func GetRecord(message events.SQSMessage, recordType reflect.Type) (interface{}, error) {
+func GetRecord(s3Session *s3.SessionWithHelpers, bucket string, message events.SQSMessage, recordType reflect.Type) (interface{}, error) {
+
 	recordValuePtr := reflect.New(recordType)
-	err := json.Unmarshal([]byte(message.Body), recordValuePtr.Interface())
-	if err != nil {
-		return nil, errors.Wrapf(err, "failed to JSON decode message body")
+
+	// Check if message body should be retrieved from S3
+	if messageAttribute, ok := message.MessageAttributes[sqs.SQSMessageOnS3Key]; ok {
+		if messageAttribute.StringValue != nil && *messageAttribute.StringValue == "true" {
+			messageBytes, err := sqs.RetrieveMessageFromS3(s3Session, bucket, message.Body)
+			if err != nil {
+				return nil, errors.Wrapf(err, "failed to get sqs message body from s3")
+			}
+
+			err = json.Unmarshal(messageBytes, recordValuePtr.Interface())
+			if err != nil {
+				return nil, errors.Wrapf(err, "failed to JSON decode message body")
+			}
+		}
+	} else {
+		// Message was small enough, it is contained in the message body
+		err := json.Unmarshal([]byte(message.Body), recordValuePtr.Interface())
+		if err != nil {
+			return nil, errors.Wrapf(err, "failed to JSON decode message body")
+		}
 	}
 
 	if validator, ok := recordValuePtr.Interface().(IValidator); ok {
-- 
GitLab