Skip to content
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
57 changes: 25 additions & 32 deletions service/rate.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,11 +69,29 @@ func (h *Service) HandleLinkMessage(req LinksRequest) (string, error) {
return "", errWontJoin
}

groupRate, err := h.getRateForGroup(req.Channel, groupID.ID, req.MessageID)
if err != nil {
if errors.Is(err, errNotInTime) {
return "", nil
shouldHandleOrder := h.shouldHandleOrder()
if !shouldHandleOrder {
_, err := h.informEvent(req.Channel, "It's too late for me... I won't track prices for this order :sleeping:", "", req.MessageID)
if err != nil {
return "", errWontJoin
}

return "", errNotInTime
}
Comment on lines +72 to +80
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pay attention in the original function, I don't exit immediately in case shouldHandleOrder is false. The reason is that I still want to monitor the order status and the venue availability even if prices should not be tracked.


order, err := h.joinGroupOrder(groupID.ID)
if err != nil {
_, _ = h.informEvent(req.Channel, "I had an error joining the order", "", req.MessageID)
return "", fmt.Errorf("join group order: %w", err)
}
h.currentlyWorkingOrders.Store(groupID, order)
venue, err := order.Venue()
if err == nil {
h.informEvent(req.Channel, fmt.Sprintf("Hi 👋, I've joined the order from [%s]", venue.Name), "", req.MessageID)
}

groupRate, err := h.getRateForGroup(order, req.Channel, req.MessageID)
if err != nil {
if strings.Contains(err.Error(), "order canceled") {
_, _ = h.informEvent(req.Channel, fmt.Sprintf("Order for group ID %s was canceled", groupID.ID), "", req.MessageID)
return "", nil
Expand All @@ -87,13 +105,8 @@ func (h *Service) HandleLinkMessage(req LinksRequest) (string, error) {
return "", nil
}

order, _ := h.currentlyWorkingOrders.Load(groupID.ID)
if order == nil {
return "", fmt.Errorf("order %s not initialized in map", groupID.ID)
}

ratesMessage := h.buildRatesMessage(groupRate, groupID.ID)
order.(*groupOrder).detailsMessageId, err = h.informEvent(req.Channel, ratesMessage, MarkAsPaidReaction, req.MessageID)
order.detailsMessageId, err = h.informEvent(req.Channel, ratesMessage, MarkAsPaidReaction, req.MessageID)
if err != nil {
return "", fmt.Errorf("failed sending details message: %w", err)
}
Expand All @@ -105,7 +118,7 @@ func (h *Service) HandleLinkMessage(req LinksRequest) (string, error) {

ctx, cancel := context.WithTimeout(context.Background(), h.cfg.OrderDoneTimeout)
defer cancel()
if err = h.monitorDelivery(req.Channel, order.(*groupOrder), ctx, h.cfg.WaitBetweenStatusCheck, req.MessageID, ratesMessage); err != nil {
if err = h.monitorDelivery(req.Channel, order, ctx, h.cfg.WaitBetweenStatusCheck, req.MessageID, ratesMessage); err != nil {
if strings.Contains(err.Error(), "context canceled while waiting") {
_, _ = h.informEvent(req.Channel, "Timed out waiting for order to be done", "", req.MessageID)
return "", nil
Expand Down Expand Up @@ -239,23 +252,7 @@ func (h *Service) saveOrderAsync(order *groupOrder, groupRate GroupRate, receive

}

func (h *Service) getRateForGroup(receiver, groupID, messageID string) (groupRate GroupRate, err error) {
shouldHandleOrder := h.shouldHandleOrder()

if !shouldHandleOrder {
_, err := h.informEvent(receiver, "It's too late for me... I won't track prices for this order :sleeping:", "", messageID)
if err != nil {
return GroupRate{}, errWontJoin
}
}

order, err := h.joinGroupOrder(groupID)
if err != nil {
_, _ = h.informEvent(receiver, "I had an error joining the order", "", messageID)
return GroupRate{}, fmt.Errorf("join group order: %w", err)
}
h.currentlyWorkingOrders.Store(groupID, order)

func (h *Service) getRateForGroup(order *groupOrder, receiver, messageID string) (groupRate GroupRate, err error) {
defer func() {
go h.saveOrderAsync(order, groupRate, receiver)
}()
Expand All @@ -275,10 +272,6 @@ func (h *Service) getRateForGroup(receiver, groupID, messageID string) (groupRat
}
monitorCancel()

if !shouldHandleOrder {
return GroupRate{}, errNotInTime
}

details, err := order.Details()
if err != nil {
return GroupRate{}, fmt.Errorf("get group details for calculating rates: %w", err)
Expand Down
7 changes: 6 additions & 1 deletion testing/integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -693,6 +693,11 @@ func TestSlackPurchaseGroup(t *testing.T) {
})
assert.NoError(t, err)

msg, err := WaitForOutboundSlackMessage(WaitForMessageTimeout, tdata.slackServer,
"Hi 👋, I've joined the order from [A Tasty Venue]",
MessageChannel, timestamp, ContainsMatch)
require.NoError(t, err)

// Adding relevant participants as users in Slack
participantIDsMapping := make(map[string]string)
for participantName, slackUser := range tc.participantsToAddToSlack {
Expand Down Expand Up @@ -729,7 +734,7 @@ func TestSlackPurchaseGroup(t *testing.T) {

// Validating the rates message
rates, ratesMessage := buildRatesMessage(t, order, expectedDelivery, participantIDsMapping)
msg, err := WaitForOutboundSlackMessage(WaitForMessageTimeout, tdata.slackServer,
msg, err = WaitForOutboundSlackMessage(WaitForMessageTimeout, tdata.slackServer,
fmt.Sprintf("Rates for Wolt order ID %s", orderShortID),
MessageChannel, timestamp, ContainsMatch)
require.NoError(t, err)
Expand Down