import re from datetime import datetime from flask_login import UserMixin from extensions import db, bcrypt #Users class User(UserMixin, db.Model): __tablename__ = "user" id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(100), unique=True, nullable= False) email = db.Column(db.String(120), unique=True, nullable = False) password_hash = db.Column(db.String(200), nullable=False) created_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) playlist = db.relationship("Playlist", back_populates="user", lazy="dynamic") def set_password(self, plain_password: str): if not plain_password or len(plain_password) < 8: raise ValueError("Password must be at least 8 characters!") if not re.search(r"[A-Z]", plain_password): raise ValueError("Password must include one uppercase letter") if not re.search(r"[\d]", plain_password): raise ValueError("Password must include one number") self.password_hash = ( bcrypt.generate_password_hash( plain_password ).decode("utf-8") ) def check_password(self, plain_password: str) -> bool: return bcrypt.check_password_hash(self.password_hash, plain_password) def __repr__(self): return f"" #Saves the playlist that the users makes class Playlist(db.Model): id= db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100)) description = db.Column(db.String(255)) spotify_playlist_id = db.Column(db.String(120)) spotify_url = db.Column(db.String(300)) user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False) user = db.relationship("User", backref="playlists") tracks = db.relationship( "Tracks", backref ="playlist", cascade="all, delete" ) #Saves every song in the playlist class Tracks(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(255)) artist = db.Column(db.String(255)) playlist_id = db.Column( db.Integer, db.ForeignKey("playlist.id") )