learnhouse/apps/api/src/services/courses/updates.py

151 lines
4.3 KiB
Python

from datetime import datetime
from typing import List
from uuid import uuid4
from fastapi import HTTPException, Request, status
from sqlmodel import Session, col, select
from src.db.course_updates import (
CourseUpdate,
CourseUpdateCreate,
CourseUpdateRead,
CourseUpdateUpdate,
)
from src.db.courses import Course
from src.db.organizations import Organization
from src.db.users import AnonymousUser, PublicUser
from src.services.courses.courses import rbac_check
async def create_update(
request: Request,
course_uuid: str,
update_object: CourseUpdateCreate,
current_user: PublicUser | AnonymousUser,
db_session: Session,
) -> CourseUpdateRead:
# CHekc if org exists
statement_org = select(Organization).where(Organization.id == update_object.org_id)
org = db_session.exec(statement_org).first()
if not org or org.id is None:
raise HTTPException(
status_code=status.HTTP_409_CONFLICT, detail="Organization does not exist"
)
statement = select(Course).where(Course.course_uuid == course_uuid)
course = db_session.exec(statement).first()
if not course or course.id is None:
raise HTTPException(
status_code=status.HTTP_409_CONFLICT, detail="Course does not exist"
)
# RBAC check
await rbac_check(request, course.course_uuid, current_user, "update", db_session)
# Generate UUID
courseupdate_uuid = str(f"courseupdate_{uuid4()}")
update = CourseUpdate(
**update_object.model_dump(),
course_id=course.id,
courseupdate_uuid=courseupdate_uuid,
creation_date=str(datetime.now()),
update_date=str(datetime.now()),
)
db_session.add(update)
db_session.commit()
db_session.refresh(update)
return CourseUpdateRead(**update.model_dump())
# Update Course Update
async def update_update(
request: Request,
courseupdate_uuid: str,
update_object: CourseUpdateUpdate,
current_user: PublicUser | AnonymousUser,
db_session: Session,
) -> CourseUpdateRead:
statement = select(CourseUpdate).where(
CourseUpdate.courseupdate_uuid == courseupdate_uuid
)
update = db_session.exec(statement).first()
if not update or update.id is None:
raise HTTPException(
status_code=status.HTTP_409_CONFLICT, detail="Update does not exist"
)
# RBAC check
await rbac_check(
request, update.courseupdate_uuid, current_user, "update", db_session
)
for key, value in update_object.model_dump().items():
if value is not None:
setattr(update, key, value)
db_session.add(update)
db_session.commit()
db_session.refresh(update)
return CourseUpdateRead(**update.model_dump())
# Delete Course Update
async def delete_update(
request: Request,
courseupdate_uuid: str,
current_user: PublicUser | AnonymousUser,
db_session: Session,
):
statement = select(CourseUpdate).where(
CourseUpdate.courseupdate_uuid == courseupdate_uuid
)
update = db_session.exec(statement).first()
if not update or update.id is None:
raise HTTPException(
status_code=status.HTTP_409_CONFLICT, detail="Update does not exist"
)
# RBAC check
await rbac_check(
request, update.courseupdate_uuid, current_user, "delete", db_session
)
db_session.delete(update)
db_session.commit()
return {"message": "Update deleted successfully"}
# Get Course Updates by Course ID
async def get_updates_by_course_uuid(
request: Request,
course_uuid: str,
current_user: PublicUser | AnonymousUser,
db_session: Session,
) -> List[CourseUpdateRead]:
# FInd if course exists
statement = select(Course).where(Course.course_uuid == course_uuid)
course = db_session.exec(statement).first()
if not course or course.id is None:
raise HTTPException(
status_code=status.HTTP_409_CONFLICT, detail="Course does not exist"
)
statement = (
select(CourseUpdate)
.where(CourseUpdate.course_id == course.id)
.order_by(col(CourseUpdate.creation_date).desc())
) # https://sqlmodel.tiangolo.com/tutorial/where/#type-annotations-and-errors
updates = db_session.exec(statement).all()
return [CourseUpdateRead(**update.model_dump()) for update in updates]