|
|
- import sqlite3 as sqlite
- import uuid
- import json
- import logging
- from be.model import db_conn
- from be.model import error
-
-
- class Buyer(db_conn.DBConn):
- def __init__(self):
- db_conn.DBConn.__init__(self)
-
- def new_order(self, user_id: str, store_id: str, id_and_count: [(str, int)]) -> (int, str, str):
- order_id = ""
- try:
- if not self.user_id_exist(user_id):
- return error.error_non_exist_user_id(user_id) + (order_id, )
- if not self.store_id_exist(store_id):
- return error.error_non_exist_store_id(store_id) + (order_id, )
- uid = "{}_{}_{}".format(user_id, store_id, str(uuid.uuid1()))
-
- for book_id, count in id_and_count:
- cursor = self.conn.execute(
- "SELECT book_id, stock_level, book_info FROM store "
- "WHERE store_id = ? AND book_id = ?;",
- (store_id, book_id))
- row = cursor.fetchone()
- if row is None:
- return error.error_non_exist_book_id(book_id) + (order_id, )
-
- stock_level = row[1]
- book_info = row[2]
- book_info_json = json.loads(book_info)
- price = book_info_json.get("price")
-
- if stock_level < count:
- return error.error_stock_level_low(book_id) + (order_id,)
-
- cursor = self.conn.execute(
- "UPDATE store set stock_level = stock_level - ? "
- "WHERE store_id = ? and book_id = ? and stock_level >= ?; ",
- (count, store_id, book_id, count))
- if cursor.rowcount == 0:
- return error.error_stock_level_low(book_id) + (order_id, )
-
- self.conn.execute(
- "INSERT INTO new_order_detail(order_id, book_id, count, price) "
- "VALUES(?, ?, ?, ?);",
- (uid, book_id, count, price))
-
- self.conn.execute(
- "INSERT INTO new_order(order_id, store_id, user_id) "
- "VALUES(?, ?, ?);",
- (uid, store_id, user_id))
- self.conn.commit()
- order_id = uid
- except sqlite.Error as e:
- logging.info("528, {}".format(str(e)))
- return 528, "{}".format(str(e)), ""
- except BaseException as e:
- logging.info("530, {}".format(str(e)))
- return 530, "{}".format(str(e)), ""
-
- return 200, "ok", order_id
-
- def payment(self, user_id: str, password: str, order_id: str) -> (int, str):
- conn = self.conn
- try:
- cursor = conn.execute("SELECT order_id, user_id, store_id FROM new_order WHERE order_id = ?", (order_id,))
- row = cursor.fetchone()
- if row is None:
- return error.error_invalid_order_id(order_id)
-
- order_id = row[0]
- buyer_id = row[1]
- store_id = row[2]
-
- if buyer_id != user_id:
- return error.error_authorization_fail()
-
- cursor = conn.execute("SELECT balance, password FROM user WHERE user_id = ?;", (buyer_id,))
- row = cursor.fetchone()
- if row is None:
- return error.error_non_exist_user_id(buyer_id)
- balance = row[0]
- if password != row[1]:
- return error.error_authorization_fail()
-
- cursor = conn.execute("SELECT store_id, user_id FROM user_store WHERE store_id = ?;", (store_id,))
- row = cursor.fetchone()
- if row is None:
- return error.error_non_exist_store_id(store_id)
-
- seller_id = row[1]
-
- if not self.user_id_exist(seller_id):
- return error.error_non_exist_user_id(seller_id)
-
- cursor = conn.execute("SELECT book_id, count, price FROM new_order_detail WHERE order_id = ?;", (order_id,))
- total_price = 0
- for row in cursor:
- count = row[1]
- price = row[2]
- total_price = total_price + price * count
-
- if balance < total_price:
- return error.error_not_sufficient_funds(order_id)
-
- cursor = conn.execute("UPDATE user set balance = balance - ?"
- "WHERE user_id = ? AND balance >= ?",
- (total_price, buyer_id, total_price))
- if cursor.rowcount == 0:
- return error.error_not_sufficient_funds(order_id)
-
- cursor = conn.execute("UPDATE user set balance = balance + ?"
- "WHERE user_id = ?",
- (total_price, buyer_id))
-
- if cursor.rowcount == 0:
- return error.error_non_exist_user_id(buyer_id)
-
- cursor = conn.execute("DELETE FROM new_order WHERE order_id = ?", (order_id, ))
- if cursor.rowcount == 0:
- return error.error_invalid_order_id(order_id)
-
- cursor = conn.execute("DELETE FROM new_order_detail where order_id = ?", (order_id, ))
- if cursor.rowcount == 0:
- return error.error_invalid_order_id(order_id)
-
- conn.commit()
-
- except sqlite.Error as e:
- return 528, "{}".format(str(e))
-
- except BaseException as e:
- return 530, "{}".format(str(e))
-
- return 200, "ok"
-
- def add_funds(self, user_id, password, add_value) -> (int, str):
- try:
- cursor = self.conn.execute("SELECT password from user where user_id=?", (user_id,))
- row = cursor.fetchone()
- if row is None:
- return error.error_authorization_fail()
-
- if row[0] != password:
- return error.error_authorization_fail()
-
- cursor = self.conn.execute(
- "UPDATE user SET balance = balance + ? WHERE user_id = ?",
- (add_value, user_id))
- if cursor.rowcount == 0:
- return error.error_non_exist_user_id(user_id)
-
- self.conn.commit()
- except sqlite.Error as e:
- return 528, "{}".format(str(e))
- except BaseException as e:
- return 530, "{}".format(str(e))
-
- return 200, "ok"
|