2021-07-20 11:00:49 -03:00
|
|
|
import datetime
|
|
|
|
import logging
|
|
|
|
|
|
|
|
from flask import current_app
|
|
|
|
|
|
|
|
import constants
|
|
|
|
from database import db
|
|
|
|
from models import Order
|
|
|
|
from schemas import order_schema
|
|
|
|
|
|
|
|
|
2021-12-21 16:31:41 -03:00
|
|
|
def assign_tx_seq_num(order):
|
|
|
|
"""Assign Tx sequence number to order"""
|
|
|
|
last_tx_order = Order.query.order_by(Order.tx_seq_num.desc()).first()
|
2021-07-20 11:00:49 -03:00
|
|
|
|
2021-12-21 16:31:41 -03:00
|
|
|
if last_tx_order.tx_seq_num:
|
|
|
|
order.tx_seq_num = last_tx_order.tx_seq_num + 1
|
|
|
|
else:
|
|
|
|
order.tx_seq_num = 1
|
|
|
|
db.session.commit()
|
2021-07-20 11:00:49 -03:00
|
|
|
|
|
|
|
|
2021-12-21 16:31:41 -03:00
|
|
|
def redis():
|
|
|
|
return current_app.config.get("REDIS_INSTANCE")
|
|
|
|
|
2021-07-20 11:00:49 -03:00
|
|
|
|
2021-12-21 16:31:41 -03:00
|
|
|
def publish_to_sse_server(order):
|
|
|
|
msg = order_schema.dumps(order)
|
|
|
|
redis().publish(channel=constants.SUB_CHANNELS[0], message=msg)
|
|
|
|
return
|
2021-07-20 11:00:49 -03:00
|
|
|
|
|
|
|
|
2021-12-21 16:31:41 -03:00
|
|
|
def tx_start():
|
|
|
|
# Do not start a new transmission if another order is
|
|
|
|
# being transmitted right now
|
|
|
|
transmitting_orders = Order.query.filter_by(
|
|
|
|
status=constants.OrderStatus.transmitting.value).all()
|
|
|
|
if transmitting_orders:
|
|
|
|
return
|
|
|
|
# Pick the order with the highest bid and start transmission
|
|
|
|
order = Order.query.filter_by(
|
|
|
|
status=constants.OrderStatus.paid.value).order_by(
|
|
|
|
Order.bid_per_byte.desc()).first()
|
|
|
|
if order:
|
|
|
|
logging.info(f'transmission start {order.uuid}')
|
|
|
|
assign_tx_seq_num(order)
|
|
|
|
order.status = constants.OrderStatus.transmitting.value
|
|
|
|
order.started_transmission_at = datetime.datetime.utcnow()
|
|
|
|
db.session.commit()
|
|
|
|
publish_to_sse_server(order)
|
2021-07-20 11:00:49 -03:00
|
|
|
|
|
|
|
|
2021-12-21 16:31:41 -03:00
|
|
|
def tx_end(order):
|
|
|
|
"""End transmission"""
|
|
|
|
if order.status == constants.OrderStatus.transmitting.value:
|
|
|
|
logging.info(f'transmission end {order.uuid}')
|
|
|
|
order.status = constants.OrderStatus.sent.value
|
|
|
|
order.ended_transmission_at = datetime.datetime.utcnow()
|
|
|
|
db.session.commit()
|
|
|
|
publish_to_sse_server(order)
|
|
|
|
# Start the next queued order as soon as the current order finishes
|
|
|
|
tx_start()
|
2021-07-20 11:00:49 -03:00
|
|
|
|
|
|
|
|
2021-12-21 16:31:41 -03:00
|
|
|
def tx_resume():
|
|
|
|
"""Resume interrupted transmissions"""
|
|
|
|
orders = Order.query.filter_by(
|
|
|
|
status=constants.OrderStatus.transmitting.value).all()
|
|
|
|
for order in orders:
|
|
|
|
logging.info(f'resuming interrupted transmission {order.uuid}')
|
|
|
|
tx_end(order)
|