Newer
Older
package handler_utils
import (
"bytes"
"context"
"encoding/base64"
"encoding/json"
"fmt"
"io"
"net/http"
"os"
"strings"
"github.com/aws/aws-lambda-go/events"
"github.com/aws/aws-lambda-go/lambda"
"gitlab.bob.co.za/bob-public-utils/bobgroup-go-utils/utils"
)
// ========================================================================
// HTTP functions
// ========================================================================
func ServeHTTPFunctions(ctx context.Context, lambdaHandler lambda.Handler, w http.ResponseWriter, req *http.Request) {
// Read body
buf := new(bytes.Buffer)
_, err := buf.ReadFrom(req.Body)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
req.Body.Close()
body := buf.String()
// Read Query
queryValues := req.URL.Query()
query := map[string]string{}
for key, values := range queryValues {
query[key] = values[0]
}
headers := map[string]string{}
for key, values := range req.Header {
if len(values) > 0 {
headers[key] = values[0]
}
}
// Call lambda function
request := events.APIGatewayProxyRequest{
Resource: req.URL.Path,
HTTPMethod: req.Method,
QueryStringParameters: query,
Body: body,
}
jsonRequest, _ := json.Marshal(request)
responseBytes, err := lambdaHandler.Invoke(ctx, jsonRequest)
if err != nil {
panic(err)
}
// Parse response
response := map[string]any{}
err = json.Unmarshal(responseBytes, &response)
if err != nil {
return
}
for key, value := range response["headers"].(map[string]interface{}) {
w.Header().Set(key, value.(string))
}
if w.Header().Get("Content-Type") == "" {
w.Header().Set("Content-Type", "application/json")
}
w.WriteHeader(int(response["statusCode"].(float64)))
if isBase64Encoded, ok := response["isBase64Encoded"]; ok && isBase64Encoded.(bool) {
decoded, err := base64.StdEncoding.DecodeString(response["body"].(string))
if err != nil {
panic(err)
}
_, _ = w.Write(decoded)
return
}
_, _ = io.WriteString(w, response["body"].(string))
}
// ========================================================================
// SQS Functions
// ========================================================================
func ServeSQSFunctions(ctx context.Context, lambdaHandler lambda.Handler, w http.ResponseWriter, req *http.Request) {
// Read body
buf := new(bytes.Buffer)
_, err := buf.ReadFrom(req.Body)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
req.Body.Close()
body := buf.String()
sqsType := req.URL.Path
sqsType = strings.ReplaceAll(sqsType, "/sqs/", "")
// Call lambda function
sqsRequest, _ := json.Marshal(events.SQSEvent{
Records: []events.SQSMessage{
{
Body: body,
MessageAttributes: map[string]events.SQSMessageAttribute{
"type": {
},
},
},
},
})
responseBytes, err := lambdaHandler.Invoke(ctx, sqsRequest)
if err != nil {
panic(err)
}
// Parse response
response := map[string]any{}
err = json.Unmarshal(responseBytes, &response)
if err != nil {
_, _ = io.WriteString(w, err.Error())
_, _ = io.WriteString(w, "done")