Skip to content

Commit

Permalink
Merge pull request #11953 from transcom/B-18193
Browse files Browse the repository at this point in the history
B-18193 API Fix Delete Weight Ticket
  • Loading branch information
pambecker authored Feb 8, 2024
2 parents 0a70e0b + 3ab25ed commit b40c012
Show file tree
Hide file tree
Showing 6 changed files with 54 additions and 46 deletions.
37 changes: 1 addition & 36 deletions pkg/handlers/internalapi/weight_ticket.go
Original file line number Diff line number Diff line change
@@ -1,19 +1,15 @@
package internalapi

import (
"database/sql"

"github.com/go-openapi/runtime/middleware"
"github.com/gofrs/uuid"
"go.uber.org/zap"

"github.com/transcom/mymove/pkg/appcontext"
"github.com/transcom/mymove/pkg/apperror"
"github.com/transcom/mymove/pkg/db/utilities"
weightticketops "github.com/transcom/mymove/pkg/gen/internalapi/internaloperations/ppm"
"github.com/transcom/mymove/pkg/handlers"
"github.com/transcom/mymove/pkg/handlers/internalapi/internal/payloads"
"github.com/transcom/mymove/pkg/models"
"github.com/transcom/mymove/pkg/services"
)

Expand Down Expand Up @@ -168,42 +164,11 @@ func (h DeleteWeightTicketHandler) Handle(params weightticketops.DeleteWeightTic
return weightticketops.NewDeleteWeightTicketForbidden(), noServiceMemberIDErr
}

// Make sure the service member is not modifying another service member's PPM
ppmID := uuid.FromStringOrNil(params.PpmShipmentID.String())
var ppmShipment models.PPMShipment
err := appCtx.DB().Scope(utilities.ExcludeDeletedScope()).
EagerPreload(
"Shipment.MoveTaskOrder.Orders",
"WeightTickets",
).
Find(&ppmShipment, ppmID)
if err != nil {
if err == sql.ErrNoRows {
return weightticketops.NewDeleteWeightTicketNotFound(), err
}
return weightticketops.NewDeleteWeightTicketInternalServerError(), err
}
if ppmShipment.Shipment.MoveTaskOrder.Orders.ServiceMemberID != appCtx.Session().ServiceMemberID {
wrongServiceMemberIDErr := apperror.NewSessionError("Attempted delete by wrong service member")
appCtx.Logger().Error("internalapi.DeleteWeightTicketHandler", zap.Error(wrongServiceMemberIDErr))
return weightticketops.NewDeleteWeightTicketForbidden(), wrongServiceMemberIDErr
}

weightTicketID := uuid.FromStringOrNil(params.WeightTicketID.String())
found := false
for _, lineItem := range ppmShipment.WeightTickets {
if lineItem.ID == weightTicketID {
found = true
break
}
}
if !found {
mismatchedPPMShipmentAndWeightTicketIDErr := apperror.NewSessionError("Weight ticket does not exist on ppm shipment")
appCtx.Logger().Error("internalapi.DeleteWeightTicketHandler", zap.Error(mismatchedPPMShipmentAndWeightTicketIDErr))
return weightticketops.NewDeleteWeightTicketNotFound(), mismatchedPPMShipmentAndWeightTicketIDErr
}

err = h.weightTicketDeleter.DeleteWeightTicket(appCtx, weightTicketID)
err := h.weightTicketDeleter.DeleteWeightTicket(appCtx, ppmID, weightTicketID)
if err != nil {
appCtx.Logger().Error("internalapi.DeleteWeightTicketHandler", zap.Error(err))

Expand Down
1 change: 1 addition & 0 deletions pkg/handlers/internalapi/weight_ticket_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -423,6 +423,7 @@ func (suite *HandlerSuite) TestDeleteWeightTicketHandler() {
mockDeleter.On("DeleteWeightTicket",
mock.AnythingOfType("*appcontext.appContext"),
mock.AnythingOfType("uuid.UUID"),
mock.AnythingOfType("uuid.UUID"),
).Return(err)

// Use createS3HandlerConfig for the HandlerConfig because we are required to upload a doc
Expand Down
10 changes: 5 additions & 5 deletions pkg/services/mocks/WeightTicketDeleter.go

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

2 changes: 1 addition & 1 deletion pkg/services/weight_ticket.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,5 +32,5 @@ type WeightTicketUpdater interface {
//
//go:generate mockery --name WeightTicketDeleter
type WeightTicketDeleter interface {
DeleteWeightTicket(appCtx appcontext.AppContext, weightTicketID uuid.UUID) error
DeleteWeightTicket(appCtx appcontext.AppContext, ppmID uuid.UUID, weightTicketID uuid.UUID) error
}
40 changes: 39 additions & 1 deletion pkg/services/weight_ticket/weight_ticket_deleter.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
package weightticket

import (
"database/sql"

"github.com/gofrs/uuid"
"go.uber.org/zap"

"github.com/transcom/mymove/pkg/appcontext"
"github.com/transcom/mymove/pkg/apperror"
"github.com/transcom/mymove/pkg/db/utilities"
"github.com/transcom/mymove/pkg/models"
"github.com/transcom/mymove/pkg/services"
"github.com/transcom/mymove/pkg/services/ppmshipment"
)
Expand All @@ -21,7 +26,40 @@ func NewWeightTicketDeleter(fetcher services.WeightTicketFetcher, estimator serv
}
}

func (d *weightTicketDeleter) DeleteWeightTicket(appCtx appcontext.AppContext, weightTicketID uuid.UUID) error {
func (d *weightTicketDeleter) DeleteWeightTicket(appCtx appcontext.AppContext, ppmID uuid.UUID, weightTicketID uuid.UUID) error {
var ppmShipment models.PPMShipment
err := appCtx.DB().Scope(utilities.ExcludeDeletedScope()).
EagerPreload(
"Shipment.MoveTaskOrder.Orders",
"WeightTickets",
).
Find(&ppmShipment, ppmID)
if err != nil {
if err == sql.ErrNoRows {
return apperror.NewNotFoundError(weightTicketID, "while looking for WeightTicket")
}
return apperror.NewQueryError("WeightTicket fetch original", err, "")
}

if ppmShipment.Shipment.MoveTaskOrder.Orders.ServiceMemberID != appCtx.Session().ServiceMemberID && !appCtx.Session().IsOfficeUser() {
wrongServiceMemberIDErr := apperror.NewForbiddenError("Attempted delete by wrong service member")
appCtx.Logger().Error("internalapi.DeleteWeightTicketHandler", zap.Error(wrongServiceMemberIDErr))
return wrongServiceMemberIDErr
}

found := false
for _, lineItem := range ppmShipment.WeightTickets {
if lineItem.ID == weightTicketID {
found = true
break
}
}
if !found {
mismatchedPPMShipmentAndWeightTicketIDErr := apperror.NewNotFoundError(weightTicketID, "Weight ticket does not exist on ppm shipment")
appCtx.Logger().Error("internalapi.DeleteWeightTicketHandler", zap.Error(mismatchedPPMShipmentAndWeightTicketIDErr))
return mismatchedPPMShipmentAndWeightTicketIDErr
}

weightTicket, err := d.GetWeightTicket(appCtx, weightTicketID)
if err != nil {
return err
Expand Down
10 changes: 7 additions & 3 deletions pkg/services/weight_ticket/weight_ticket_deleter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,11 +75,12 @@ func (suite *WeightTicketSuite) TestDeleteWeightTicket() {
}
suite.Run("Returns an error if the original doesn't exist", func() {
notFoundWeightTicketID := uuid.Must(uuid.NewV4())
ppmID := uuid.Must(uuid.NewV4())
fetcher := NewWeightTicketFetcher()
estimator := mocks.PPMEstimator{}
deleter := NewWeightTicketDeleter(fetcher, &estimator)

err := deleter.DeleteWeightTicket(suite.AppContextForTest(), notFoundWeightTicketID)
err := deleter.DeleteWeightTicket(suite.AppContextForTest(), ppmID, notFoundWeightTicketID)

if suite.Error(err) {
suite.IsType(apperror.NotFoundError{}, err)
Expand All @@ -98,14 +99,16 @@ func (suite *WeightTicketSuite) TestDeleteWeightTicket() {
ServiceMemberID: originalWeightTicket.EmptyDocument.ServiceMemberID,
})

ppmID := originalWeightTicket.PPMShipmentID

fetcher := NewWeightTicketFetcher()
estimator := mocks.PPMEstimator{}
mockIncentive := unit.Cents(10000)
estimator.On("FinalIncentiveWithDefaultChecks", appCtx, mock.AnythingOfType("models.PPMShipment"), mock.AnythingOfType("*models.PPMShipment")).Return(&mockIncentive, nil)
deleter := NewWeightTicketDeleter(fetcher, &estimator)

suite.Nil(originalWeightTicket.DeletedAt)
err := deleter.DeleteWeightTicket(appCtx, originalWeightTicket.ID)
err := deleter.DeleteWeightTicket(appCtx, ppmID, originalWeightTicket.ID)
suite.NoError(err)

var weightTicketInDB models.WeightTicket
Expand Down Expand Up @@ -145,6 +148,7 @@ func (suite *WeightTicketSuite) TestDeleteWeightTicket() {
ServiceMemberID: originalWeightTicket.EmptyDocument.ServiceMemberID,
})

ppmID := originalWeightTicket.PPMShipmentID
fetcher := NewWeightTicketFetcher()
estimator := mocks.PPMEstimator{}
mockIncentive := unit.Cents(10000)
Expand All @@ -153,7 +157,7 @@ func (suite *WeightTicketSuite) TestDeleteWeightTicket() {
mock.AnythingOfType("models.PPMShipment"),
mock.AnythingOfType("*models.PPMShipment")).Return(&mockIncentive, nil).Once()
deleter := NewWeightTicketDeleter(fetcher, &estimator)
err := deleter.DeleteWeightTicket(appCtx, originalWeightTicket.ID)
err := deleter.DeleteWeightTicket(appCtx, ppmID, originalWeightTicket.ID)
suite.NoError(err)

estimator.AssertCalled(suite.T(), "FinalIncentiveWithDefaultChecks",
Expand Down

0 comments on commit b40c012

Please sign in to comment.