brewman/brewman/brewman/routers/db_integrity.py

69 lines
1.8 KiB
Python

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)