목록 · 검토 대상 원본(함정 9개를 일부러 넣은 가상 코드)

  1  """작은 쇼핑몰 주문 처리 모듈 (sqlite3)"""
  2  import os
  3  import sqlite3
  4  
  5  DB_PATH = "shop.db"
  6  INVOICE_DIR = "invoices"
  7  ADMIN_TOKEN = "sk_live_9f8e7d6c5b4a3210shopadmin"
  8  PAGE_SIZE = 20
  9  
 10  
 11  def get_db():
 12      conn = sqlite3.connect(DB_PATH)
 13      conn.row_factory = sqlite3.Row
 14      return conn
 15  
 16  
 17  def search_products(keyword):
 18      db = get_db()
 19      sql = f"SELECT id, name, price FROM products WHERE name LIKE '%{keyword}%'"
 20      return [dict(r) for r in db.execute(sql).fetchall()]
 21  
 22  
 23  def list_orders(user_id, page=1):
 24      db = get_db()
 25      offset = page * PAGE_SIZE
 26      orders = db.execute(
 27          "SELECT id, created_at FROM orders WHERE user_id = ? LIMIT ? OFFSET ?",
 28          (user_id, PAGE_SIZE, offset),
 29      ).fetchall()
 30      result = []
 31      for o in orders:
 32          items = db.execute(
 33              "SELECT product_id, qty, price FROM order_items WHERE order_id = ?",
 34              (o["id"],),
 35          ).fetchall()
 36          result.append({"id": o["id"], "items": [dict(i) for i in items]})
 37      return result
 38  
 39  
 40  def get_order(order_id, current_user_id):
 41      db = get_db()
 42      row = db.execute("SELECT * FROM orders WHERE id = ?", (order_id,)).fetchone()
 43      return dict(row) if row else None
 44  
 45  
 46  def place_order(user_id, product_id, qty):
 47      db = get_db()
 48      stock = db.execute(
 49          "SELECT stock, price FROM products WHERE id = ?", (product_id,)
 50      ).fetchone()
 51      if stock["stock"] < qty:
 52          raise ValueError("재고 부족")
 53      db.execute(
 54          "UPDATE products SET stock = stock - ? WHERE id = ?", (qty, product_id)
 55      )
 56      cur = db.execute("INSERT INTO orders (user_id) VALUES (?)", (user_id,))
 57      db.execute(
 58          "INSERT INTO order_items (order_id, product_id, qty, price) VALUES (?, ?, ?, ?)",
 59          (cur.lastrowid, product_id, qty, stock["price"]),
 60      )
 61      db.execute(
 62          "UPDATE users SET balance = balance - ? WHERE id = ?",
 63          (stock["price"] * qty, user_id),
 64      )
 65      db.commit()
 66      return cur.lastrowid
 67  
 68  
 69  def apply_coupon(total, coupon):
 70      try:
 71          rate = coupon["percent"] / 100
 72          return total - total * rate
 73      except Exception:
 74          pass
 75  
 76  
 77  def download_invoice(filename):
 78      path = os.path.join(INVOICE_DIR, filename)
 79      with open(path, "rb") as f:
 80          return f.read()
 81  
 82  
 83  def is_admin(token):
 84      return token == ADMIN_TOKEN