from flask import Flask, send_from_directory from flask_migrate import Migrate from dotenv import load_dotenv import os from models import User from flask_wtf.csrf import generate_csrf from routes.room_files import room_files_bp from routes.user import user_bp from routes.room_members import room_members_bp from routes.trash import trash_bp from tasks import cleanup_trash import click from utils import timeago from extensions import db, login_manager, csrf, socketio # Load environment variables load_dotenv() def create_app(): app = Flask(__name__) # Configure the database app.config['SQLALCHEMY_DATABASE_URI'] = os.getenv('DATABASE_URL', 'postgresql://postgres:1253@localhost:5432/docupulse') app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False app.config['SECRET_KEY'] = os.getenv('SECRET_KEY', 'your-secure-secret-key-here') app.config['UPLOAD_FOLDER'] = os.path.join(app.root_path, 'static', 'uploads') # Initialize extensions db.init_app(app) migrate = Migrate(app, db) login_manager.init_app(app) login_manager.login_view = 'auth.login' csrf.init_app(app) socketio.init_app(app) @app.context_processor def inject_csrf_token(): return dict(csrf_token=generate_csrf()) # User loader for Flask-Login @login_manager.user_loader def load_user(user_id): return User.query.get(int(user_id)) # Initialize routes from routes import init_app init_app(app) app.register_blueprint(room_files_bp, url_prefix='/api/rooms') app.register_blueprint(room_members_bp, url_prefix='/api/rooms') app.register_blueprint(trash_bp, url_prefix='/api/rooms') app.register_blueprint(user_bp) @app.cli.command("cleanup-trash") def cleanup_trash_command(): """Clean up files that have been in trash for more than 30 days.""" cleanup_trash() click.echo("Trash cleanup completed.") # Register custom filters app.jinja_env.filters['timeago'] = timeago return app app = create_app() @app.route('/uploads/profile_pics/') def profile_pic(filename): return send_from_directory(os.path.join(os.getcwd(), 'uploads', 'profile_pics'), filename) if __name__ == '__main__': socketio.run(app, debug=True)