Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

B 22609 int #14913

Open
wants to merge 2 commits into
base: integrationTesting
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions pkg/gen/ghcapi/embedded_spec.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 14 additions & 1 deletion pkg/handlers/ghcapi/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
ghcops "github.com/transcom/mymove/pkg/gen/ghcapi/ghcoperations"
"github.com/transcom/mymove/pkg/handlers"
paperwork "github.com/transcom/mymove/pkg/paperwork"
paperworkgenerator "github.com/transcom/mymove/pkg/paperwork"
paymentrequesthelper "github.com/transcom/mymove/pkg/payment_request"
"github.com/transcom/mymove/pkg/services/address"
boatshipment "github.com/transcom/mymove/pkg/services/boat_shipment"
Expand Down Expand Up @@ -56,6 +57,7 @@ import (
"github.com/transcom/mymove/pkg/services/upload"
usersroles "github.com/transcom/mymove/pkg/services/users_roles"
weightticket "github.com/transcom/mymove/pkg/services/weight_ticket"
weightticketparser "github.com/transcom/mymove/pkg/services/weight_ticket_parser"
"github.com/transcom/mymove/pkg/uploader"
)

Expand Down Expand Up @@ -730,7 +732,18 @@ func NewGhcAPIHandler(handlerConfig handlers.HandlerConfig) *ghcops.MymoveAPI {
paymentPacketCreator := ppmshipment.NewPaymentPacketCreator(ppmShipmentFetcher, pdfGenerator, AOAPacketCreator)
ghcAPI.PpmShowPaymentPacketHandler = ShowPaymentPacketHandler{handlerConfig, paymentPacketCreator}

ghcAPI.UploadsCreateUploadHandler = CreateUploadHandler{handlerConfig}
pdfGenerator, err = paperworkgenerator.NewGenerator(userUploader.Uploader())
if err != nil {
log.Fatalln(err)
}

parserComputer := weightticketparser.NewWeightTicketComputer()
weightGenerator, err := weightticketparser.NewWeightTicketParserGenerator(pdfGenerator)
if err != nil {
log.Fatalln(err)
}

ghcAPI.UploadsCreateUploadHandler = CreateUploadHandler{handlerConfig, parserComputer, weightGenerator}
ghcAPI.UploadsUpdateUploadHandler = UpdateUploadHandler{handlerConfig, upload.NewUploadInformationFetcher()}
ghcAPI.UploadsDeleteUploadHandler = DeleteUploadHandler{handlerConfig, upload.NewUploadInformationFetcher()}
ghcAPI.UploadsGetUploadStatusHandler = GetUploadStatusHandler{handlerConfig, upload.NewUploadInformationFetcher()}
Expand Down
135 changes: 115 additions & 20 deletions pkg/handlers/ghcapi/uploads.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,17 @@ package ghcapi
import (
"context"
"fmt"
"io"
"net/http"
"path/filepath"
"regexp"
"strconv"
"strings"
"time"

"github.com/go-openapi/runtime"
"github.com/go-openapi/runtime/middleware"
"github.com/gobuffalo/validate/v3"
"github.com/gofrs/uuid"
"github.com/pkg/errors"
"go.uber.org/zap"
Expand All @@ -22,12 +27,17 @@ import (
"github.com/transcom/mymove/pkg/notifications"
"github.com/transcom/mymove/pkg/services"
"github.com/transcom/mymove/pkg/services/upload"
weightticketparser "github.com/transcom/mymove/pkg/services/weight_ticket_parser"
"github.com/transcom/mymove/pkg/storage"
uploaderpkg "github.com/transcom/mymove/pkg/uploader"
)

const weightEstimatePages = 11

type CreateUploadHandler struct {
handlers.HandlerConfig
services.WeightTicketComputer
services.WeightTicketGenerator
}

func (h CreateUploadHandler) Handle(params uploadop.CreateUploadParams) middleware.Responder {
Expand Down Expand Up @@ -66,29 +76,114 @@ func (h CreateUploadHandler) Handle(params uploadop.CreateUploadParams) middlewa
docID = &document.ID
}

newUserUpload, url, verrs, createErr := uploaderpkg.CreateUserUploadForDocumentWrapper(
appCtx,
appCtx.Session().UserID,
h.FileStorer(),
file,
file.Header.Filename,
uploaderpkg.MaxCustomerUserUploadFileSizeLimit,
uploaderpkg.AllowedTypesServiceMember,
docID,
models.UploadTypeOFFICE,
)
var newUserUpload *models.UserUpload
var verrs *validate.Errors
var url string
var createErr error
isWeightEstimatorFile := false

// extract extension from filename
filename := file.Header.Filename
timestampPattern := regexp.MustCompile(`-(\d{14})$`)

timestamp := ""
filenameWithoutTimestamp := ""
if matches := timestampPattern.FindStringSubmatch(filename); len(matches) > 1 {
timestamp = matches[1]
filenameWithoutTimestamp = strings.TrimSuffix(filename, "-"+timestamp)
} else {
filenameWithoutTimestamp = filename
}

extension := filepath.Ext(filenameWithoutTimestamp)
extensionLower := strings.ToLower(extension)

// check if file is an excel file
if extensionLower == ".xlsx" {
var err error

isWeightEstimatorFile, err = weightticketparser.IsWeightEstimatorFile(appCtx, file)

if verrs.HasAny() || createErr != nil {
appCtx.Logger().Error("failed to create new user upload", zap.Error(createErr), zap.String("verrs", verrs.Error()))
switch createErr.(type) {
case uploaderpkg.ErrTooLarge:
return uploadop.NewCreateUploadRequestEntityTooLarge(), rollbackErr
case uploaderpkg.ErrFile:
if err != nil {
return uploadop.NewCreateUploadInternalServerError(), rollbackErr
case uploaderpkg.ErrFailedToInitUploader:
}

_, err = file.Data.Seek(0, io.SeekStart)

if err != nil {
return uploadop.NewCreateUploadInternalServerError(), rollbackErr
default:
return handlers.ResponseForVErrors(appCtx.Logger(), verrs, createErr), rollbackErr
}
}

if params.WeightReceipt && isWeightEstimatorFile {
pageValues, err := h.WeightTicketComputer.ParseWeightEstimatorExcelFile(appCtx, file)

if err != nil {
return uploadop.NewCreateUploadInternalServerError(), rollbackErr
}

pdfFileName := strings.TrimSuffix(filenameWithoutTimestamp, filepath.Ext(filenameWithoutTimestamp)) + ".pdf" + "-" + timestamp
aFile, pdfInfo, err := h.WeightTicketGenerator.FillWeightEstimatorPDFForm(*pageValues, pdfFileName)

// Ensure weight receipt PDF is not corrupted
if err != nil || pdfInfo.PageCount != weightEstimatePages {
return uploadop.NewCreateUploadInternalServerError(), rollbackErr
}

newUserUpload, url, verrs, createErr = uploaderpkg.CreateUserUploadForDocumentWrapper(
appCtx,
appCtx.Session().UserID,
h.FileStorer(),
uploaderpkg.File{File: aFile},
file.Header.Filename,
uploaderpkg.MaxCustomerUserUploadFileSizeLimit,
uploaderpkg.AllowedTypesPPMDocuments,
docID,
models.UploadTypeOFFICE,
)

if verrs.HasAny() || createErr != nil {
appCtx.Logger().Error("failed to create new user upload", zap.Error(createErr), zap.String("verrs", verrs.Error()))
switch createErr.(type) {
case uploaderpkg.ErrTooLarge:
return uploadop.NewCreateUploadRequestEntityTooLarge(), rollbackErr
case uploaderpkg.ErrFile:
return uploadop.NewCreateUploadInternalServerError(), rollbackErr
case uploaderpkg.ErrFailedToInitUploader:
return uploadop.NewCreateUploadInternalServerError(), rollbackErr
default:
return handlers.ResponseForVErrors(appCtx.Logger(), verrs, createErr), rollbackErr
}
}

if err != nil {
return uploadop.NewCreateUploadInternalServerError(), rollbackErr
}
} else {
newUserUpload, url, verrs, createErr = uploaderpkg.CreateUserUploadForDocumentWrapper(
appCtx,
appCtx.Session().UserID,
h.FileStorer(),
file,
file.Header.Filename,
uploaderpkg.MaxCustomerUserUploadFileSizeLimit,
uploaderpkg.AllowedTypesServiceMember,
docID,
models.UploadTypeOFFICE,
)

if verrs.HasAny() || createErr != nil {
appCtx.Logger().Error("failed to create new user upload", zap.Error(createErr), zap.String("verrs", verrs.Error()))
switch createErr.(type) {
case uploaderpkg.ErrTooLarge:
return uploadop.NewCreateUploadRequestEntityTooLarge(), rollbackErr
case uploaderpkg.ErrFile:
return uploadop.NewCreateUploadInternalServerError(), rollbackErr
case uploaderpkg.ErrFailedToInitUploader:
return uploadop.NewCreateUploadInternalServerError(), rollbackErr
default:
return handlers.ResponseForVErrors(appCtx.Logger(), verrs, createErr), rollbackErr
}
}
}

Expand Down
14 changes: 13 additions & 1 deletion pkg/handlers/ghcapi/uploads_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ import (
"github.com/transcom/mymove/pkg/handlers"
"github.com/transcom/mymove/pkg/models"
"github.com/transcom/mymove/pkg/notifications"
paperworkgenerator "github.com/transcom/mymove/pkg/paperwork"
"github.com/transcom/mymove/pkg/services/upload"
weightticketparser "github.com/transcom/mymove/pkg/services/weight_ticket_parser"
storageTest "github.com/transcom/mymove/pkg/storage/test"
"github.com/transcom/mymove/pkg/uploader"
)
Expand All @@ -37,7 +39,17 @@ func makeRequest(suite *HandlerSuite, params uploadop.CreateUploadParams, servic

handlerConfig := suite.HandlerConfig()
handlerConfig.SetFileStorer(fakeS3)
handler := CreateUploadHandler{handlerConfig}
userUploader, err := uploader.NewUserUploader(handlerConfig.FileStorer(), uploader.MaxCustomerUserUploadFileSizeLimit)
suite.FatalNoError(err)

pdfGenerator, err := paperworkgenerator.NewGenerator(userUploader.Uploader())
suite.FatalNoError(err)

parserComputer := weightticketparser.NewWeightTicketComputer()
weightGenerator, err := weightticketparser.NewWeightTicketParserGenerator(pdfGenerator)
suite.FatalNoError(err)

handler := CreateUploadHandler{handlerConfig, parserComputer, weightGenerator}
response := handler.Handle(params)

return response
Expand Down
5 changes: 5 additions & 0 deletions swagger-def/ghc.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4377,6 +4377,11 @@ paths:
type: file
description: The file to upload.
required: true
- in: query
name: weightReceipt
type: boolean
description: If the upload is a Weight Receipt
required: true
responses:
'201':
description: created upload
Expand Down
5 changes: 5 additions & 0 deletions swagger/ghc.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4586,6 +4586,11 @@ paths:
type: file
description: The file to upload.
required: true
- in: query
name: weightReceipt
type: boolean
description: If the upload is a Weight Receipt
required: true
responses:
'201':
description: created upload
Expand Down