46 lines
1.5 KiB
Python
46 lines
1.5 KiB
Python
from datetime import datetime, timezone
|
|
|
|
import bcrypt
|
|
from flask_sqlalchemy import SQLAlchemy
|
|
|
|
db = SQLAlchemy()
|
|
|
|
|
|
class User(db.Model):
|
|
__tablename__ = "users"
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
username = db.Column(db.String(64), unique=True, nullable=False)
|
|
password_hash = db.Column(db.LargeBinary(60), nullable=False)
|
|
balance = db.Column(db.Integer, nullable=False, default=1000)
|
|
|
|
purchases = db.relationship("Purchase", backref="user", lazy=True)
|
|
|
|
def set_password(self, password):
|
|
self.password_hash = bcrypt.hashpw(password.encode("utf-8"), bcrypt.gensalt())
|
|
|
|
def check_password(self, password):
|
|
return bcrypt.checkpw(password.encode("utf-8"), self.password_hash)
|
|
|
|
|
|
class Crystal(db.Model):
|
|
__tablename__ = "crystals"
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
color = db.Column(db.String(32), unique=True, nullable=False)
|
|
price = db.Column(db.Integer, nullable=False)
|
|
stock = db.Column(db.Integer, nullable=False, default=0)
|
|
|
|
|
|
class Purchase(db.Model):
|
|
__tablename__ = "purchases"
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)
|
|
crystal_id = db.Column(db.Integer, db.ForeignKey("crystals.id"), nullable=False)
|
|
quantity = db.Column(db.Integer, nullable=False)
|
|
total_price = db.Column(db.Integer, nullable=False)
|
|
created_at = db.Column(
|
|
db.DateTime, nullable=False, default=lambda: datetime.now(timezone.utc)
|
|
)
|