diff --git a/api/pkg/validators/bulk_sms_handler_validator.go b/api/pkg/validators/bulk_sms_handler_validator.go index 50734d9e..f4a89fb4 100644 --- a/api/pkg/validators/bulk_sms_handler_validator.go +++ b/api/pkg/validators/bulk_sms_handler_validator.go @@ -46,6 +46,35 @@ func (v *BulkMessageHandlerValidator) ValidateStore(ctx context.Context, userID ctx, span, ctxLogger := v.tracer.StartWithLogger(ctx, v.logger) defer span.End() + messages, result := v.parseCSV(ctxLogger, userID, header) + if len(result) != 0 { + return messages, result + } + + if len(messages) == 0 { + result.Add("document", "The CSV file doesn't contain any valid records. Make sure you are using the official httpSMS template.") + return messages, result + } + + if len(messages) > 100 { + result.Add("document", "The CSV file must contain less than 100 records.") + return messages, result + } + + result = v.validateMessages(messages) + if len(result) != 0 { + return messages, result + } + + result = v.validateOwners(ctx, userID, messages) + if len(result) != 0 { + return messages, result + } + + return messages, result +} + +func (v *BulkMessageHandlerValidator) parseCSV(ctxLogger telemetry.Logger, userID entities.UserID, header *multipart.FileHeader) ([]*requests.BulkMessage, url.Values) { result := url.Values{} if header.Size >= 5000000 { @@ -55,51 +84,31 @@ func (v *BulkMessageHandlerValidator) ValidateStore(ctx context.Context, userID file, err := header.Open() if err != nil { - ctxLogger.Error(stacktrace.Propagate(err, fmt.Sprintf("cannot open file [%s] for reading", header.Filename))) + ctxLogger.Error(stacktrace.Propagate(err, fmt.Sprintf("cannot open file [%s] for reading for user [%s]", header.Filename, userID))) result.Add("document", fmt.Sprintf("Cannot open the uploaded file with name [%s].", header.Filename)) return nil, result } defer func() { if e := file.Close(); e != nil { - ctxLogger.Error(stacktrace.Propagate(e, fmt.Sprintf("cannot close file [%s]", header.Filename))) + ctxLogger.Error(stacktrace.Propagate(e, fmt.Sprintf("cannot close file [%s] for user [%s]", header.Filename, userID))) } }() b := new(bytes.Buffer) if _, err = io.Copy(b, file); err != nil { - ctxLogger.Error(stacktrace.Propagate(err, fmt.Sprintf("cannot copy file [%s] to buffer", header.Filename))) + ctxLogger.Error(stacktrace.Propagate(err, fmt.Sprintf("cannot copy file [%s] to buffer for user [%s]", header.Filename, userID))) result.Add("document", fmt.Sprintf("Cannot read the conents of the uploaded file [%s].", header.Filename)) return nil, result } var messages []*requests.BulkMessage if err := csvutil.Unmarshal(b.Bytes(), &messages); err != nil { - ctxLogger.Error(stacktrace.Propagate(err, fmt.Sprintf("cannot unmarshall contents [%s] into type [%T] for file [%s]", b.Bytes(), messages, header.Filename))) + ctxLogger.Error(stacktrace.Propagate(err, fmt.Sprintf("cannot unmarshall contents [%s] into type [%T] for file [%s] and user [%s]", b.Bytes(), messages, header.Filename, userID))) result.Add("document", fmt.Sprintf("Cannot read the conents of the uploaded file [%s].", header.Filename)) return nil, result } - if len(messages) == 0 { - result.Add("document", "The CSV file doesn't contain any valid records. Make sure you are using the official httpSMS template.") - return messages, result - } - - if len(messages) > 100 { - result.Add("document", "The CSV file must contain less than 100 records.") - return messages, result - } - - result = v.validateMessages(messages) - if len(result) != 0 { - return messages, result - } - - result = v.validateOwners(ctx, userID, messages) - if len(result) != 0 { - return messages, result - } - - return messages, result + return messages, nil } func (v *BulkMessageHandlerValidator) validateMessages(messages []*requests.BulkMessage) url.Values {