You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
FreeBug/backend/app.py

98 lines
4.0 KiB

from sys import prefix
from flask import Flask, send_from_directory
# from FreeBug.backend.blueprints import notification
from db.model import db
from config import *
from db.model import User
from werkzeug.security import generate_password_hash
from sqlalchemy import text
from flask import jsonify
import uuid
from datetime import datetime
from constants import UserRole
from utils.utils import random_string_generator, hash_string
from flask_cors import CORS
from blueprints.profile import profile as profileBlueprint
from blueprints.session import session as sessionBlueprint
from blueprints.admin import admin as adminBlueprint
from blueprints.chat import chat as chatBlueprint
from blueprints.public import public_summary as publicBlueprint
from blueprints.course import course as courseBlueprint
from blueprints.badge import badge_route as badgeBlueprint
from blueprints.quiz import quiz as quizBlueprint
app = Flask(__name__)
# Enable CORS for all routes
CORS(app)
# Enable CORS for specific routes
# CORS(app, resources={
# r"*": {"origins": "*"} # Allows CORS for all `/api/` routes
# })
# Set configuration directly on the app instance
app.config['ALLOWED_EXTENSIONS'] = {'png', 'jpg', 'jpeg', 'gif','pdf'}
app.config['MAX_CONTENT_LENGTH'] = 1600 * 1000 * 1000
app.config["SQLALCHEMY_DATABASE_URI"] = DB_URI
db.init_app(app)
app.register_blueprint(profileBlueprint, url_prefix='/api/profile')
app.register_blueprint(sessionBlueprint,url_prefix='/api/session')
app.register_blueprint(adminBlueprint,url_prefix='/api/admin')
app.register_blueprint(badgeBlueprint, url_prefix='/api/badge')
# TODO: Register Notif API
app.register_blueprint(chatBlueprint,url_prefix='/api/chat')
app.register_blueprint(quizBlueprint,url_prefix='/api/quiz')
app.register_blueprint(publicBlueprint,url_prefix='/api/public')
app.register_blueprint(courseBlueprint,url_prefix='/api/course')
@app.route('/media/<string:filename>')
def send_file(filename):
return send_from_directory(USER_UPLOADS_DIR, filename)
@app.route('/courseSegment/<string:filename>/<int:page>/<string:dtype>')
def get_pdf_file_as_pages(filename: str, page: int, dtype: str):
if dtype == 'txt':
return send_from_directory(os.path.join(USER_UPLOADS_DIR, filename+'_parts'), f"{page}.txt")
else:
return send_from_directory(os.path.join(USER_UPLOADS_DIR, filename+'_parts'), f"{page}.pdf")
@app.route('/', methods=['GET', 'POST'])
def homepage():
return {'message': 'Welcome back !'}, 200
@app.route('/seedData', methods=['GET'])
def seed_data():
try:
# Drop and recreate schema (only for testing, not recommended in production)
sql = text('DROP SCHEMA public CASCADE; CREATE SCHEMA public;')
db.session.execute(sql)
db.session.commit()
db.create_all() # Recreate tables
# Define roles and constants (ensure UserRole.USER is an integer or map it)
# Create seed users
users = [ User(
email=f"user{i}@example.com", firstName=f"FirstName{i}", lastName=f"LastName{i}",
username=f"username{i}", hash_password=generate_password_hash("password123"),
activationKey=hash_string(random_string_generator(16)), pfpFilename=DEFAULT_PROFILE_FILE,
joinedDate=datetime.utcnow(), lastOnline=datetime.utcnow(),
bio=f"This is user{i}'s bio.", role=int(UserRole.USER),
isActivated=True, sessions=[], user_badges=[],
enrollments=[], quizzes=[], quiz_attempts=[], chats=[], notifications=[],publications=[])
for i in range(1, 6) ]
db.session.add_all(users)
db.session.commit()
return {"message": "Users seeded successfully!"}, 201
except Exception as e:
db.session.rollback()
return {"error": str(e)}, 500
if __name__ == '__main__':
with app.app_context():
db.create_all()
app.run(host='0.0.0.0', port=9999, debug=True)