Skip to content
Snippets Groups Projects
GeneralRouter.py 2.4 KiB
Newer Older
  • Learn to ignore specific revisions
  • from datetime import datetime
    
    
    from fastapi import APIRouter, Depends
    from sqlalchemy.orm import Session
    
    from starlette.background import BackgroundTasks
    
    from Settings import VERSION, SETTINGS
    
    from logic.Dependencies import get_database, check_api_key
    
    from logic.database import Schemas, DatabaseInfoProvider
    
    from logic.database.DatabaseCleaner import DatabaseCleaner, RetentionPolicy
    
    
    router = APIRouter(
        prefix='/general',
        tags=['general']
    )
    
    
    @router.get('/version',
                summary='Gets information about the server version',
                response_model=Schemas.Version)
    async def version():
        return Schemas.Version(**VERSION)
    
    
    @router.get('/databaseInfo',
                summary='Gets information about the database',
                response_model=Schemas.DatabaseInfo)
    async def databaseInfo(db: Session = Depends(get_database)):
        return DatabaseInfoProvider.get_database_info(db)
    
    @router.post('/databaseCleanup',
                 summary='Initiates a database cleanup by enforcing the configured retention policies for each sensor',
                 response_model=Schemas.Status,
                 dependencies=[Depends(check_api_key)])
    
    async def databaseCleanup(db: Session = Depends(get_database)):
        infoBefore = DatabaseInfoProvider.get_database_info(db)
    
    
        cleanupSettings = SETTINGS['database']['cleanup']
    
        retentionPolicies = cleanupSettings['retentionPolicies']
    
        policies = []
        for item in retentionPolicies:
    
            policies.append(RetentionPolicy(numberOfMeasurementsPerDay=item['numberOfMeasurementsPerDay'],
                                            ageInDays=item['ageInDays']))
    
        DatabaseCleaner(policies, cleanupSettings['forceBackupAfterCleanup']).clean(db, datetime.now().date())
    
    
        infoAfter = DatabaseInfoProvider.get_database_info(db)
    
        deletedMeasurements = infoBefore.number_of_measurements - infoAfter.number_of_measurements
        sizeFreed = infoBefore.size_on_disk_in_mb - infoAfter.size_on_disk_in_mb
        infoDifference = Schemas.DatabaseInfo(number_of_measurements=deletedMeasurements, size_on_disk_in_mb=sizeFreed)
    
    
        return Schemas.DatabaseCleanupInfo(before=infoBefore, after=infoAfter, difference=infoDifference)
    
    
    @router.get('/databaseCleanup',
                summary='Provides the status of the current database cleanup',
                response_model=Schemas.DatabaseCleanupInfo)
    async def databaseCleanup():
        return Schemas.DatabaseCleanupInfo(status=Schemas.DatabaseCleanupStatus.UNDEFINED)