from fastapi import APIRouter, Depends, Security from sqlalchemy import desc, distinct, func, over from sqlalchemy.orm import Session from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal from ..models import Attendance from ..schemas.auth import UserToken router = APIRouter() # Dependency def get_db() -> Session: try: db = SessionLocal() yield db finally: db.close() @router.post("") def post_check_db(db: Session = Depends(get_db), user: UserToken = Security(get_user)): info = {} duplicate_attendances = get_duplicate_attendances(db) if duplicate_attendances > 0: fix_duplicate_attendances(db) info["Duplicate Attendances Fixed"] = duplicate_attendances db.commit() return info def get_duplicate_attendances(db): sub_query = ( db.query( over( distinct(func.first_value(Attendance.id)), partition_by=[Attendance.employee_id, Attendance.date], ) ) .filter(Attendance.is_valid == True) .subquery() ) query = ( db.query(func.count(Attendance.id)) .filter(~Attendance.id.in_(sub_query)) .filter(Attendance.is_valid == True) ) return query.scalar() def fix_duplicate_attendances(db): sub = ( db.query( over( distinct(func.first_value(Attendance.id)), partition_by=[Attendance.employee_id, Attendance.date], order_by=desc(Attendance.creation_date), ) ) .filter(Attendance.is_valid == True) .subquery() ) db.query(Attendance).filter(~Attendance.id.in_(sub)).filter( Attendance.is_valid == True ).delete(False)