diff --git a/backend/app.py b/backend/app.py index ef6d543..2ac3a83 100644 --- a/backend/app.py +++ b/backend/app.py @@ -1,7 +1,17 @@ from sys import prefix from flask import Flask +# 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 blueprints.profile import profile as profileBlueprint app = Flask(__name__) app.config["SQLALCHEMY_DATABASE_URI"] = DB_URI @@ -14,6 +24,54 @@ app.register_blueprint(profileBlueprint,url_prefix='/api') def homepage(): return {'message': 'Welcome back !'}, 200 + +@app.route('/seed-users', methods=['GET']) +def seed_users(): + try: + # Drop and recreate schema (only for testing, not recommended in production) + sql = text('DROP SCHEMA public CASCADE; CREATE SCHEMA public;') + with db.engine.connect() as connection: + connection.execute(sql) + db.create_all() # Recreate tables + + # Define roles and constants (ensure UserRole.USER is an integer or map it) + default_role = UserRole.USER.value if hasattr(UserRole, 'USER') else 1 + default_profile_file = "defaultUserBanner.png" + + # 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"), + pfpFilename=default_profile_file, + joinedDate=datetime.utcnow(), + lastOnline=datetime.utcnow(), + bio=f"This is user{i}'s bio.", + role=default_role, + isActivated=True, + sessions=[], + user_badges=[], + enrollments=[], + quizzes=[], + quiz_attempts=[], + chats=[], + notifications=[] + ) + for i in range(1, 6) + ] + + # Add users to the database + 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() diff --git a/backend/db/model.py b/backend/db/model.py index edef2ae..97bd408 100644 --- a/backend/db/model.py +++ b/backend/db/model.py @@ -24,6 +24,10 @@ class User(db.Model): sessions: Mapped[List["Session"]] = relationship(back_populates="user", cascade="all, delete-orphan") enrollments: Mapped[List["Enrollment"]] = relationship(back_populates="user", cascade="all, delete-orphan") quizzes: Mapped[List["Quiz"]] = relationship(back_populates="creatorUser", cascade="all, delete-orphan") + quiz_attempts: Mapped[List["QuizAttempt"]] = relationship(back_populates="user", cascade="all, delete-orphan") + chats: Mapped[List["Chat"]] = relationship(back_populates="user", cascade="all, delete-orphan") + notifications: Mapped[List["Notification"]] = relationship(back_populates="user", cascade="all, delete-orphan") + user_badges: Mapped[List["UserBadge"]] = relationship(back_populates="user", cascade="all, delete-orphan") pfpFilename: Mapped[str] = mapped_column(String(256), nullable=False, default=DEFAULT_PROFILE_FILE) joinedDate: Mapped[datetime] = mapped_column(DateTime, nullable=False, default=func.now()) lastOnline: Mapped[datetime] = mapped_column(DateTime, nullable=False, default=func.now(), onupdate=func.now()) @@ -62,6 +66,7 @@ class Course(db.Model): category: Mapped["Category"] = relationship(back_populates="courses") enrollments: Mapped[List["Enrollment"]] = relationship(back_populates="course", cascade="all, delete-orphan") quizzes: Mapped[List['Quiz']] = relationship(back_populates="course", cascade="all, delete-orphan") + chats: Mapped[List["Chat"]] = relationship(back_populates="course", cascade="all, delete-orphan") description: Mapped[str] = mapped_column(String(1024), nullable=False, default='') isActive: Mapped[bool] = mapped_column(Boolean, nullable=False, default=True) publishedStatus: Mapped[int] = mapped_column(SmallInteger, nullable=False, default=PublishedStatus.DRAFT) @@ -69,6 +74,7 @@ class Course(db.Model): coverImage: Mapped[str] = mapped_column(String(256), nullable=False, default=DEFAULT_COURSE_COVER) serverFilename: Mapped[str] = mapped_column(String(256), nullable=False, default='') + class Enrollment(db.Model): __tablename__ = 'enrollment' @@ -88,6 +94,7 @@ class Quiz(db.Model): id: Mapped[uuid.UUID] = mapped_column(types.Uuid, primary_key=True, init=False, server_default=text("gen_random_uuid()")) creatorUserID: Mapped[uuid.UUID] = mapped_column(ForeignKey("user.id")) creatorUser: Mapped["User"] = relationship(back_populates="quizzes") + quiz_attempts: Mapped[List["QuizAttempt"]] = relationship(back_populates="quiz", cascade="all, delete-orphan") courseID: Mapped[uuid.UUID] = mapped_column(ForeignKey("course.id")) course: Mapped["Course"] = relationship(back_populates="quizzes") quizJson: Mapped[str] = mapped_column(String, nullable=False) @@ -133,6 +140,7 @@ class Badge(db.Model): id: Mapped[uuid.UUID] = mapped_column(types.Uuid, primary_key=True, init=False, server_default=text("gen_random_uuid()")) name: Mapped[str] = mapped_column(String(16), nullable=False) + user_badges: Mapped[List["UserBadge"]] = relationship(back_populates="badge", cascade="all, delete-orphan") description: Mapped[str] = mapped_column(String(256), nullable=False, default='') createDate: Mapped[datetime] = mapped_column(DateTime, nullable=False, default=func.now()) icon: Mapped[str] = mapped_column(String(256), nullable=False, default='')