Added support for ticket type ids at the availability level.
diff --git a/utils/utils.go b/utils/utils.go index 6e4d65d..c95e198 100644 --- a/utils/utils.go +++ b/utils/utils.go
@@ -77,30 +77,57 @@ } func buildLineItem(availability *fpb.Availability, tickets []*fpb.TicketType) *mpb.LineItem { + // If no ticket types return nil as there is nothing to build. + if len(tickets) == 0 { + return nil + } + + // Treated as a set. + ticketMap := make(map[string]*fpb.TicketType) + for _, ticketType := range tickets { + if _, ok := ticketMap[ticketType.GetTicketTypeId()]; !ok { + // Ticket type ids should be unique to a merchant service pair. + // If they're not unique they will get dropped silently here. + // We enforce minimal feed validation in the test client so it's + // up to you to ensure UIDs. + ticketMap[ticketType.GetTicketTypeId()] = ticketType + } + } + + filteredTickets := tickets + if len(availability.GetTicketTypeId()) != 0 { + // Clear slice but preserve allocated memory. + filteredTickets = filteredTickets[:0] + for _, ticketTypeID := range availability.GetTicketTypeId() { + if ticketType, ok := ticketMap[ticketTypeID]; ok { + filteredTickets = append(filteredTickets, ticketType) + } + } + } + + // If no ticket types return nil as there is nothing to build. + if len(filteredTickets) == 0 { + return nil + } + lineItem := &mpb.LineItem{ ServiceId: availability.GetServiceId(), StartSec: availability.GetStartSec(), DurationSec: availability.GetDurationSec(), Price: &mpb.Price{}, } - - // If not ticket types return nil as there is nothing to build. - if len(tickets) == 0 { - return nil - } - for i := 0; i < int(availability.GetSpotsOpen()); i++ { // This is deterministic which is fine given that we just want to get a mix of ticket types. - ticketTypeIndex := rand.Intn(len(tickets)) + ticketTypeIndex := rand.Intn(len(filteredTickets)) // Calculate price of line item. - if lineItem.GetPrice().GetCurrencyCode() == "" && tickets[ticketTypeIndex].GetPrice().GetCurrencyCode() != "" { - lineItem.Price.CurrencyCode = tickets[ticketTypeIndex].GetPrice().GetCurrencyCode() + if lineItem.GetPrice().GetCurrencyCode() == "" && filteredTickets[ticketTypeIndex].GetPrice().GetCurrencyCode() != "" { + lineItem.Price.CurrencyCode = filteredTickets[ticketTypeIndex].GetPrice().GetCurrencyCode() } - lineItem.Price.PriceMicros += tickets[ticketTypeIndex].GetPrice().GetPriceMicros() + lineItem.Price.PriceMicros += filteredTickets[ticketTypeIndex].GetPrice().GetPriceMicros() // Add ticket to line item. lineItem.Tickets = append(lineItem.Tickets, &mpb.LineItem_OrderedTickets{ - TicketId: tickets[ticketTypeIndex].GetTicketTypeId(), + TicketId: filteredTickets[ticketTypeIndex].GetTicketTypeId(), Count: 1, }) }