-
Notifications
You must be signed in to change notification settings - Fork 0
CROSSLINK-236 action params #496
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
base: main
Are you sure you want to change the base?
Changes from all commits
78a5ce6
d13b408
8e0ad4b
3a9cacc
286a457
12914d6
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -6,6 +6,7 @@ import ( | |
| "errors" | ||
| "fmt" | ||
| "net/http" | ||
| "strconv" | ||
| "strings" | ||
| "time" | ||
|
|
||
|
|
@@ -46,6 +47,14 @@ func (e *autoActionFailure) Error() string { | |
| return e.msg | ||
| } | ||
|
|
||
| type ActionParams struct { | ||
| Note string `json:"note,omitempty"` | ||
| LoanCondition string `json:"loanCondition,omitempty"` | ||
| Cost *float64 `json:"cost,omitempty"` | ||
| Currency string `json:"currency,omitempty"` | ||
| ReasonUnfilled string `json:"reasonUnfilled,omitempty"` | ||
| } | ||
|
|
||
| func CreatePatronRequestActionService(prRepo pr_db.PrRepo, eventBus events.EventBus, iso18626Handler handler.Iso18626HandlerInterface, lmsCreator lms.LmsCreator) *PatronRequestActionService { | ||
| return &PatronRequestActionService{ | ||
| prRepo: prRepo, | ||
|
|
@@ -267,7 +276,7 @@ func (a *PatronRequestActionService) handleBorrowingAction(ctx common.ExtendedCo | |
| } | ||
| } | ||
|
|
||
| func (a *PatronRequestActionService) handleLenderAction(ctx common.ExtendedContext, action pr_db.PatronRequestAction, pr pr_db.PatronRequest, illRequest iso18626.Request, actionParams map[string]interface{}, eventID *string) actionExecutionResult { | ||
| func (a *PatronRequestActionService) handleLenderAction(ctx common.ExtendedContext, action pr_db.PatronRequestAction, pr pr_db.PatronRequest, illRequest iso18626.Request, actionCustomData map[string]any, eventID *string) actionExecutionResult { | ||
| if !pr.SupplierSymbol.Valid { | ||
| status, result := a.logErrorAndReturnResult(ctx, "missing supplier symbol", nil) | ||
| return actionExecutionResult{status: status, result: result, pr: pr} | ||
|
|
@@ -291,19 +300,26 @@ func (a *PatronRequestActionService) handleLenderAction(ctx common.ExtendedConte | |
| ctx.Logger().Error("failed to create LMS log event", "error", createErr) | ||
| } | ||
| }) | ||
|
|
||
| var actionParams ActionParams | ||
| err = common.MapToStruct(actionCustomData, &actionParams) | ||
| if err != nil { | ||
| status, result := a.logErrorAndReturnResult(ctx, "failed to unmarshal action parameters", err) | ||
| return actionExecutionResult{status: status, result: result, pr: pr} | ||
| } | ||
| switch action { | ||
| case LenderActionValidate: | ||
| return a.validateLenderRequest(ctx, pr, lms) | ||
| case LenderActionWillSupply: | ||
| return a.willSupplyLenderRequest(ctx, pr, lms, illRequest) | ||
| return a.willSupplyLenderRequest(ctx, pr, lms, illRequest, actionParams) | ||
| case LenderActionRejectCancel: | ||
| return a.rejectCancelLenderRequest(ctx, pr) | ||
| case LenderActionCannotSupply: | ||
| return a.cannotSupplyLenderRequest(ctx, pr) | ||
| return a.cannotSupplyLenderRequest(ctx, pr, actionParams) | ||
| case LenderActionAddCondition: | ||
| return a.addConditionsLenderRequest(ctx, pr, actionParams) | ||
| case LenderActionShip: | ||
| return a.shipLenderRequest(ctx, pr, lms, illRequest) | ||
| return a.shipLenderRequest(ctx, pr, lms, illRequest, actionParams) | ||
| case LenderActionMarkReceived: | ||
| return a.markReceivedLenderRequest(ctx, pr, lms, illRequest) | ||
| case LenderActionAcceptCancel: | ||
|
|
@@ -597,7 +613,7 @@ func (a *PatronRequestActionService) validateLenderRequest(ctx common.ExtendedCo | |
| return actionExecutionResult{status: events.EventStatusSuccess, pr: pr} | ||
| } | ||
|
|
||
| func (a *PatronRequestActionService) willSupplyLenderRequest(ctx common.ExtendedContext, pr pr_db.PatronRequest, lmsAdapter lms.LmsAdapter, illRequest iso18626.Request) actionExecutionResult { | ||
| func (a *PatronRequestActionService) willSupplyLenderRequest(ctx common.ExtendedContext, pr pr_db.PatronRequest, lmsAdapter lms.LmsAdapter, illRequest iso18626.Request, actionParams ActionParams) actionExecutionResult { | ||
| itemId := illRequest.BibliographicInfo.SupplierUniqueRecordId | ||
| requestId := illRequest.Header.RequestingAgencyRequestId | ||
| userId := lmsAdapter.InstitutionalPatron(pr.RequesterSymbol.String) | ||
|
|
@@ -625,28 +641,65 @@ func (a *PatronRequestActionService) willSupplyLenderRequest(ctx common.Extended | |
| return actionExecutionResult{status: status, result: result, pr: pr} | ||
| } | ||
| result := events.EventResult{} | ||
| status, eventResult, httpStatus := a.sendSupplyingAgencyMessage(ctx, pr, &result, iso18626.MessageInfo{ReasonForMessage: iso18626.TypeReasonForMessageStatusChange}, iso18626.StatusInfo{Status: iso18626.TypeStatusWillSupply}) | ||
| status, eventResult, httpStatus := a.sendSupplyingAgencyMessage(ctx, pr, &result, | ||
| iso18626.MessageInfo{ | ||
| ReasonForMessage: iso18626.TypeReasonForMessageStatusChange, | ||
| Note: actionParams.Note, | ||
| }, | ||
| iso18626.StatusInfo{Status: iso18626.TypeStatusWillSupply}, | ||
| nil) | ||
| return a.checkSupplyingResponse(status, eventResult, &result, httpStatus, pr) | ||
| } | ||
|
|
||
| func (a *PatronRequestActionService) cannotSupplyLenderRequest(ctx common.ExtendedContext, pr pr_db.PatronRequest) actionExecutionResult { | ||
| func (a *PatronRequestActionService) cannotSupplyLenderRequest(ctx common.ExtendedContext, pr pr_db.PatronRequest, actionParams ActionParams) actionExecutionResult { | ||
| result := events.EventResult{} | ||
| status, eventResult, httpStatus := a.sendSupplyingAgencyMessage(ctx, pr, &result, iso18626.MessageInfo{ReasonForMessage: iso18626.TypeReasonForMessageStatusChange}, iso18626.StatusInfo{Status: iso18626.TypeStatusUnfilled}) | ||
| var reasonUnfilled *iso18626.TypeSchemeValuePair | ||
| if actionParams.ReasonUnfilled != "" { | ||
| reasonUnfilled = &iso18626.TypeSchemeValuePair{Text: actionParams.ReasonUnfilled} | ||
| } | ||
| status, eventResult, httpStatus := a.sendSupplyingAgencyMessage(ctx, pr, &result, | ||
| iso18626.MessageInfo{ | ||
| ReasonForMessage: iso18626.TypeReasonForMessageStatusChange, | ||
| Note: actionParams.Note, | ||
| ReasonUnfilled: reasonUnfilled, | ||
| }, | ||
| iso18626.StatusInfo{Status: iso18626.TypeStatusUnfilled}, | ||
| nil) | ||
| return a.checkSupplyingResponse(status, eventResult, &result, httpStatus, pr) | ||
| } | ||
|
|
||
| func (a *PatronRequestActionService) addConditionsLenderRequest(ctx common.ExtendedContext, pr pr_db.PatronRequest, actionParams map[string]interface{}) actionExecutionResult { | ||
| func (a *PatronRequestActionService) addConditionsLenderRequest(ctx common.ExtendedContext, pr pr_db.PatronRequest, actionParams ActionParams) actionExecutionResult { | ||
| var offeredCosts *iso18626.TypeCosts | ||
| if actionParams.Cost != nil { | ||
| if actionParams.Currency == "" { | ||
| status, result := a.logErrorAndReturnResult(ctx, "currency is required when cost is provided", nil) | ||
| return actionExecutionResult{status: status, result: result, pr: pr} | ||
| } | ||
| _, costBase, costExp := utils.ExtractDecimal(strconv.FormatFloat(*actionParams.Cost, 'f', -1, 64), -1) | ||
| offeredCosts = &iso18626.TypeCosts{ | ||
| CurrencyCode: iso18626.TypeSchemeValuePair{Text: actionParams.Currency}, | ||
adamdickmeiss marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| MonetaryValue: utils.XSDDecimal{Base: costBase, Exp: costExp}, | ||
| } | ||
|
Comment on lines
+671
to
+682
|
||
| } | ||
| var deliveryInfo *iso18626.DeliveryInfo | ||
| if actionParams.LoanCondition != "" { | ||
| deliveryInfo = &iso18626.DeliveryInfo{ | ||
| LoanCondition: &iso18626.TypeSchemeValuePair{Text: actionParams.LoanCondition}, | ||
| } | ||
| } | ||
| result := events.EventResult{} | ||
| status, eventResult, httpStatus := a.sendSupplyingAgencyMessage(ctx, pr, &result, | ||
| iso18626.MessageInfo{ | ||
| ReasonForMessage: iso18626.TypeReasonForMessageNotification, | ||
| Note: shim.RESHARE_ADD_LOAN_CONDITION, // TODO add action params | ||
| Note: actionParams.Note + shim.RESHARE_ADD_LOAN_CONDITION, | ||
| OfferedCosts: offeredCosts, | ||
| }, | ||
|
Comment on lines
692
to
696
|
||
| iso18626.StatusInfo{Status: iso18626.TypeStatusWillSupply}) | ||
| iso18626.StatusInfo{Status: iso18626.TypeStatusWillSupply}, | ||
| deliveryInfo) | ||
| return a.checkSupplyingResponse(status, eventResult, &result, httpStatus, pr) | ||
| } | ||
|
|
||
| func (a *PatronRequestActionService) shipLenderRequest(ctx common.ExtendedContext, pr pr_db.PatronRequest, lmsAdapter lms.LmsAdapter, illRequest iso18626.Request) actionExecutionResult { | ||
| func (a *PatronRequestActionService) shipLenderRequest(ctx common.ExtendedContext, pr pr_db.PatronRequest, lmsAdapter lms.LmsAdapter, illRequest iso18626.Request, actionParams ActionParams) actionExecutionResult { | ||
| requestId := illRequest.Header.RequestingAgencyRequestId | ||
| userId := lmsAdapter.InstitutionalPatron(pr.RequesterSymbol.String) | ||
| externalReferenceValue := "" | ||
|
|
@@ -680,11 +733,15 @@ func (a *PatronRequestActionService) shipLenderRequest(ctx common.ExtendedContex | |
| } | ||
| } | ||
| } | ||
| note := encodeItemsNote(items) | ||
| note := actionParams.Note + encodeItemsNote(items) | ||
| result := events.EventResult{} | ||
| status, eventResult, httpStatus := a.sendSupplyingAgencyMessage(ctx, pr, &result, | ||
| iso18626.MessageInfo{ReasonForMessage: iso18626.TypeReasonForMessageStatusChange, Note: note}, | ||
| iso18626.StatusInfo{Status: iso18626.TypeStatusLoaned}) | ||
| iso18626.MessageInfo{ | ||
| ReasonForMessage: iso18626.TypeReasonForMessageStatusChange, | ||
| Note: note, | ||
| }, | ||
|
Comment on lines
+736
to
+742
|
||
| iso18626.StatusInfo{Status: iso18626.TypeStatusLoaned}, | ||
| nil) | ||
| return a.checkSupplyingResponse(status, eventResult, &result, httpStatus, pr) | ||
| } | ||
|
|
||
|
|
@@ -718,7 +775,11 @@ func (a *PatronRequestActionService) markReceivedLenderRequest(ctx common.Extend | |
| } | ||
| } | ||
| result := events.EventResult{} | ||
| status, eventResult, httpStatus := a.sendSupplyingAgencyMessage(ctx, pr, &result, iso18626.MessageInfo{ReasonForMessage: iso18626.TypeReasonForMessageStatusChange}, iso18626.StatusInfo{Status: iso18626.TypeStatusLoanCompleted}) | ||
| status, eventResult, httpStatus := a.sendSupplyingAgencyMessage(ctx, pr, &result, | ||
| iso18626.MessageInfo{ | ||
| ReasonForMessage: iso18626.TypeReasonForMessageStatusChange}, | ||
| iso18626.StatusInfo{Status: iso18626.TypeStatusLoanCompleted}, | ||
| nil) | ||
| return a.checkSupplyingResponse(status, eventResult, &result, httpStatus, pr) | ||
| } | ||
|
|
||
|
|
@@ -730,7 +791,8 @@ func (a *PatronRequestActionService) rejectCancelLenderRequest(ctx common.Extend | |
| ReasonForMessage: iso18626.TypeReasonForMessageCancelResponse, | ||
| AnswerYesNo: &no, | ||
| }, | ||
| iso18626.StatusInfo{Status: iso18626.TypeStatusWillSupply}) | ||
| iso18626.StatusInfo{Status: iso18626.TypeStatusWillSupply}, | ||
| nil) | ||
| return a.checkSupplyingResponse(status, eventResult, &result, httpStatus, pr) | ||
| } | ||
|
|
||
|
|
@@ -742,11 +804,12 @@ func (a *PatronRequestActionService) acceptCancelLenderRequest(ctx common.Extend | |
| ReasonForMessage: iso18626.TypeReasonForMessageCancelResponse, | ||
| AnswerYesNo: &yes, | ||
| }, | ||
| iso18626.StatusInfo{Status: iso18626.TypeStatusCancelled}) | ||
| iso18626.StatusInfo{Status: iso18626.TypeStatusCancelled}, | ||
| nil) | ||
| return a.checkSupplyingResponse(status, eventResult, &result, httpStatus, pr) | ||
| } | ||
|
|
||
| func (a *PatronRequestActionService) sendSupplyingAgencyMessage(ctx common.ExtendedContext, pr pr_db.PatronRequest, result *events.EventResult, messageInfo iso18626.MessageInfo, statusInfo iso18626.StatusInfo) (events.EventStatus, *events.EventResult, *int) { | ||
| func (a *PatronRequestActionService) sendSupplyingAgencyMessage(ctx common.ExtendedContext, pr pr_db.PatronRequest, result *events.EventResult, messageInfo iso18626.MessageInfo, statusInfo iso18626.StatusInfo, deliveryInfo *iso18626.DeliveryInfo) (events.EventStatus, *events.EventResult, *int) { | ||
| if !pr.RequesterSymbol.Valid { | ||
| status, eventResult := a.logErrorAndReturnResult(ctx, "missing requester symbol", nil) | ||
| return status, eventResult, nil | ||
|
|
@@ -773,8 +836,9 @@ func (a *PatronRequestActionService) sendSupplyingAgencyMessage(ctx common.Exten | |
| RequestingAgencyRequestId: pr.RequesterReqID.String, | ||
| SupplyingAgencyRequestId: pr.ID, | ||
| }, | ||
| MessageInfo: messageInfo, | ||
| StatusInfo: statusInfo, | ||
| MessageInfo: messageInfo, | ||
| StatusInfo: statusInfo, | ||
| DeliveryInfo: deliveryInfo, | ||
| }, | ||
| } | ||
| if illMessage.SupplyingAgencyMessage.StatusInfo.LastChange.IsZero() { | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ActionParams.Costis modeled as*float64, and later converted viaFormatFloat->ExtractDecimal. Using floating point for monetary values can introduce rounding artifacts (e.g., 12.34 may format to a longer representation), resulting in incorrectMonetaryValuebeing sent. Consider representing cost as a decimal-safe type in params (e.g., string/json.Numberand parse, or accept base/exp directly) to preserve exact values.