Compare commits

..

3 Commits

  1. 12
      backend/blueprints/profile/__init__.py
  2. 5
      backend/db/model.py
  3. 8
      backend/utils/auth.py

@ -1,9 +1,11 @@
from email.policy import default
from flask import Blueprint, request, jsonify, current_app
from flask import Blueprint, request, jsonify, current_app, g
from werkzeug.utils import secure_filename
from datetime import datetime
from utils.auth import auth_required, requires_role
from db.model import db
from db.model import User, UserRole, Session # Adjust based on your model's location
from db.model import User, Session, UserRole # Adjust based on your model's location
# from constants import UserRole
from werkzeug.security import generate_password_hash,check_password_hash
import uuid
import os
@ -169,3 +171,9 @@ def login():
# def profile_info(user_uuid):
# return user_uuid
#make a get request to get json on hello word
@profile.route('/hello')
@auth_required()
@requires_role([UserRole.USER])
def hello():
return jsonify({"message": f"Hello {g.current_user.firstName}"}), 200

@ -19,7 +19,7 @@ class User(db.Model):
email: Mapped[str] = mapped_column(String(64), nullable=False, unique=True)
firstName: Mapped[str] = mapped_column(String(32), nullable=False)
lastName: Mapped[str] = mapped_column(String(32), nullable=False)
username: Mapped[str] = mapped_column(String(32), nullable=False)
username: Mapped[str] = mapped_column(String(32), nullable=False, unique=True)
hash_password: Mapped[str] = mapped_column(String(256), nullable=False)
activationKey: Mapped[str] = mapped_column(String(128), nullable=False)
sessions: Mapped[List["Session"]] = relationship(back_populates="user", cascade="all, delete-orphan")
@ -29,6 +29,7 @@ class User(db.Model):
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")
publications: Mapped[List["Course"]] = relationship(back_populates="author", cascade="all, delete-orphan")
dob: Mapped[datetime] = mapped_column(DateTime, nullable=False, default=datetime.fromisocalendar(2002, 1, 1))
pfpFilename: Mapped[str] = mapped_column(String(256), nullable=False, default=DEFAULT_PROFILE_FILE)
joinedDate: Mapped[datetime] = mapped_column(DateTime, nullable=False, default=func.now())
@ -69,6 +70,8 @@ class Course(db.Model):
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")
authorID: Mapped[uuid.UUID] = mapped_column(ForeignKey("user.id"))
author: Mapped["User"] = relationship(back_populates="publications")
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)

@ -1,8 +1,8 @@
from functools import wraps
from flask import request, jsonify, g
from sqlalchemy import select, and_
from ..db.model import User, Session, db
from ..constants import UserRole
from db.model import User, Session, db
from constants import UserRole
def auth_required():
def decorator(f):
@ -38,8 +38,10 @@ def requires_role(roles=None):
@wraps(f)
def decorated_function(*args, **kwargs):
if g.get('is_authed', False) is False:
return jsonify({'error': 'Unauthorized'})
return jsonify({'error': 'Unauthorized'}), 401
if g.current_user.role in roles:
return f(*args, **kwargs)
else:
return jsonify({'error': 'Forbidden'}), 403
return decorated_function
return decorator
Loading…
Cancel
Save