목록 · 검토 대상 원본(함정 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