from datetime import datetime from werkzeug.security import generate_password_hash, check_password_hash from flask_login import UserMixin from app import db, login_manager import uuid @login_manager.user_loader def load_user(user_id): return User.query.get(int(user_id)) class User(UserMixin, db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(64), unique=True, index=True) password_hash = db.Column(db.String(128)) files = db.relationship('File', backref='owner', lazy='dynamic') shares = db.relationship('Share', backref='creator', lazy='dynamic') def set_password(self, password): self.password_hash = generate_password_hash(password) def check_password(self, password): return check_password_hash(self.password_hash, password) class File(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(255)) storage_name = db.Column(db.String(255)) # Added field for UUID-based storage mime_type = db.Column(db.String(128)) size = db.Column(db.Integer, default=0) is_folder = db.Column(db.Boolean, default=False) created_at = db.Column(db.DateTime, default=datetime.utcnow) updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) user_id = db.Column(db.Integer, db.ForeignKey('user.id')) parent_id = db.Column(db.Integer, db.ForeignKey('file.id')) # Add relationship to represent folder structure children = db.relationship('File', backref=db.backref('parent', remote_side=[id]), lazy='dynamic') # Add relationship for shared files shares = db.relationship('Share', backref='file', lazy='dynamic') class Share(db.Model): id = db.Column(db.Integer, primary_key=True) file_id = db.Column(db.Integer, db.ForeignKey('file.id')) user_id = db.Column(db.Integer, db.ForeignKey('user.id')) token = db.Column(db.String(64), unique=True) created_at = db.Column(db.DateTime, default=datetime.utcnow) expires_at = db.Column(db.DateTime, nullable=True) downloads = db.relationship('Download', backref='share', lazy='dynamic') class Download(db.Model): id = db.Column(db.Integer, primary_key=True) file_id = db.Column(db.Integer, db.ForeignKey('file.id')) share_id = db.Column(db.Integer, db.ForeignKey('share.id')) ip_address = db.Column(db.String(45)) timestamp = db.Column(db.DateTime, default=datetime.utcnow)