From 3476f239e5e0b9fdd0fd2c86469f06cc343cd553 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Sun, 31 Oct 2021 00:50:43 +0200
Subject: [PATCH] #9 - status route shows cleanup information

---
 src/logic/DatabaseCleanupService.py |  7 +++++--
 src/logic/JobScheduler.py           | 10 ++++++++--
 src/logic/database/Schemas.py       |  6 +++++-
 src/logic/routers/DatabaseRouter.py |  2 +-
 4 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/src/logic/DatabaseCleanupService.py b/src/logic/DatabaseCleanupService.py
index cf654d1..611d553 100644
--- a/src/logic/DatabaseCleanupService.py
+++ b/src/logic/DatabaseCleanupService.py
@@ -13,7 +13,8 @@ class DatabaseCleanupService:
         self._cleanupSettings = cleanupSettings
 
     def cleanup(self, db: Session) -> Schemas.DatabaseCleanupInfo:
-        infoBefore = DatabaseInfoProvider.get_database_info(db)
+        infoBefore = DatabaseInfoProvider.get_database_info(db)#
+        startTime = datetime.now()
 
         retentionPolicies = self._cleanupSettings['retentionPolicies']
         policies = []
@@ -24,10 +25,12 @@ class DatabaseCleanupService:
         DatabaseCleaner(policies, self._cleanupSettings['forceBackupAfterCleanup']).clean(db, datetime.now().date())
 
         infoAfter = DatabaseInfoProvider.get_database_info(db)
+        endTime = datetime.now()
 
         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(status=Schemas.DatabaseCleanupStatus.FINISHED, before=infoBefore,
-                                           after=infoAfter, difference=infoDifference)
+                                           after=infoAfter, difference=infoDifference,
+                                           startTime=startTime, endTime=endTime)
diff --git a/src/logic/JobScheduler.py b/src/logic/JobScheduler.py
index ade6378..bb590eb 100644
--- a/src/logic/JobScheduler.py
+++ b/src/logic/JobScheduler.py
@@ -9,6 +9,7 @@ from apscheduler.triggers.cron import CronTrigger
 
 from logic import Constants
 from logic.database import Schemas
+from logic.database.Schemas import DatabaseCleanupInfo
 
 LOGGER = logging.getLogger(Constants.APP_NAME)
 TIMEZONE = pytz.timezone('Europe/Berlin')
@@ -31,6 +32,8 @@ class JobScheduler:
             self.ID_MANUAL: self.STATE_IDLE
         }
 
+        self._jobResults = []
+
         self._scheduler.start(paused=True)
 
         self._jobAutomatic.pause()
@@ -41,6 +44,9 @@ class JobScheduler:
     def job_event_listener(self, event: JobExecutionEvent):
         self._jobStatus[event.job_id] = self.STATE_IDLE
 
+        if isinstance(event.retval, DatabaseCleanupInfo):
+            self._jobResults.append(event.retval)
+
         if event.exception:
             LOGGER.error(f'Error executing job "{event.job_id}"')
         else:
@@ -60,7 +66,7 @@ class JobScheduler:
                                 id=self.ID_MANUAL, timezone=TIMEZONE)
         self._jobStatus[self.ID_MANUAL] = self.STATE_RUNNING
 
-    def get_scheduled_jobs(self) -> Schemas.ScheduledJobs:
+    def get_scheduled_jobs(self) -> Schemas.ScheduledJobStatus:
         jobs = []
         for job in self._scheduler.get_jobs():
             scheduledJob = Schemas.ScheduledJob(job_id=str(job.id),
@@ -68,7 +74,7 @@ class JobScheduler:
                                                 next_run=str(job.next_run_time))
             jobs.append(scheduledJob)
 
-        return Schemas.ScheduledJobs(jobs=jobs)
+        return Schemas.ScheduledJobStatus(jobs=jobs, job_results=self._jobResults)
 
 
 def dummyFunc():
diff --git a/src/logic/database/Schemas.py b/src/logic/database/Schemas.py
index 961c4a1..0a6bc2a 100644
--- a/src/logic/database/Schemas.py
+++ b/src/logic/database/Schemas.py
@@ -1,3 +1,4 @@
+from datetime import datetime
 from enum import Enum
 from typing import List
 
@@ -50,6 +51,8 @@ class DatabaseCleanupInfo(BaseModel):
     before: DatabaseInfo = None
     after: DatabaseInfo = None
     difference: DatabaseInfo = None
+    startTime: datetime
+    endTime: datetime
 
 
 class MinMax(BaseModel):
@@ -152,5 +155,6 @@ class ScheduledJob(BaseModel):
         }
 
 
-class ScheduledJobs(BaseModel):
+class ScheduledJobStatus(BaseModel):
     jobs: List[ScheduledJob]
+    job_results: List[DatabaseCleanupInfo]
diff --git a/src/logic/routers/DatabaseRouter.py b/src/logic/routers/DatabaseRouter.py
index c46fe10..1965f13 100644
--- a/src/logic/routers/DatabaseRouter.py
+++ b/src/logic/routers/DatabaseRouter.py
@@ -36,7 +36,7 @@ async def databaseCleanup(db: Session = Depends(get_database)):
 
 @router.get('/databaseCleanup',
             summary='Provides the status of the all scheduled database cleanup jobs',
-            response_model=Schemas.ScheduledJobs)
+            response_model=Schemas.ScheduledJobStatus)
 async def getStatus():
     from logic import JobScheduler
     return JobScheduler.SCHEDULER.get_scheduled_jobs()
-- 
GitLab