Enroll a user in a course on their behalf.
(
request: Request,
token_user: APITokenUser,
user_id: int,
course_uuid: str,
db_session: AsyncSession,
)
| 232 | |
| 233 | |
| 234 | async def enroll_user( |
| 235 | request: Request, |
| 236 | token_user: APITokenUser, |
| 237 | user_id: int, |
| 238 | course_uuid: str, |
| 239 | db_session: AsyncSession, |
| 240 | ) -> TrailRead: |
| 241 | """Enroll a user in a course on their behalf.""" |
| 242 | |
| 243 | await _get_user_in_org(user_id, token_user.org_id, db_session) |
| 244 | |
| 245 | course = (await db_session.execute( |
| 246 | select(Course).where( |
| 247 | Course.course_uuid == course_uuid, |
| 248 | Course.org_id == token_user.org_id, |
| 249 | ) |
| 250 | )).scalars().first() |
| 251 | if not course: |
| 252 | raise HTTPException(status_code=404, detail="Course not found") |
| 253 | |
| 254 | # Ensure trail exists |
| 255 | trail = (await db_session.execute( |
| 256 | select(Trail).where(Trail.org_id == token_user.org_id, Trail.user_id == user_id) |
| 257 | )).scalars().first() |
| 258 | if not trail: |
| 259 | trail = Trail( |
| 260 | org_id=token_user.org_id, |
| 261 | user_id=user_id, |
| 262 | trail_uuid=f"trail_{uuid4()}", |
| 263 | creation_date=str(datetime.now()), |
| 264 | update_date=str(datetime.now()), |
| 265 | ) |
| 266 | db_session.add(trail) |
| 267 | await db_session.commit() |
| 268 | await db_session.refresh(trail) |
| 269 | |
| 270 | # Check for existing enrollment |
| 271 | existing = (await db_session.execute( |
| 272 | select(TrailRun).where( |
| 273 | TrailRun.course_id == course.id, |
| 274 | TrailRun.user_id == user_id, |
| 275 | TrailRun.org_id == token_user.org_id, |
| 276 | ) |
| 277 | )).scalars().first() |
| 278 | if existing: |
| 279 | raise HTTPException(status_code=400, detail="User is already enrolled in this course") |
| 280 | |
| 281 | trail_run = TrailRun( |
| 282 | trail_id=trail.id if trail.id is not None else 0, |
| 283 | course_id=course.id if course.id is not None else 0, |
| 284 | org_id=token_user.org_id, |
| 285 | user_id=user_id, |
| 286 | creation_date=str(datetime.now()), |
| 287 | update_date=str(datetime.now()), |
| 288 | ) |
| 289 | db_session.add(trail_run) |
| 290 | await db_session.commit() |
| 291 | await db_session.refresh(trail_run) |