-
Notifications
You must be signed in to change notification settings - Fork 38
/
payment_service_items.go
101 lines (90 loc) · 4.23 KB
/
payment_service_items.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package ghcapi
import (
"fmt"
"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"
paymentServiceItemOp "github.com/transcom/mymove/pkg/gen/ghcapi/ghcoperations/payment_service_item"
"github.com/transcom/mymove/pkg/gen/ghcmessages"
"github.com/transcom/mymove/pkg/handlers"
modelToPayload "github.com/transcom/mymove/pkg/handlers/ghcapi/internal/payloads"
"github.com/transcom/mymove/pkg/models"
"github.com/transcom/mymove/pkg/services"
"github.com/transcom/mymove/pkg/services/audit"
"github.com/transcom/mymove/pkg/services/event"
"github.com/transcom/mymove/pkg/services/query"
)
// UpdatePaymentServiceItemStatusHandler updates payment service item status
type UpdatePaymentServiceItemStatusHandler struct {
handlers.HandlerConfig
services.PaymentServiceItemStatusUpdater
}
// Handle handles the handling for UpdatePaymentServiceItemStatusHandler
func (h UpdatePaymentServiceItemStatusHandler) Handle(
params paymentServiceItemOp.UpdatePaymentServiceItemStatusParams,
) middleware.Responder {
return h.AuditableAppContextFromRequestWithErrors(params.HTTPRequest,
func(appCtx appcontext.AppContext) (middleware.Responder, error) {
paymentServiceItemID, err := uuid.FromString(params.PaymentServiceItemID)
newStatus := models.PaymentServiceItemStatus(params.Body.Status)
if err != nil {
appCtx.Logger().
Error(fmt.Sprintf("Error parsing payment service item id: %s", params.PaymentServiceItemID), zap.Error(err))
}
updatedPaymentServiceItem, verrs, err := h.PaymentServiceItemStatusUpdater.UpdatePaymentServiceItemStatus(
appCtx,
paymentServiceItemID,
newStatus,
params.Body.RejectionReason,
params.IfMatch,
)
if err != nil {
appCtx.Logger().Error("Error updating payment service item status", zap.Error(err))
switch e := err.(type) {
case query.StaleIdentifierError:
return paymentServiceItemOp.NewUpdatePaymentServiceItemStatusPreconditionFailed().WithPayload(&ghcmessages.Error{Message: handlers.FmtString(err.Error())}), err
case apperror.NotFoundError:
return paymentServiceItemOp.NewUpdatePaymentServiceItemStatusNotFound().WithPayload(&ghcmessages.Error{Message: handlers.FmtString(err.Error())}), err
case apperror.InvalidInputError:
payload := payloadForValidationError("Validation errors", "UpdatePaymentServiceItemStatus", h.GetTraceIDFromRequest(params.HTTPRequest), e.ValidationErrors)
return paymentServiceItemOp.NewUpdatePaymentServiceItemStatusUnprocessableEntity().WithPayload(payload), err
default:
return paymentServiceItemOp.NewUpdatePaymentServiceItemStatusInternalServerError().WithPayload(&ghcmessages.Error{Message: handlers.FmtString("Error updating payment service item status")}), err
}
}
if verrs != nil {
payload := payloadForValidationError(
"Validation errors",
"UpdatePaymentServiceItemStatus",
h.GetTraceIDFromRequest(params.HTTPRequest),
verrs,
)
return paymentServiceItemOp.NewUpdatePaymentServiceItemStatusUnprocessableEntity().
WithPayload(payload), verrs
}
// Capture update attempt in audit log
_, err = audit.Capture(appCtx, &updatedPaymentServiceItem, nil, params.HTTPRequest)
if err != nil {
appCtx.Logger().
Error("Auditing service error for payment service item status change.", zap.Error(err))
return paymentServiceItemOp.NewUpdatePaymentServiceItemStatusInternalServerError(), err
}
_, err = event.TriggerEvent(event.Event{
EventKey: event.PaymentRequestUpdateEventKey,
MtoID: updatedPaymentServiceItem.PaymentRequest.MoveTaskOrderID,
UpdatedObjectID: updatedPaymentServiceItem.PaymentRequestID,
EndpointKey: event.GhcUpdatePaymentServiceItemStatusEndpointKey,
AppContext: appCtx,
TraceID: h.GetTraceIDFromRequest(params.HTTPRequest),
})
if err != nil {
appCtx.Logger().
Error("ghcapi.UpdatePaymentServiceItemStatusHandler could not generate the event")
}
// Make the payload and return it with a 200
payload := modelToPayload.PaymentServiceItem(&updatedPaymentServiceItem)
return paymentServiceItemOp.NewUpdatePaymentServiceItemStatusOK().WithPayload(payload), nil
})
}