diff --git a/src/StorageLeaf.py b/src/StorageLeaf.py index 4bf7fc6689249c60af650ba22901b7b7fc587a33..f746f23162fc7ca19f888a78eabb4769231265c7 100644 --- a/src/StorageLeaf.py +++ b/src/StorageLeaf.py @@ -13,7 +13,7 @@ from logic import Constants from logic.DiscoveryService import DiscoveryService from logic.database import Models from logic.database.Database import engine -from logic.routers import DeviceRouter, GeneralRouter +from logic.routers import DeviceRouter, GeneralRouter, DatabaseRouter from logic.routers import SensorRouter, MeasurementRouter LOGGER = DefaultLogger().create_logger_if_not_exists(Constants.APP_NAME) @@ -63,6 +63,7 @@ def overridden_redoc(): app.include_router(GeneralRouter.router) +app.include_router(DatabaseRouter.router) app.include_router(DeviceRouter.router) app.include_router(SensorRouter.router) app.include_router(MeasurementRouter.router) diff --git a/src/logic/routers/DatabaseRouter.py b/src/logic/routers/DatabaseRouter.py new file mode 100644 index 0000000000000000000000000000000000000000..678388161b9adb03a240a4ccd73f8fc4fd9bc520 --- /dev/null +++ b/src/logic/routers/DatabaseRouter.py @@ -0,0 +1,54 @@ +from datetime import datetime + +from fastapi import APIRouter, Depends +from sqlalchemy.orm import Session + +from Settings import 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='/database', + tags=['database'] +) + + +@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) diff --git a/src/logic/routers/GeneralRouter.py b/src/logic/routers/GeneralRouter.py index 7106ce38137a6ae276d6d05117bd7625e5ed99c6..7e156d2e3aca2f3cc21d23fe8ea609c90960dac2 100644 --- a/src/logic/routers/GeneralRouter.py +++ b/src/logic/routers/GeneralRouter.py @@ -1,13 +1,7 @@ -from datetime import datetime +from fastapi import APIRouter -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 +from Settings import VERSION +from logic.database import Schemas router = APIRouter( prefix='/general', @@ -20,43 +14,3 @@ router = APIRouter( 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)