Skip to content
Snippets Groups Projects
debug.go 3.16 KiB
Newer Older
package handler_utils

import (
	"bytes"
	"context"
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"os"
	"strings"
Daniel Naude's avatar
Daniel Naude committed

	"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]
	}

Francé Wilke's avatar
Francé Wilke committed
	headers := map[string]string{}
	for key, values := range req.Header {
		if len(values) > 0 {
			headers[key] = values[0]
		}
	}

	// Call lambda function
	request := events.APIGatewayProxyRequest{
		Path:                  req.URL.Path,
		Resource:              req.URL.Path,
		HTTPMethod:            req.Method,
		QueryStringParameters: query,
		Body:                  body,
Francé Wilke's avatar
Francé Wilke committed
		Headers:               headers,
	}

	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
	}

Daniel Naude's avatar
Daniel Naude committed
	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": {
Francé Wilke's avatar
Francé Wilke committed
						StringValue: utils.ValueToPointer(sqsType),
					},
				},
			},
		},
	})

	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")