payment/payment_backend/repositories/order.py

91 lines
3.1 KiB
Python
Raw Normal View History

2024-11-28 13:19:50 +00:00
import uuid
from custom_decorators import singleton
from database import Database
2024-11-20 17:09:07 +00:00
from loguru import logger
from utils.datetime import current_timestamp
@singleton
class OrderRepository:
def __init__(self, config):
self.db = Database(config['MYSQL'])
2024-11-20 17:09:07 +00:00
def create(self, order):
2024-11-28 13:19:50 +00:00
if order.order_id is None:
date_str = current().strftime('%Y%m%d%H%M%S')
unique_id = str(uuid.uuid4()).split('-')[0]
order.order_id = f"{date_str}-{unique_id}"
2024-11-19 12:07:35 +00:00
timestamp = current_timestamp()
2024-11-20 17:09:07 +00:00
order.create_timestamp = timestamp
order.update_timestamp = timestamp
sql, params = order.insert_sql()
logger.debug(sql)
logger.debug(params)
try:
2024-11-20 17:09:07 +00:00
cursor = self.db.execute_query(sql, params)
cursor.close()
self.db.commit()
2024-11-28 13:19:50 +00:00
return order.order_id, timestamp
except Exception:
self.db.rollback()
raise
2024-11-28 13:19:50 +00:00
def get_last(self, order):
sql, params = order.select_sql(query_columns=['order_id', 'update_timestamp'])
cursor = self.db.execute_query(f'{sql} ORDER BY update_timestamp DESC LIMIT 1', params)
result = cursor.fetchone()
cursor.close()
return result
def get_or_create(self, order):
result = self.get_last(order)
if not result:
return self.create(order)
return result
def update_status(self, order_id, status):
try:
self.db.execute_query("UPDATE orders "
"SET status = %s, update_timestamp = %s "
"WHERE order_id = %s",
[status, current_timestamp(), order_id])
self.db.commit()
except Exception:
self.db.rollback()
raise
def get_order_info(self, order_id):
2024-11-20 17:09:07 +00:00
sql = 'SELECT quant, from_address, to_address, create_timestamp FROM orders WHERE order_id = %s'
logger.debug(f'getting order {order_id} info')
cursor = self.db.execute_query(sql, [order_id])
result = cursor.fetchone()
cursor.close()
logger.debug(f'order {order_id} info: {result}')
return result
def query(self, order, offset, limit):
select_sql, params = order.select_sql(
query_columns=['order_id', 'name', 'phone', 'email', 'quant', 'payment_method', 'from_address',
'create_timestamp', 'update_timestamp', 'status']
)
2024-11-22 03:54:56 +00:00
select_sql = f"{select_sql} ORDER BY update_timestamp DESC LIMIT %s OFFSET %s"
2024-11-20 17:09:07 +00:00
params = params + [limit, offset]
2024-11-22 03:54:56 +00:00
logger.debug(f'querying order {order.id} info')
logger.debug(f'select_sql: {select_sql}')
logger.debug(f'params: {params}')
2024-11-20 17:09:07 +00:00
cursor = self.db.execute_query(select_sql, params)
result = cursor.fetchmany(limit)
cursor.close()
return result
2024-11-22 03:54:56 +00:00
def count(self, order):
select_sql, params = order.select_sql(
query_columns=['count(*)']
)
cursor = self.db.execute_query(select_sql, params)
result = cursor.fetchone()[0]
cursor.close()
return result