Skip to content

Commit 4ea2aaf

Browse files
optimize refund locking to single query.
1 parent 1561492 commit 4ea2aaf

File tree

1 file changed

+7
-2
lines changed

1 file changed

+7
-2
lines changed

app/eventyay/api/views/order.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1249,8 +1249,13 @@ def confirm(self, request, **kwargs):
12491249
@action(detail=True, methods=['POST'])
12501250
@transaction.atomic
12511251
def refund(self, request, **kwargs):
1252-
# Acquire row-level lock on payment to prevent concurrent refund race conditions
1253-
payment = OrderPayment.objects.select_for_update().get(pk=self.get_object().pk)
1252+
# Acquire row-level lock on payment to prevent concurrent refund race conditions.
1253+
# We reuse DRF's filtering & permission logic while issuing a single SELECT ... FOR UPDATE.
1254+
queryset = self.filter_queryset(self.get_queryset().select_for_update())
1255+
1256+
lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field
1257+
lookup_value = self.kwargs[lookup_url_kwarg]
1258+
payment = get_object_or_404(queryset, **{self.lookup_field: lookup_value})
12541259

12551260
amount = serializers.DecimalField(max_digits=10, decimal_places=2).to_internal_value(
12561261
request.data.get('amount', str(payment.amount))

0 commit comments

Comments
 (0)