mirror of
https://github.com/rzmk/learnhouse.git
synced 2025-12-19 04:19:25 +00:00
feat: user certificate verification backend and UI
This commit is contained in:
parent
f609c50760
commit
f01f7efb06
5 changed files with 389 additions and 1 deletions
|
|
@ -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
|
||||
)
|
||||
|
|
@ -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
|
||||
####################################################
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue