Merge pull request #1826 from RoboSats/fix-invoice-cleanup

Fix invoice cleanup
This commit is contained in:
KoalaSat
2025-04-08 10:12:53 +00:00
committed by GitHub
5 changed files with 23 additions and 28 deletions

View File

@ -219,15 +219,21 @@ class Logics:
def is_buyer(order, user): def is_buyer(order, user):
is_maker = order.maker == user is_maker = order.maker == user
is_taker = order.taker == user is_taker = order.taker == user
is_pretaker = TakeOrder.objects.filter(
taker=user, order=order, expires_at__gt=timezone.now()
).exists()
return (is_maker and order.type == Order.Types.BUY) or ( return (is_maker and order.type == Order.Types.BUY) or (
is_taker and order.type == Order.Types.SELL (is_pretaker or is_taker) and order.type == Order.Types.SELL
) )
def is_seller(order, user): def is_seller(order, user):
is_maker = order.maker == user is_maker = order.maker == user
is_taker = order.taker == user is_taker = order.taker == user
is_pretaker = TakeOrder.objects.filter(
taker=user, order=order, expires_at__gt=timezone.now()
).exists()
return (is_maker and order.type == Order.Types.SELL) or ( return (is_maker and order.type == Order.Types.SELL) or (
is_taker and order.type == Order.Types.BUY (is_pretaker or is_taker) and order.type == Order.Types.BUY
) )
def calc_sats(amount, exchange_rate, premium): def calc_sats(amount, exchange_rate, premium):
@ -273,11 +279,10 @@ class Logics:
@classmethod @classmethod
def take_order_expires(cls, take_order): def take_order_expires(cls, take_order):
if take_order.expires_at < timezone.now(): if take_order.expires_at > timezone.now():
cls.cancel_bond(take_order.taker_bond) take_order.expires_at = timezone.now()
return True take_order.save(update_fields=["expires_at"])
else: cls.cancel_bond(take_order.taker_bond)
return False
@classmethod @classmethod
def order_expires(cls, order): def order_expires(cls, order):
@ -322,7 +327,7 @@ class Logics:
take_orders_queryset = TakeOrder.objects.filter(order=order) take_orders_queryset = TakeOrder.objects.filter(order=order)
for idx, take_order in enumerate(take_orders_queryset): for idx, take_order in enumerate(take_orders_queryset):
take_order.cancel(cls) cls.take_order_expires(take_order)
order.save(update_fields=["expiry_reason"]) order.save(update_fields=["expiry_reason"])
@ -446,7 +451,7 @@ class Logics:
@classmethod @classmethod
def kick_taker(cls, take_order): def kick_taker(cls, take_order):
"""The taker did not lock the taker_bond. Now he has to go""" """The taker did not lock the taker_bond. Now he has to go"""
take_order.cancel(cls) cls.take_order_expires(take_order)
# Add a time out to the taker # Add a time out to the taker
if take_order.taker: if take_order.taker:
robot = take_order.taker.robot robot = take_order.taker.robot
@ -1083,7 +1088,7 @@ class Logics:
take_orders_queryset = TakeOrder.objects.filter(order=order) take_orders_queryset = TakeOrder.objects.filter(order=order)
for idx, take_order in enumerate(take_orders_queryset): for idx, take_order in enumerate(take_orders_queryset):
order.log("Pretaker bond was <b>unlocked</b>") order.log("Pretaker bond was <b>unlocked</b>")
take_order.cancel(cls) cls.take_order_expires(take_order)
send_notification.delay( send_notification.delay(
order_id=order.id, message="public_order_cancelled" order_id=order.id, message="public_order_cancelled"

View File

@ -49,8 +49,6 @@ class Command(BaseCommand):
order=order, expires_at__gt=timezone.now() order=order, expires_at__gt=timezone.now()
) )
for idx, take_order in enumerate(take_orders_queryset): for idx, take_order in enumerate(take_orders_queryset):
take_order.expires_at = order.expires_at
take_order.save()
Logics.take_order_expires(take_order) Logics.take_order_expires(take_order)
# It should not happen, but if it cannot locate the hold invoice # It should not happen, but if it cannot locate the hold invoice
@ -77,10 +75,9 @@ class Command(BaseCommand):
for idx, take_order in enumerate(take_orders_queryset): for idx, take_order in enumerate(take_orders_queryset):
context = str(take_order) + " was expired" context = str(take_order) + " was expired"
try: try:
if Logics.take_order_expires( Logics.take_order_expires(take_order)
take_order take_order.delete()
): # Take order send to expire here debug["expired_take_orders"].append({idx: context})
debug["expired_take_orders"].append({idx: context})
# It should not happen, but if it cannot locate the hold invoice # It should not happen, but if it cannot locate the hold invoice
# it probably was cancelled by another thread, make it expire anyway. # it probably was cancelled by another thread, make it expire anyway.

View File

@ -302,8 +302,8 @@ class Command(BaseCommand):
return return
elif hasattr(lnpayment, "order_taken"): elif hasattr(lnpayment, "order_taken"):
self.stderr.write("Expiting take order with cancelled escrow") self.stderr.write("Expiting order with cancelled escrow")
Logics.take_order_expires(lnpayment.order_escrow) Logics.order_expires(lnpayment.order_taken)
return return
# TODO If a lnpayment goes from LOCKED to INVGEN. Totally weird # TODO If a lnpayment goes from LOCKED to INVGEN. Totally weird

View File

@ -2,7 +2,6 @@ from django.core.validators import MaxValueValidator, MinValueValidator
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.db import models from django.db import models
from django.conf import settings from django.conf import settings
from django.utils import timezone
class TakeOrder(models.Model): class TakeOrder(models.Model):
@ -41,11 +40,5 @@ class TakeOrder(models.Model):
# timestamp of last_satoshis # timestamp of last_satoshis
last_satoshis_time = models.DateTimeField(null=True, default=None, blank=True) last_satoshis_time = models.DateTimeField(null=True, default=None, blank=True)
def cancel(self, cls):
if self.expires_at > timezone.now():
self.expires_at = timezone.now()
self.save(update_fields=["expires_at"])
cls.cancel_bond(self.taker_bond)
def __str__(self): def __str__(self):
return f"Order {self.order.id} taken by Robot({self.taker.robot.id},{self.taker.username}) for {self.amount} fiat units" return f"Order {self.order.id} taken by Robot({self.taker.robot.id},{self.taker.username}) for {self.amount} fiat units"

View File

@ -437,7 +437,7 @@ class TradeTest(BaseAPITestCase):
self.assertAlmostEqual(float(data["amount"]), 80) self.assertAlmostEqual(float(data["amount"]), 80)
self.assertFalse(data["is_maker"]) self.assertFalse(data["is_maker"])
self.assertFalse(data["is_buyer"]) self.assertFalse(data["is_buyer"])
self.assertFalse(data["is_seller"]) self.assertTrue(data["is_seller"])
self.assertTrue(data["is_taker"]) self.assertTrue(data["is_taker"])
self.assertTrue(data["is_participant"]) self.assertTrue(data["is_participant"])
self.assertTrue(data["maker_locked"]) self.assertTrue(data["maker_locked"])
@ -506,7 +506,7 @@ class TradeTest(BaseAPITestCase):
self.assertEqual(data["maker_status"], "Active") self.assertEqual(data["maker_status"], "Active")
self.assertFalse(data["is_maker"]) self.assertFalse(data["is_maker"])
self.assertFalse(data["is_buyer"]) self.assertFalse(data["is_buyer"])
self.assertFalse(data["is_seller"]) self.assertTrue(data["is_seller"])
self.assertTrue(data["is_taker"]) self.assertTrue(data["is_taker"])
self.assertTrue(data["is_participant"]) self.assertTrue(data["is_participant"])
self.assertTrue(data["maker_locked"]) self.assertTrue(data["maker_locked"])
@ -544,7 +544,7 @@ class TradeTest(BaseAPITestCase):
self.assertEqual(data["maker_status"], "Active") self.assertEqual(data["maker_status"], "Active")
self.assertFalse(data["is_maker"]) self.assertFalse(data["is_maker"])
self.assertFalse(data["is_buyer"]) self.assertFalse(data["is_buyer"])
self.assertFalse(data["is_seller"]) self.assertTrue(data["is_seller"])
self.assertTrue(data["is_taker"]) self.assertTrue(data["is_taker"])
self.assertTrue(data["is_participant"]) self.assertTrue(data["is_participant"])
self.assertTrue(data["maker_locked"]) self.assertTrue(data["maker_locked"])