feat: user certificate verification backend and UI

This commit is contained in:
swve 2025-07-20 10:37:48 +02:00
parent f609c50760
commit f01f7efb06
5 changed files with 389 additions and 1 deletions

View file

@ -17,6 +17,7 @@ from src.services.courses.certifications import (
update_certification,
delete_certification,
get_user_certificates_for_course,
get_certificate_by_user_certification_uuid,
)
router = APIRouter()
@ -110,4 +111,19 @@ async def api_get_user_certificates_for_course(
"""
return await get_user_certificates_for_course(
request, course_uuid, current_user, db_session
)
@router.get("/certificate/{user_certification_uuid}")
async def api_get_certificate_by_user_certification_uuid(
request: Request,
user_certification_uuid: str,
current_user: PublicUser = Depends(get_current_user),
db_session: Session = Depends(get_db_session),
) -> dict:
"""
Get a certificate by user_certification_uuid with certification and course details
"""
return await get_certificate_by_user_certification_uuid(
request, user_certification_uuid, current_user, db_session
)

View file

@ -396,6 +396,64 @@ async def check_course_completion_and_create_certificate(
return False
async def get_certificate_by_user_certification_uuid(
request: Request,
user_certification_uuid: str,
current_user: PublicUser | AnonymousUser,
db_session: Session,
) -> dict:
"""Get a certificate by user_certification_uuid with certification details"""
# Get certificate user by user_certification_uuid
statement = select(CertificateUser).where(
CertificateUser.user_certification_uuid == user_certification_uuid
)
certificate_user = db_session.exec(statement).first()
if not certificate_user:
raise HTTPException(
status_code=404,
detail="Certificate not found",
)
# Get the associated certification
statement = select(Certifications).where(Certifications.id == certificate_user.certification_id)
certification = db_session.exec(statement).first()
if not certification:
raise HTTPException(
status_code=404,
detail="Certification not found",
)
# Get course for RBAC check
statement = select(Course).where(Course.id == certification.course_id)
course = db_session.exec(statement).first()
if not course:
raise HTTPException(
status_code=404,
detail="Course not found",
)
# RBAC check - allow read access to the certificate owner or course owners/admins
if current_user.id != certificate_user.user_id:
# If not the certificate owner, check course access
await rbac_check(request, course.course_uuid, current_user, "read", db_session)
return {
"certificate_user": CertificateUserRead(**certificate_user.model_dump()),
"certification": CertificationRead(**certification.model_dump()),
"course": {
"id": course.id,
"course_uuid": course.course_uuid,
"name": course.name,
"description": course.description,
"thumbnail_image": course.thumbnail_image,
}
}
####################################################
# RBAC Utils
####################################################