Select Git revision
-
Francé Wilke authoredFrancé Wilke authored
sqs.go 1.86 KiB
package handler_utils
import (
"encoding/json"
"github.com/aws/aws-lambda-go/events"
"gitlab.com/uafrica/go-utils/errors"
"gitlab.com/uafrica/go-utils/logs"
"reflect"
)
// ValidateSQSEndpoints checks that all SQS endpoints are correctly defined using one of the supported handler types
// return updated endpoints with additional information
func ValidateSQSEndpoints(endpoints map[string]interface{}) (map[string]interface{}, error) {
countLegacy := 0
countHandler := 0
for messageType, handlerFunc := range endpoints {
if messageType == "" {
return nil, errors.Errorf("blank messageType")
}
if handlerFunc == nil {
return nil, errors.Errorf("nil handler on %s", messageType)
}
if _, ok := handlerFunc.(func(req events.SQSEvent) (err error)); ok {
// ok - leave as is - we support this legacyHandler
countLegacy++
} else {
handler, err := NewSQSHandler(handlerFunc)
if err != nil {
return nil, errors.Wrapf(err, "%v has invalid handler %T", messageType, handlerFunc)
}
// replace the endpoint value so we can quickly call this handler
endpoints[messageType] = handler
logs.Info("%s: OK (request: %v)\n", messageType, handler.RecordType)
countHandler++
}
}
logs.Info("Checked %d legacy and %d new handlers\n", countLegacy, countHandler)
return endpoints, nil
}
func GetRecord(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")
}
if validator, ok := recordValuePtr.Interface().(IValidator); ok {
if err := validator.Validate(); err != nil {
return nil, errors.Wrapf(err, "invalid message body")
}
}
return recordValuePtr.Elem().Interface(), nil
}
type IValidator interface {
Validate() error
}