diff --git a/api_documentation/api_documentation.go b/api_documentation/api_documentation.go index 2322c365ad86ebf31461b634923ca13b4bd8c5d9..d7c17eb555727efb08ed0b40e0a0d41de33c8afe 100644 --- a/api_documentation/api_documentation.go +++ b/api_documentation/api_documentation.go @@ -423,7 +423,7 @@ func GetStructDocs(corePath string) map[string]string { err := filepath.Walk(corePath, walkFunction) if err != nil { - logs.ErrorWithMsg("Failed to upload files to s3", err) + logs.ErrorWithMsg(err, "Failed to upload files to s3") } return docs diff --git a/api_logs/api-logs.go b/api_logs/api-logs.go index 3ea8a07f6b9fedfd45551bfacfde0e66a7da744b..d486db377e2d8b9ffa790f7311be64b6c77d6a47 100644 --- a/api_logs/api-logs.go +++ b/api_logs/api-logs.go @@ -189,6 +189,7 @@ type ApiLog struct { Username string `json:"username,omitempty"` SourceIP string `json:"source_ip,omitempty"` // only logged for incoming API UserAgent string `json:"user_agent,omitempty"` // only for incoming, indicate type of browser when UI + GraphQLQueryRoot string `json:"graphql_query_root,omitempty"` Request ApiLogRequest `json:"request"` Response ApiLogResponse `json:"response"` } diff --git a/api_responses/api_responses.go b/api_responses/api_responses.go index 0f6325532844af3cc285853b644dfbbb07d85afd..71cee6f11d2913ffc91cece1b0e8d088be82ee4a 100644 --- a/api_responses/api_responses.go +++ b/api_responses/api_responses.go @@ -36,11 +36,11 @@ func ServerError(err error, msg string) (events.APIGatewayProxyResponse, error) } func Error(err error, msg string, statusCode int) (events.APIGatewayProxyResponse, error) { - logs.ErrorWithFields(map[string]interface{}{ + logs.ErrorWithFields(err, map[string]interface{}{ "type": "Server error", "message": msg, "code": statusCode, - }, err) + }) serverError := errorMsg{ Message: msg, @@ -81,11 +81,11 @@ func DatabaseServerErrorNew(err error, msg string) error { } else if statusCode == http.StatusConflict { logs.Info("Database conflict: " + msg + ". Code: " + strconv.Itoa(statusCode)) } else { - logs.ErrorWithFields(map[string]interface{}{ + logs.ErrorWithFields(err, map[string]interface{}{ "type": "Database error", "message": msg, "code": statusCode, - }, err) + }) } return ServerErrorStruct{ @@ -125,11 +125,11 @@ func DatabaseServerError(err error, msg string) (events.APIGatewayProxyResponse, } else if statusCode == http.StatusConflict { logs.Info("Database conflict: " + msg + ". Code: " + strconv.Itoa(statusCode)) } else { - logs.ErrorWithFields(map[string]interface{}{ + logs.ErrorWithFields(err, map[string]interface{}{ "type": "Database error", "message": msg, "code": statusCode, - }, err) + }) } serverError := errorMsg{ @@ -220,10 +220,10 @@ func trimBrackets(value string) string { // ClientError creates responses due to request client error func ClientError(status int, message string) (events.APIGatewayProxyResponse, error) { - logs.WarnWithFields(map[string]interface{}{ + logs.WarnWithFields(errors.Error(message), map[string]interface{}{ "type": "Client error", "code": status, - }, errors.Error(message)) + }) e := errorMsg{ Message: message, diff --git a/audit/audit.go b/audit/audit.go index a766d4041b9ecebc4f370a556e162e3f98146572..06b4d2df4052880930f491082300e3e30f5df4f0 100644 --- a/audit/audit.go +++ b/audit/audit.go @@ -235,13 +235,13 @@ func CheckToFormatForAuditEvent(changes map[string]any, original any, new any, f defer func() { if err := recover(); err != nil { - logs.ErrorWithFields(map[string]any{ + logs.ErrorWithFields(errors.Error("Failed to format for audit event"), map[string]any{ "error": err, "field": field, "index": index, "original": fmt.Sprintf("%#v", originalFieldValue), "new": fmt.Sprintf("%#v", newFieldValue), - }, errors.Error("Failed to format for audit event")) + }) didInsert = false } }() diff --git a/batch/batch.go b/batch/batch.go index 7bc147de7c24ceabc0771c04fbeb5c6f91581392..63f53d1c73cf527bdb0580e7f1b48d6c79743fe1 100644 --- a/batch/batch.go +++ b/batch/batch.go @@ -126,7 +126,7 @@ func RetrieveMessageFromS3(filename string, messagesBucketName string, isDebug b var bodyBytes []byte bodyBytes, err = io.ReadAll(rawObject.Body) if err != nil { - logs.ErrorWithMsg("Could not read file", err) + logs.ErrorWithMsg(err, "Could not read file") return bodyBytes, err } return bodyBytes, nil diff --git a/date_utils/date_utils.go b/date_utils/date_utils.go index 66cc9832e622c56a3f2921222e077d729ef57f0d..660d0e264b267a726b381ad1fab3d838e1fa34f5 100644 --- a/date_utils/date_utils.go +++ b/date_utils/date_utils.go @@ -8,12 +8,21 @@ import ( "time" "github.com/jinzhu/now" + "github.com/rickar/cal/v2" + "github.com/rickar/cal/v2/za" + "google.golang.org/api/mybusinessbusinessinformation/v1" "github.com/araddon/dateparse" "gitlab.bob.co.za/bob-public-utils/bobgroup-go-utils/errors" + "gitlab.bob.co.za/bob-public-utils/bobgroup-go-utils/number_utils" ) -const TimeZoneString = "Africa/Johannesburg" +const ( + TimeZoneString = "Africa/Johannesburg" + DurationFifteenMinutes = time.Minute * 15 + DurationOneDay = time.Hour * 24 + DurationOneWeek = DurationOneDay * 7 +) var currentLocation *time.Location @@ -478,8 +487,86 @@ func (day TradingHoursDay) String() string { return startTime.Format("3:04pm") + " – " + endTime.Format("3:04pm") } -const DurationFifteenMinutes = time.Minute * 15 +func (th TradingHours) GoogleMyBusinessRegularHours() *mybusinessbusinessinformation.BusinessHours { + var timePeriods []*mybusinessbusinessinformation.TimePeriod + + iteratableTradingHours := map[string]TradingHoursDay{ + "MONDAY": th.Monday, + "TUESDAY": th.Tuesday, + "WEDNESDAY": th.Wednesday, + "THURSDAY": th.Thursday, + "FRIDAY": th.Friday, + "SATURDAY": th.Saturday, + "SUNDAY": th.Sunday, + } + + for dayOfWeek, tradingHoursDay := range iteratableTradingHours { + if tradingHoursDay.StartTime == "" || tradingHoursDay.EndTime == "" { + continue + } + + timePeriods = append(timePeriods, &mybusinessbusinessinformation.TimePeriod{ + OpenDay: dayOfWeek, + OpenTime: googleMyBusinessTimeOfDayFromString(tradingHoursDay.StartTime), + CloseDay: dayOfWeek, + CloseTime: googleMyBusinessTimeOfDayFromString(tradingHoursDay.EndTime), + }) + } + + return &mybusinessbusinessinformation.BusinessHours{ + Periods: timePeriods, + } +} + +func (th TradingHours) GoogleMyBusinessSpecialHoursForTheNextYear() *mybusinessbusinessinformation.SpecialHours { + var specialHourPeriods []*mybusinessbusinessinformation.SpecialHourPeriod + calendar := cal.NewBusinessCalendar() + calendar.AddHoliday(za.Holidays...) + + for i := 0; i < 365; i++ { + day := CurrentDate().AddDate(0, 0, i) + if _, observed, _ := calendar.IsHoliday(day); observed { + var specialHourPeriod mybusinessbusinessinformation.SpecialHourPeriod + specialHourPeriodDay := &mybusinessbusinessinformation.Date{ + Year: int64(day.Year()), + Month: int64(day.Month()), + Day: int64(day.Day()), + } + specialHourPeriod.StartDate = specialHourPeriodDay + specialHourPeriod.OpenTime = googleMyBusinessTimeOfDayFromString(th.Holidays.StartTime) + if th.Holidays.StartTime == "" || th.Holidays.EndTime == "" { + specialHourPeriod.Closed = true + } + specialHourPeriod.EndDate = specialHourPeriodDay + specialHourPeriod.CloseTime = googleMyBusinessTimeOfDayFromString(th.Holidays.EndTime) + specialHourPeriods = append(specialHourPeriods, &specialHourPeriod) + } + } + + return &mybusinessbusinessinformation.SpecialHours{ + SpecialHourPeriods: specialHourPeriods, + } +} + +func googleMyBusinessTimeOfDayFromString(timeString string) *mybusinessbusinessinformation.TimeOfDay { + if timeString == "" { + return nil + } + + hoursString := strings.Split(timeString, ":")[0] + hours, err := number_utils.StringToInt64(hoursString) + if err != nil { + return nil + } -const DurationOneDay = time.Hour * 24 + minutesString := strings.Split(timeString, ":")[1] + minutes, err := number_utils.StringToInt64(minutesString) + if err != nil { + return nil + } -const DurationOneWeek = DurationOneDay * 7 + return &mybusinessbusinessinformation.TimeOfDay{ + Hours: hours, + Minutes: minutes, + } +} diff --git a/encryption/encryption_keys.go b/encryption/encryption_keys.go index 6b0f9ec59a62faceebde957f1fd7cbce43d0b840..d981588736f046ef3b1331e5ab9969e167b5cbfd 100644 --- a/encryption/encryption_keys.go +++ b/encryption/encryption_keys.go @@ -37,7 +37,7 @@ func GetEncryptionKeys(secretID string, isDebug bool) (EncryptionKeys, error) { func GetJWTEncryptionKey(secretID string, isDebug bool) (string, error) { encryptionKeys, err := GetEncryptionKeys(secretID, isDebug) if err != nil { - logs.ErrorWithMsg("Could not get encryption keys from secret manager", err) + logs.ErrorWithMsg(err, "Could not get encryption keys from secret manager") return "", errors.Error("failed to get encryption keys for login") } return encryptionKeys.JWTEncryptionKey, nil diff --git a/go.mod b/go.mod index 0e047d9a2931c85b91db873f586575993213ad39..6d05d75a80f3a2efd3aadad838d5e5921af7d1ef 100644 --- a/go.mod +++ b/go.mod @@ -35,15 +35,16 @@ require ( github.com/pquerna/otp v1.4.0 github.com/prozz/aws-embedded-metrics-golang v1.2.0 github.com/r3labs/diff/v2 v2.14.2 + github.com/rickar/cal/v2 v2.1.21 github.com/samber/lo v1.38.1 github.com/sirupsen/logrus v1.8.1 github.com/slack-go/slack v0.15.0 github.com/thoas/go-funk v0.9.1 github.com/uptrace/bun v1.1.17 golang.ngrok.com/ngrok v1.4.1 - golang.org/x/crypto v0.31.0 + golang.org/x/crypto v0.32.0 golang.org/x/text v0.21.0 - google.golang.org/api v0.214.0 + google.golang.org/api v0.216.0 gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df ) @@ -78,7 +79,7 @@ require ( github.com/golang/protobuf v1.5.4 // indirect github.com/google/s2a-go v0.1.8 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect - github.com/googleapis/gax-go/v2 v2.14.0 // indirect + github.com/googleapis/gax-go/v2 v2.14.1 // indirect github.com/gorilla/websocket v1.4.2 // indirect github.com/hbollon/go-edlib v1.6.0 // indirect github.com/inconshreveable/log15 v3.0.0-testing.3+incompatible // indirect @@ -101,20 +102,21 @@ require ( github.com/vmihailenco/tagparser v0.1.2 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 // indirect - go.opentelemetry.io/otel v1.29.0 // indirect - go.opentelemetry.io/otel/metric v1.29.0 // indirect - go.opentelemetry.io/otel/trace v1.29.0 // indirect + go.opentelemetry.io/otel v1.31.0 // indirect + go.opentelemetry.io/otel/metric v1.31.0 // indirect + go.opentelemetry.io/otel/trace v1.31.0 // indirect go.uber.org/multierr v1.10.0 // indirect golang.ngrok.com/muxado/v2 v2.0.0 // indirect - golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 // indirect - golang.org/x/net v0.33.0 // indirect - golang.org/x/oauth2 v0.24.0 // indirect - golang.org/x/sys v0.28.0 // indirect - golang.org/x/term v0.27.0 // indirect + golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect + golang.org/x/net v0.34.0 // indirect + golang.org/x/oauth2 v0.25.0 // indirect + golang.org/x/sys v0.29.0 // indirect + golang.org/x/term v0.28.0 // indirect google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20241223144023-3abc09e42ca8 // indirect - google.golang.org/grpc v1.67.1 // indirect - google.golang.org/protobuf v1.36.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250106144421-5f5ef82da422 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250106144421-5f5ef82da422 // indirect + google.golang.org/grpc v1.69.2 // indirect + google.golang.org/protobuf v1.36.2 // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect mellium.im/sasl v0.2.1 // indirect ) diff --git a/go.sum b/go.sum index c97ddc41107d5e495f8b794a1eadbc2fcc2e77ac..bd0354a882c929f30213fc0cfdbe1c18a464a611 100644 --- a/go.sum +++ b/go.sum @@ -165,8 +165,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw= github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= -github.com/googleapis/gax-go/v2 v2.14.0 h1:f+jMrjBPl+DL9nI4IQzLUxMq7XrAqFYB7hBPqMNIe8o= -github.com/googleapis/gax-go/v2 v2.14.0/go.mod h1:lhBCnjdLrWRaPvLWhmc8IS24m9mr07qSYnHncrgo+zk= +github.com/googleapis/gax-go/v2 v2.14.1 h1:hb0FFeiPaQskmvakKu5EbCbpntQn48jyHuvrkurSS/Q= +github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= @@ -249,6 +249,8 @@ github.com/prozz/aws-embedded-metrics-golang v1.2.0 h1:b/LFb8J9LbgANow/9nYZE3M3b github.com/prozz/aws-embedded-metrics-golang v1.2.0/go.mod h1:MXOqF9cJCEHjj77LWq7NWK44/AOyaFzwmcAYqR3057M= github.com/r3labs/diff/v2 v2.14.2 h1:1HVhQKwg1YnoCWzCYlOWYLG4C3yfTudZo5AcrTSgCTc= github.com/r3labs/diff/v2 v2.14.2/go.mod h1:I8noH9Fc2fjSaMxqF3G2lhDdC0b+JXCfyx85tWFM9kc= +github.com/rickar/cal/v2 v2.1.21 h1:ghZzbiF/T2xrqFjBZ/EypocIus9Law19TnLygGcmzhg= +github.com/rickar/cal/v2 v2.1.21/go.mod h1:/fdlMcx7GjPlIBibMzOM9gMvDBsrK+mOtRXdTzUqV/A= github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -305,12 +307,16 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.5 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8= -go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw= -go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8= -go.opentelemetry.io/otel/metric v1.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2g+8YLc= -go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8= -go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4= -go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ= +go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= +go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= +go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE= +go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= +go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk= +go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= +go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= +go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= +go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys= +go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= golang.ngrok.com/muxado/v2 v2.0.0 h1:bu9eIDhRdYNtIXNnqat/HyMeHYOAbUH55ebD7gTvW6c= @@ -323,11 +329,11 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= -golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= +golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 h1:3MTrJm4PyNL9NBqvYDSj3DHl46qQakyfqfWo4jgfaEM= -golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -353,11 +359,11 @@ golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= -golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= -golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= +golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= +golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= -golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.25.0 h1:CY4y7XT9v0cRI9oupztF8AgiIu99L/ksR/Xp/6jrZ70= +golang.org/x/oauth2 v0.25.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -390,16 +396,16 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= -golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= +golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= -golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= -golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= +golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= +golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -412,8 +418,8 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg= -golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY= +golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -428,8 +434,8 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.214.0 h1:h2Gkq07OYi6kusGOaT/9rnNljuXmqPnaig7WGPmKbwA= -google.golang.org/api v0.214.0/go.mod h1:bYPpLG8AyeMWwDU6NXoB00xC0DFkikVvd5MfwoxjLqE= +google.golang.org/api v0.216.0 h1:xnEHy+xWFrtYInWPy8OdGFsyIfWJjtVnO39g7pz2BFY= +google.golang.org/api v0.216.0/go.mod h1:K9wzQMvWi47Z9IU7OgdOofvZuw75Ge3PPITImZR/UyI= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= @@ -438,13 +444,15 @@ google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJ google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241223144023-3abc09e42ca8 h1:TqExAhdPaB60Ux47Cn0oLV07rGnxZzIsaRhQaqS666A= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241223144023-3abc09e42ca8/go.mod h1:lcTa1sDdWEIHMWlITnIczmw5w60CF9ffkb8Z+DVmmjA= +google.golang.org/genproto/googleapis/api v0.0.0-20250106144421-5f5ef82da422 h1:GVIKPyP/kLIyVOgOnTwFOrvQaQUzOzGMCxgFUOEmm24= +google.golang.org/genproto/googleapis/api v0.0.0-20250106144421-5f5ef82da422/go.mod h1:b6h1vNKhxaSoEI+5jc3PJUCustfli/mRab7295pY7rw= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250106144421-5f5ef82da422 h1:3UsHvIr4Wc2aW4brOaSCmcxh9ksica6fHEr8P1XhkYw= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250106144421-5f5ef82da422/go.mod h1:3ENsm/5D1mzDyhpzeRi1NR784I0BcofWBoSc5QqqMK4= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= -google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +google.golang.org/grpc v1.69.2 h1:U3S9QEtbXC0bYNvRtcoklF3xGtLViumSYxWykJS+7AU= +google.golang.org/grpc v1.69.2/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -456,8 +464,8 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.36.0 h1:mjIs9gYtt56AzC4ZaffQuh88TZurBGhIJMBZGSxNerQ= -google.golang.org/protobuf v1.36.0/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.2 h1:R8FeyR1/eLmkutZOM5CWghmo5itiG9z0ktFlTVLuTmU= +google.golang.org/protobuf v1.36.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/logs/logs.go b/logs/logs.go index 804988b8faa96e53e609538042d0c2b5d14ce60a..d9aaf9fda10ad62329f0f71ea71bb4dbf6d1c0a4 100644 --- a/logs/logs.go +++ b/logs/logs.go @@ -226,7 +226,7 @@ func Info(format string, a ...interface{}) { } } -func ErrorWithFields(fields map[string]interface{}, err error) { +func ErrorWithFields(err error, fields map[string]interface{}) { if disableLogging { return } @@ -242,17 +242,20 @@ func ErrorWithFields(fields map[string]interface{}, err error) { } } -func ErrorWithMsg(message string, err error) { +func ErrorWithMsg(err error, format string, a ...interface{}) { if disableLogging { return } + message := fmt.Sprintf(format, a...) + if err == nil { err = errors.Error(message) } - ErrorWithFields(map[string]interface{}{ + + ErrorWithFields(err, map[string]interface{}{ "message": message, - }, err) + }) } func ErrorMsg(format string, a ...interface{}) { @@ -262,7 +265,7 @@ func ErrorMsg(format string, a ...interface{}) { message := SanitiseLogs(fmt.Sprintf(format, a...)) - ErrorWithMsg(message, nil) + ErrorWithMsg(nil, message) } func Warn(format string, a ...interface{}) { @@ -280,7 +283,7 @@ func Warn(format string, a ...interface{}) { } } -func WarnWithFields(fields map[string]interface{}, err error) { +func WarnWithFields(err error, fields map[string]interface{}) { if disableLogging { return } diff --git a/logs/logs_test.go b/logs/logs_test.go index 4abfb867f46b800a6d5d6105abfe1175addea5d3..1aaac22976781b10f8a9f4787aae8e3370c10657 100644 --- a/logs/logs_test.go +++ b/logs/logs_test.go @@ -19,10 +19,10 @@ func TestLogs(t *testing.T) { logs.InfoWithFields(map[string]interface{}{"a": 1, "b": 2}, "MyLogMessage1") logs.Info("MyLogMessage2=%d,%d,%d", 1, 2, 3) - logs.ErrorWithFields(map[string]interface{}{"a": 4, "b": 5}, errors.Errorf("simple mistake")) - logs.ErrorWithMsg("Error Message", errors.Errorf("another simple mistake")) + logs.ErrorWithFields(errors.Errorf("simple mistake"), map[string]interface{}{"a": 4, "b": 5}) + logs.ErrorWithMsg(errors.Errorf("another simple mistake"), "Error Message") logs.Warn("Warning about a=%s,%s,%s", "a", "b", "c") - logs.WarnWithFields(map[string]interface{}{"a": 4, "b": 5}, errors.Errorf("Cant believe it failed")) + logs.WarnWithFields(errors.Errorf("Cant believe it failed"), map[string]interface{}{"a": 4, "b": 5}) logs.SQLDebugInfo("SELECT * from user") // logs.LogRequestInfo(event) // api_logs.LogSQSEvent(sqsEvent) diff --git a/redis/redis.go b/redis/redis.go index 98972ed47dd4b2d58667a83ceff76db2f5d59f1f..8b6f3ee90e61adc85730839b897cbaa2a909809c 100644 --- a/redis/redis.go +++ b/redis/redis.go @@ -124,13 +124,13 @@ func (r ClientWithHelpers) SetObjectByKey(key string, object interface{}) { jsonBytes, err := json.Marshal(object) if err != nil { - logs.ErrorWithMsg("Error marshalling object to Redis: %s", err) + logs.ErrorWithMsg(err, "Error marshalling object to Redis: %s") return } _, err = r.Client.Set(ctx, key, string(jsonBytes), 24*time.Hour).Result() if err != nil { - logs.ErrorWithMsg(fmt.Sprintf("Error setting value to Redis for key: %s", key), err) + logs.ErrorWithMsg(err, "Error setting value to Redis for key: %s", key) /* Prevent further calls in this execution from trying to connect and also timeout */ if strings.HasSuffix(err.Error(), "i/o timeout") { @@ -146,13 +146,13 @@ func (r ClientWithHelpers) SetObjectByKeyWithExpiry(key string, object interface jsonBytes, err := json.Marshal(object) if err != nil { - logs.ErrorWithMsg("Error marshalling object to Redis: %s", err) + logs.ErrorWithMsg(err, "Error marshalling object to Redis: %s") return } _, err = r.Client.Set(ctx, key, string(jsonBytes), expiration).Result() if err != nil { - logs.ErrorWithMsg(fmt.Sprintf("Error setting value to Redis for key: %s", key), err) + logs.ErrorWithMsg(err, "Error setting value to Redis for key: %s", key) /* Prevent further calls in this execution from trying to connect and also timeout */ if strings.HasSuffix(err.Error(), "i/o timeout") { @@ -168,13 +168,13 @@ func (r ClientWithHelpers) SetObjectByKeyIndefinitely(key string, object interfa jsonBytes, err := json.Marshal(object) if err != nil { - logs.ErrorWithMsg("Error marshalling object to Redis", err) + logs.ErrorWithMsg(err, "Error marshalling object to Redis") return } _, err = r.Client.Set(ctx, key, string(jsonBytes), 0).Result() if err != nil { - logs.ErrorWithMsg(fmt.Sprintf("Error setting value to Redis for key: %s", key), err) + logs.ErrorWithMsg(err, "Error setting value to Redis for key: %s", key) /* Prevent further calls in this execution from trying to connect and also timeout */ if strings.HasSuffix(err.Error(), "i/o timeout") { @@ -237,7 +237,7 @@ func (r ClientWithHelpers) RateLimit(key string, limitFn func(int) redis_rate.Li limiter := redis_rate.NewLimiter(r.Client) res, err := limiter.Allow(ctx, key, limitFn(limit)) if err != nil { - logs.ErrorWithMsg(fmt.Sprintf("Redis Error rate limiting - %s", key), err) + logs.ErrorWithMsg(err, "Redis Error rate limiting - %s", key) /* Prevent further calls in this execution from trying to connect and also timeout */ if strings.HasSuffix(err.Error(), "i/o timeout") { @@ -280,7 +280,7 @@ func (r ClientWithHelpers) SetLockKey(key string, expiration time.Duration, lock for retries >= 0 { success, err = r.Client.SetNX(ctx, key, value, expiration).Result() if err != nil { - logs.ErrorWithMsg(fmt.Sprintf("Error setting lock key %s", key), err) + logs.ErrorWithMsg(err, "Error setting lock key %s", key) // Prevent further calls in this execution from trying to connect and also timeout if strings.HasSuffix(err.Error(), "i/o timeout") { diff --git a/ses/ses.go b/ses/ses.go index 3b281ca83706f2669322cc33a4eb02f8ecc8e455..be6a991bdf2cc5d85752e7907d7cc363018e29b4 100644 --- a/ses/ses.go +++ b/ses/ses.go @@ -3,7 +3,6 @@ package ses import ( "bytes" "context" - "fmt" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/ses" @@ -151,13 +150,13 @@ func (c *ClientWithHelpers) SendEmail(email Email, emfNamespace string, isDebug switch errors.AWSErrorExceptionCode(err) { case messageRejectedErrorCode, mailFromDomainNotVerifiedErrorCode, configurationSetDoesNotExistErrorCode: - logs.ErrorWithMsg(errors.AWSErrorExceptionCode(err), err) + logs.ErrorWithMsg(err, errors.AWSErrorExceptionCode(err)) case InvalidParameterValueErrorString: // Ignore errors due to invalid email addresses - we don't want to log it to raygun logs.Warn(err.Error()) err = nil default: - logs.ErrorWithMsg("Failed to send email", err) + logs.ErrorWithMsg(err, "Failed to send email") } if emfNamespace != "" { @@ -187,14 +186,14 @@ func addAttachmentsToEmail(msg *gomail.Message, attachment s3.S3UploadResponse, // Get object from S3 object, err := s3.GetClient(isDebug).GetObject(attachment.Bucket, attachment.Filename, isDebug) if err != nil { - logs.ErrorWithMsg(fmt.Sprintf("Failed to get S3 object from bucket %s filename %s", attachment.Bucket, attachment.Filename), err) + logs.ErrorWithMsg(err, "Failed to get S3 object from bucket %s filename %s", attachment.Bucket, attachment.Filename) return err } defer object.Body.Close() attachmentBytes, err := io.ReadAll(object.Body) if err != nil { - logs.ErrorWithMsg("Could not encode attachment for email", err) + logs.ErrorWithMsg(err, "Could not encode attachment for email") return err } diff --git a/slack_utils/slack_utils.go b/slack_utils/slack_utils.go index 1d35bc19786454f2fb49995eea71d867a62ecf9e..f3ca9eceb76ba64e06a9fc83e653785e152bd100 100644 --- a/slack_utils/slack_utils.go +++ b/slack_utils/slack_utils.go @@ -47,7 +47,7 @@ func (s *SlackClient) SendAlertWithFields(message string, channel string, slackF if s == nil || s.Client == nil { // If the slack client isn't set, log the message to Raygun instead slackFieldMap := slackFieldsToMap(slackFields) - logs.ErrorWithFields(slackFieldMap, errors.Error(message)) + logs.ErrorWithFields(errors.Error(message), slackFieldMap) return "" } @@ -111,7 +111,7 @@ func (s *SlackClient) SendAlertWithFields(message string, channel string, slackF func (s *SlackClient) postMessage(channel string, messageOptions []slack.MsgOption) string { _, messageTimestamp, err := s.Client.PostMessage(channel, messageOptions...) if err != nil { - logs.ErrorWithMsg("Error sending slack: %v+\n", err) + logs.ErrorWithMsg(err, "Error sending slack:") } return messageTimestamp } diff --git a/sqs/sqs.go b/sqs/sqs.go index 0d0259ff033a771a50034fe9cca477a5cc87eb3d..a51408237869c6c3dec00ed819aab286cbf6b200 100644 --- a/sqs/sqs.go +++ b/sqs/sqs.go @@ -6,10 +6,12 @@ import ( "context" "encoding/json" "fmt" - "gitlab.bob.co.za/bob-public-utils/bobgroup-go-utils/utils" "io" + "sync" "time" + "gitlab.bob.co.za/bob-public-utils/bobgroup-go-utils/utils" + "github.com/google/uuid" "gitlab.bob.co.za/bob-public-utils/bobgroup-go-utils/s3" @@ -108,7 +110,10 @@ func (m *Messenger) SendSQSMessage(headers map[string]string, body string, curre func SendSQSMessage(msgr Messenger, objectToSend interface{}, currentRequestID *string, sqsType string, isDebug bool) error { if isDebug { + var wg sync.WaitGroup + wg.Add(1) go func() { + defer wg.Done() if msgr.DelaySeconds != nil { delay := *msgr.DelaySeconds time.Sleep(time.Second * time.Duration(delay)) @@ -118,6 +123,7 @@ func SendSQSMessage(msgr Messenger, objectToSend interface{}, currentRequestID * Post("http://127.0.0.1:3000/sqs/" + sqsType) }() time.Sleep(time.Second * 1) + wg.Wait() return nil } @@ -125,13 +131,13 @@ func SendSQSMessage(msgr Messenger, objectToSend interface{}, currentRequestID * var err error sqsClient, err = NewSQSClient(msgr.Region) if err != nil { - logs.ErrorWithMsg("Failed to create sqs client", err) + logs.ErrorWithMsg(err, "Failed to create sqs client") } } jsonBytes, err := json.Marshal(objectToSend) if err != nil { - logs.ErrorWithMsg("Failed to encode sqs event data", err) + logs.ErrorWithMsg(err, "Failed to encode sqs event data") return err } @@ -159,7 +165,7 @@ func SendSQSMessage(msgr Messenger, objectToSend interface{}, currentRequestID * msgID, err := msgr.SendSQSMessage(headers, message, currentRequestID, sqsType) if err != nil { - logs.ErrorWithMsg("Failed to send sqs event", err) + logs.ErrorWithMsg(err, "Failed to send sqs event") return err } @@ -191,7 +197,7 @@ func RetrieveMessageFromS3(client *s3.ClientWithHelpers, bucket string, filename var bodyBytes []byte bodyBytes, err = io.ReadAll(rawObject.Body) if err != nil { - logs.ErrorWithMsg("Could not read file", err) + logs.ErrorWithMsg(err, "Could not read file") return []byte{}, err }