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 91bc6a1..d88aa16 100644 Binary files a/instance/dotori.db and b/instance/dotori.db differ diff --git a/models/__pycache__/dotori.cpython-313.pyc b/models/__pycache__/dotori.cpython-313.pyc index 24ffa84..6d46686 100644 Binary files a/models/__pycache__/dotori.cpython-313.pyc and b/models/__pycache__/dotori.cpython-313.pyc differ 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 ea52de8..d830924 100644 Binary files a/routes/__pycache__/product.cpython-313.pyc and b/routes/__pycache__/product.cpython-313.pyc differ diff --git a/routes/dotori.py b/routes/dotori.py index 18ca42a..ab38f16 100644 --- a/routes/dotori.py +++ b/routes/dotori.py @@ -1,38 +1,48 @@ from flask_restx import Namespace, Resource, fields from services.dotori_service import DotoriService -dotori_ns = Namespace('dotory', description='도토리 관련 API') +dotori_ns = Namespace("dotory", description="도토리 관련 API") -user_model = dotori_ns.model('UserDotori', { - 'user_id': fields.Integer, - 'dotory': fields.Integer, -}) +user_model = dotori_ns.model( + "UserDotori", + { + "user_id": fields.Integer, + "dotory": fields.Integer, + }, +) -@dotori_ns.route('/') + +@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 cfe77d9..b90779b 100644 Binary files a/services/__pycache__/dotori_service.cpython-313.pyc and b/services/__pycache__/dotori_service.cpython-313.pyc differ diff --git a/services/dotori_service.py b/services/dotori_service.py index 81f6177..c7074c3 100644 --- a/services/dotori_service.py +++ b/services/dotori_service.py @@ -5,6 +5,8 @@ import sqlalchemy from models.dotori import UserDotori from flask import current_app from db import db + + class DotoriService: @staticmethod def get_user_dotori(user_id: int): @@ -20,7 +22,17 @@ class DotoriService: if not user_dotori: user_dotori = UserDotori(id=user_id, user_id=user_id, dotori_count=1000000) print(f"초기화 완료, {user_id}님의 도토리: {user_dotori.dotori_count}") - db.session.execute(sqlalchemy.text("INSERT INTO user_dotori (user_id, dotori_count, created_at, updated_at) VALUES (:user_id, :dotori_count, :created_at, :updated_at)"), {"user_id":user_id, "dotori_count":1000000, "created_at":datetime.now(), "updated_at":datetime.now()}) + db.session.execute( + sqlalchemy.text( + "INSERT INTO user_dotori (user_id, dotori_count, created_at, updated_at) VALUES (:user_id, :dotori_count, :created_at, :updated_at)" + ), + { + "user_id": user_id, + "dotori_count": 1000000, + "created_at": datetime.now(), + "updated_at": datetime.now(), + }, + ) db.session.commit() return user_dotori.dotori_count @@ -29,10 +41,12 @@ class DotoriService: user_dotori = UserDotori.query.filter_by(user_id=user_id).first() if not user_dotori: return False - + if user_dotori.dotori_count < product_price: return False - print(f"구매 완료, {user_id}님의 도토리: {user_dotori.dotori_count} -> {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