Skip to content

Commit

Permalink
Extract bulk validator into separate method
Browse files Browse the repository at this point in the history
  • Loading branch information
AchoArnold committed Oct 2, 2023
1 parent 39e5e60 commit f89d915
Showing 1 changed file with 34 additions and 25 deletions.
59 changes: 34 additions & 25 deletions api/pkg/validators/bulk_sms_handler_validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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 {
Expand Down

0 comments on commit f89d915

Please sign in to comment.