brewman/brewman/routers/db_integrity.py

65 lines
1.7 KiB
Python

from fastapi import (
APIRouter,
Depends,
Security,
)
from sqlalchemy import distinct, func, over, desc
from sqlalchemy.orm import Session
from ..models import Attendance
from ..schemas.auth import UserToken
from ..core.security import get_current_active_user as get_user
from ..db.session import SessionLocal
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)