createOrFindOrder either creates a new order from req (the usual case), or returns an existing unfinished order. It returns a nil *Order if the order exists and is finished, that is, this request message is a duplicate. createOrFindOrder returns a non-nil error only for database problems.
(ctx context.Context, coll *docstore.Collection, req *OrderRequest)
| 128 | // finished, that is, this request message is a duplicate. |
| 129 | // createOrFindOrder returns a non-nil error only for database problems. |
| 130 | func createOrFindOrder(ctx context.Context, coll *docstore.Collection, req *OrderRequest) (*Order, error) { |
| 131 | // See if there is already a document for this order. |
| 132 | order := &Order{ID: req.ID} |
| 133 | err := coll.Get(ctx, order) |
| 134 | if err != nil { |
| 135 | if gcerrors.Code(err) != gcerrors.NotFound { |
| 136 | return nil, err |
| 137 | } |
| 138 | // Normal case: the order wasn't found, because it hasn't been created |
| 139 | // yet. Create it. |
| 140 | order = &Order{ |
| 141 | ID: req.ID, |
| 142 | Email: req.Email, |
| 143 | InImage: req.InImage, |
| 144 | CreateTime: req.CreateTime, |
| 145 | } |
| 146 | if err := coll.Create(ctx, order); err != nil { |
| 147 | return nil, err |
| 148 | } |
| 149 | return order, nil |
| 150 | } |
| 151 | if order.FinishTime.IsZero() { |
| 152 | // The order exists, but was not finished. Either it was abandoned by the processor that |
| 153 | // was working on it (probably because the processor died), or it is in progress. Assume |
| 154 | // that it was abandoned, and process it. |
| 155 | return order, nil |
| 156 | } |
| 157 | // The order exists and was finished. This is most likely the result of a pubsub redelivery. |
| 158 | // We simply ignore it. |
| 159 | return nil, nil |
| 160 | } |
| 161 | |
| 162 | // processOrder processes the order request. |
| 163 | func (p *processor) processOrder(ctx context.Context, order *Order) error { |
no test coverage detected