From b21fc45c7d19e933d96039fe691a74398466de0e Mon Sep 17 00:00:00 2001 From: janghanul090801 <25s100@sunrint.hs.kr> Date: Wed, 9 Jul 2025 23:02:32 +0900 Subject: [PATCH] fix: buy product --- app.py | 8 +-- db.py | 2 +- instance/dotori.db | Bin 8192 -> 8192 bytes models/__pycache__/dotori.cpython-313.pyc | Bin 2660 -> 2657 bytes models/dotori.py | 21 ++++---- routes/__init__.py | 5 +- routes/__pycache__/product.cpython-313.pyc | Bin 2126 -> 2213 bytes routes/dotori.py | 38 +++++++++----- routes/product.py | 49 +++++++++++------- .../dotori_service.cpython-313.pyc | Bin 4160 -> 4160 bytes services/dotori_service.py | 24 +++++++-- 11 files changed, 91 insertions(+), 56 deletions(-) diff --git a/app.py b/app.py index 3ef3afb..ffe13a5 100644 --- a/app.py +++ b/app.py @@ -5,8 +5,8 @@ from db import db from flask_migrate import Migrate app = Flask(__name__) -app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///dotori.db' -app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False +app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///dotori.db" +app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False db.init_app(app) migrate = Migrate(app, db) @@ -14,7 +14,7 @@ migrate = Migrate(app, db) with app.app_context(): db.create_all() -api = Api(app, doc='/docs') +api = Api(app, doc="/docs") add_namespaces(api) -if __name__ == '__main__': +if __name__ == "__main__": app.run(debug=True) diff --git a/db.py b/db.py index 2e1eeb6..f0b13d6 100644 --- a/db.py +++ b/db.py @@ -1,3 +1,3 @@ from flask_sqlalchemy import SQLAlchemy -db = SQLAlchemy() \ No newline at end of file +db = SQLAlchemy() diff --git a/instance/dotori.db b/instance/dotori.db index 91bc6a1e03f07c0e8f2ec380f36a60df739e6d54..d88aa166a2c466244eff283ff8e5ce237b1c587a 100644 GIT binary patch delta 41 xcmZp0XmFSy&B#4b#+i|OV?w4p^NqWTlh4Sj@*5dj85mlbSn3%Y8Ch7E0RRHT3u*uW delta 41 wcmZp0XmFSy&B!)U#+i|AV?w4p^G(*6$!FwM`3=pjOwFu}jPwjG%*@OT0Q5Wx#sB~S diff --git a/models/__pycache__/dotori.cpython-313.pyc b/models/__pycache__/dotori.cpython-313.pyc index 24ffa843d031745d80014b3e1aeed5a5839397e8..6d46686b173579768adbdd8a38997c28196f68fc 100644 GIT binary patch delta 133 zcmaDN@=%2LGcPX}0|NttcxhgS{zl%JEUZNW3=9mD*Rh1MiAztfnOL)#ll2oLn<4`P zLy_`iM)rSLLfpIL`Z-LIS`==A~ZmR&Sn8lPDUw95L*gFh%+!S+~Tmw R%}*)KNwq7onQY8u2msW`94i0- delta 137 zcmaDT@nBDw zB?bnDB9+Pi*#0rfP5#UNMnxGUAOs?WL4*W|kOvWJAVL#F=x*la6R diff --git a/models/dotori.py b/models/dotori.py index fba7526..3662efe 100644 --- a/models/dotori.py +++ b/models/dotori.py @@ -2,9 +2,10 @@ from flask_sqlalchemy import SQLAlchemy from datetime import datetime from db import db + class UserDotori(db.Model): - __tablename__ = 'user_dotori' - + __tablename__ = "user_dotori" + id = db.Column(db.Integer, primary_key=True, autoincrement=True) user_id = db.Column(db.Integer, nullable=False) dotori_count = db.Column(db.Integer, default=0) @@ -13,17 +14,14 @@ class UserDotori(db.Model): def to_dict(self): return { - 'user_id': self.user_id, - 'dotori_count': self.dotori_count, - 'created_at': self.created_at.isoformat(), - 'updated_at': self.updated_at.isoformat() + "user_id": self.user_id, + "dotori_count": self.dotori_count, + "created_at": self.created_at.isoformat(), + "updated_at": self.updated_at.isoformat(), } def to_response(self): - return { - 'userId': self.user_id, - 'dotory': self.dotori_count - } + return {"user_id": self.user_id, "dotory": self.dotori_count} def increment(self, amount=1): self.dotori_count += amount @@ -36,5 +34,6 @@ class UserDotori(db.Model): self.updated_at = datetime.now() return self.dotori_count return False + def __repr__(self): - return f"" \ No newline at end of file + return f"" diff --git a/routes/__init__.py b/routes/__init__.py index b787db0..eea54d1 100644 --- a/routes/__init__.py +++ b/routes/__init__.py @@ -3,6 +3,7 @@ from flask_restx import Api from .dotori import dotori_ns from .product import product_ns + def add_namespaces(api): - api.add_namespace(dotori_ns, path='/api/dotory') - api.add_namespace(product_ns, path='/api/buy') \ No newline at end of file + api.add_namespace(dotori_ns, path="/api/dotory") + api.add_namespace(product_ns, path="/api/buy") diff --git a/routes/__pycache__/product.cpython-313.pyc b/routes/__pycache__/product.cpython-313.pyc index ea52de801b6f9221bf1385ca214b9432101f74ea..d830924569f985c09bf260c52c9d1b4a83791b1b 100644 GIT binary patch delta 450 zcmX>nuvC!uGcPX}0|Nttds$va;zr)(jO^^C#i>Q{nUi-hN;9t9e2r0&k+ER%52ihg z&Xcz?>oJG2B~SKZRuNz|WdiAAU{GKPW(#Ewoj6~V!xSRIF!?{TIeQVv+#=D*jw~`# zRibW*nK`K`3MKgpPNkI!0Y&*KrO72BMZA*>S#%gVCeLGW(YVE3k{@4`T3nEySDdQJ zev73zH7D&BXF(BIt!K(DmXySj#3HWAe_4tc=T9zRjnTZpFLjY$>5hQZbpeHo0tyR+ zFR0mG5wLq8t9V0N>4uc*bt%J(QihkMj3+;1oo%Sjz`$@zG(Nt#B(WqjIX#Up1&7m$M#^}R1LEi9C=v$|e3RF(=rFQRzRBV;S&LPQ zQGBv1YZ2pw$vaqMq#npB-jG(hr)e@n`y)Gx2;T<=7GAy&Yz)>mlWo~%GpbF#$tEqT z2{Hxbv?5gyO8`tv=45wL5McFT{LIY2rU4>sL4?+4HjrQuSh>LDZ1ylqeFg@GTkKBx z`8lbHc}0dG9&1s4X-R4k*d$cbZ*kb<=BJeAq}ml(PX5Ji!o$;%)}Pmvw;<&rpY~)c n4kb1|k^a2Syva!%>M|mXK8zD2J~M#m&&&)=Y9E') + +@dotori_ns.route("/") class UserDotori(Resource): @dotori_ns.marshal_with(user_model) def get(self, userId): user_dotori = DotoriService.get_user_dotori(userId) if not user_dotori: - dotori_ns.abort(404, 'User not found') + dotori_ns.abort(404, "User not found") return user_dotori.to_response() - @dotori_ns.expect(dotori_ns.model('AddDotori', {'num': fields.Integer(required=True)})) + @dotori_ns.expect( + dotori_ns.model("AddDotori", {"num": fields.Integer(required=True)}) + ) def put(self, userId): data = dotori_ns.payload - num = data.get('num') + num = data.get("num") return DotoriService.add_dotori(userId, num).to_response() -@dotori_ns.route('') + +@dotori_ns.route("") class InitializeDotori(Resource): - @dotori_ns.expect(dotori_ns.model('Initialize', {'user_id': fields.Integer(required=True)})) + @dotori_ns.expect( + dotori_ns.model("Initialize", {"user_id": fields.Integer(required=True)}) + ) def post(self): data = dotori_ns.payload - user_id = data.get('user_id') + user_id = data.get("user_id") return DotoriService.initialize_user_dotori(user_id) -@dotori_ns.route('/all') + +@dotori_ns.route("/all") class GetAllDotori(Resource): def get(self): users = DotoriService.get_all_users_dotori() - return users \ No newline at end of file + return users diff --git a/routes/product.py b/routes/product.py index 36da47a..b5a6e8e 100644 --- a/routes/product.py +++ b/routes/product.py @@ -1,37 +1,46 @@ from flask_restx import Namespace, Resource, fields from services.dotori_service import DotoriService -product_ns = Namespace('buy', description='상품 구매 API') +product_ns = Namespace("buy", description="상품 구매 API") -buy_request_model = product_ns.model('BuyRequest', { - 'userId': fields.Integer(required=True), -}) +buy_request_model = product_ns.model( + "BuyRequest", + { + "user_id": fields.Integer(required=True), + }, +) -buy_response_model = product_ns.model('BuyResponse', { - 'isSuccess': fields.Boolean, - 'userId': fields.Integer, - 'dotory': fields.Integer, -}) +buy_response_model = product_ns.model( + "BuyResponse", + { + "isSuccess": fields.Boolean, + "user_id": fields.Integer, + "dotory": fields.Integer, + }, +) -@product_ns.route('/') + +@product_ns.route("/") class BuyProduct(Resource): @product_ns.expect(buy_request_model) - @product_ns.response(200, 'Success', buy_response_model) - @product_ns.response(400, 'Failed') + @product_ns.response(200, "Success", buy_response_model) + @product_ns.response(400, "Failed") def post(self, productId): data = product_ns.payload - user_id = data.get('user_id') + user_id = data.get("user_id") if not user_id: - product_ns.abort(400, 'userId is required') - - product_price = 100 # 가격이 얼마에요? + product_ns.abort(400, "userId is required") + + product_price = 100 # 가격이 얼마에요? success = DotoriService.buy_product(user_id, product_price) if success: user_dotori = DotoriService.get_user_dotori(user_id) + if user_dotori is None: + product_ns.abort(400, "Failed to Buy Product") return { - 'isSuccess': True, - 'user_id': user_id, - 'dotory': user_dotori if user_dotori else 0 + "isSuccess": True, + "user_id": user_id, + "dotory": user_dotori.to_response(), } else: - product_ns.abort(400, 'Insufficient dotory or purchase failed') \ No newline at end of file + product_ns.abort(400, "Insufficient dotory or purchase failed") diff --git a/services/__pycache__/dotori_service.cpython-313.pyc b/services/__pycache__/dotori_service.cpython-313.pyc index cfe77d92f41c9368c77fdc739d979d8817a240cd..b90779b0467ef2854f3abbbbe9960d2a30ddca1b 100644 GIT binary patch delta 19 acmX@0a6p0UGcPX}0|NttXxT {user_dotori.dotori_count - product_price}") + print( + f"구매 완료, {user_id}님의 도토리: {user_dotori.dotori_count} -> {user_dotori.dotori_count - product_price}" + ) user_dotori.decrement(product_price) db.session.commit() return True @@ -43,7 +57,9 @@ class DotoriService: if not user_dotori: user_dotori = UserDotori(user_id=user_id) db.session.add(user_dotori) - print(f"도토리 추가, {user_id}님의 도토리: {user_dotori.dotori_count} -> {user_dotori.dotori_count + amount}") + print( + f"도토리 추가, {user_id}님의 도토리: {user_dotori.dotori_count} -> {user_dotori.dotori_count + amount}" + ) user_dotori.increment(amount) db.session.commit() return user_dotori