2024-11-28 13:19:50 +00:00
|
|
|
import uuid
|
|
|
|
|
2024-11-13 08:13:06 +00:00
|
|
|
from custom_decorators import singleton
|
|
|
|
from database import Database
|
2024-11-20 17:09:07 +00:00
|
|
|
from loguru import logger
|
2024-11-13 08:13:06 +00:00
|
|
|
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)
|
2024-11-13 08:13:06 +00:00
|
|
|
try:
|
2024-11-20 17:09:07 +00:00
|
|
|
cursor = self.db.execute_query(sql, params)
|
|
|
|
cursor.close()
|
2024-11-13 08:13:06 +00:00
|
|
|
self.db.commit()
|
2024-11-28 13:19:50 +00:00
|
|
|
return order.order_id, timestamp
|
2024-11-13 08:13:06 +00:00
|
|
|
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
|
|
|
|
|
2024-11-13 08:13:06 +00:00
|
|
|
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):
|
2024-11-21 08:29:45 +00:00
|
|
|
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
|