mirror of
https://github.com/rzmk/learnhouse.git
synced 2025-12-19 04:19:25 +00:00
151 lines
4.3 KiB
Python
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]
|