From 8b6a3672579c1fbda822dcce98f21df8a6c0ecc8 Mon Sep 17 00:00:00 2001 From: "Patrik J. Braun" Date: Fri, 27 Dec 2019 00:24:44 +0100 Subject: [PATCH] adding job last run status --- src/backend/middlewares/admin/AdminMWs.ts | 11 +++ .../model/database/interfaces/IJobManager.ts | 5 +- src/backend/model/jobs/JobManager.ts | 14 +++- src/backend/model/jobs/jobs/DBResetJob.ts | 2 +- src/backend/model/jobs/jobs/FileJob.ts | 2 +- src/backend/model/jobs/jobs/IJob.ts | 6 +- src/backend/model/jobs/jobs/IndexingJob.ts | 2 +- src/backend/model/jobs/jobs/Job.ts | 31 +++++-- .../model/jobs/jobs/TempFolderCleaningJob.ts | 2 +- .../model/jobs/jobs/ThumbnailGenerationJob.ts | 4 +- src/backend/routes/admin/AdminRouter.ts | 6 ++ .../private/PrivateConfigDefaultsClass.ts | 55 ++++++++++--- src/common/config/public/ConfigClass.ts | 2 +- src/common/entities/job/JobLastRunDTO.ts | 15 ++++ .../{settings => job}/JobProgressDTO.ts | 0 .../app/ui/admin/admin.component.html | 82 +++++++++---------- .../indexing/indexing.settings.component.ts | 2 +- .../jobs/jobs.settings.component.html | 4 +- .../settings/jobs/jobs.settings.component.ts | 6 +- .../job-progress.settings.component.html | 17 ++++ .../job-progress.settings.component.ts | 5 +- .../photo/photo.settings.component.ts | 2 +- .../app/ui/settings/scheduled-jobs.service.ts | 6 +- .../thumbnail/thumbnail.settings.component.ts | 2 +- .../video/video.settings.component.ts | 2 +- 25 files changed, 206 insertions(+), 79 deletions(-) create mode 100644 src/common/entities/job/JobLastRunDTO.ts rename src/common/entities/{settings => job}/JobProgressDTO.ts (100%) diff --git a/src/backend/middlewares/admin/AdminMWs.ts b/src/backend/middlewares/admin/AdminMWs.ts index 72e54977..ee68fca2 100644 --- a/src/backend/middlewares/admin/AdminMWs.ts +++ b/src/backend/middlewares/admin/AdminMWs.ts @@ -102,4 +102,15 @@ export class AdminMWs { return next(new ErrorDTO(ErrorCodes.JOB_ERROR, 'Job error: ' + JSON.stringify(err, null, ' '), err)); } } + public static getJobLastRuns(req: Request, res: Response, next: NextFunction) { + try { + req.resultPipe = ObjectManagers.getInstance().JobManager.getJobLastRuns(); + return next(); + } catch (err) { + if (err instanceof Error) { + return next(new ErrorDTO(ErrorCodes.JOB_ERROR, 'Job error: ' + err.toString(), err)); + } + return next(new ErrorDTO(ErrorCodes.JOB_ERROR, 'Job error: ' + JSON.stringify(err, null, ' '), err)); + } + } } diff --git a/src/backend/model/database/interfaces/IJobManager.ts b/src/backend/model/database/interfaces/IJobManager.ts index f48f5abf..60290be1 100644 --- a/src/backend/model/database/interfaces/IJobManager.ts +++ b/src/backend/model/database/interfaces/IJobManager.ts @@ -1,5 +1,6 @@ -import {JobProgressDTO} from '../../../../common/entities/settings/JobProgressDTO'; +import {JobProgressDTO} from '../../../../common/entities/job/JobProgressDTO'; import {JobDTO} from '../../../../common/entities/job/JobDTO'; +import {JobLastRunDTO} from '../../../../common/entities/job/JobLastRunDTO'; export interface IJobManager { @@ -15,4 +16,6 @@ export interface IJobManager { stopSchedules(): void; runSchedules(): void; + + getJobLastRuns(): { [key: string]: { [key: string]: JobLastRunDTO } }; } diff --git a/src/backend/model/jobs/JobManager.ts b/src/backend/model/jobs/JobManager.ts index 3e45898c..09d1adcd 100644 --- a/src/backend/model/jobs/JobManager.ts +++ b/src/backend/model/jobs/JobManager.ts @@ -1,11 +1,12 @@ import {IJobManager} from '../database/interfaces/IJobManager'; -import {JobProgressDTO} from '../../../common/entities/settings/JobProgressDTO'; +import {JobProgressDTO} from '../../../common/entities/job/JobProgressDTO'; import {IJob} from './jobs/IJob'; import {JobRepository} from './JobRepository'; import {Config} from '../../../common/config/private/Config'; import {AfterJobTrigger, JobScheduleDTO, JobTriggerType} from '../../../common/entities/job/JobScheduleDTO'; import {Logger} from '../../Logger'; import {NotificationManager} from '../NotifocationManager'; +import {JobLastRunDTO} from '../../../common/entities/job/JobLastRunDTO'; declare var global: NodeJS.Global; @@ -30,6 +31,14 @@ export class JobManager implements IJobManager { return m; } + getJobLastRuns(): { [key: string]: { [key: string]: JobLastRunDTO } } { + const m: { [id: string]: { [id: string]: JobLastRunDTO } } = {}; + JobRepository.Instance.getAvailableJobs().forEach(t => { + m[t.Name] = t.LastRuns; + }); + return m; + } + async run(jobName: string, config: T): Promise { const t = this.findJob(jobName); if (t) { @@ -54,9 +63,10 @@ export class JobManager implements IJobManager { } async onJobFinished(job: IJob): Promise { + console.log('onFinished' + job.Name); const sch = Config.Server.Jobs.scheduled.find(s => s.jobName === job.Name); if (sch) { - console.log('found parent'); + console.log('parent found' + sch.jobName); const children = Config.Server.Jobs.scheduled.filter(s => s.trigger.type === JobTriggerType.after && (s.trigger).afterScheduleName === sch.name); for (let i = 0; i < children.length; ++i) { diff --git a/src/backend/model/jobs/jobs/DBResetJob.ts b/src/backend/model/jobs/jobs/DBResetJob.ts index 73872959..ed8d3d5c 100644 --- a/src/backend/model/jobs/jobs/DBResetJob.ts +++ b/src/backend/model/jobs/jobs/DBResetJob.ts @@ -1,4 +1,4 @@ -import {JobProgressDTO} from '../../../../common/entities/settings/JobProgressDTO'; +import {JobProgressDTO} from '../../../../common/entities/job/JobProgressDTO'; import {ObjectManagers} from '../../ObjectManagers'; import {Config} from '../../../../common/config/private/Config'; import {ConfigTemplateEntry, DefaultsJobs} from '../../../../common/entities/job/JobDTO'; diff --git a/src/backend/model/jobs/jobs/FileJob.ts b/src/backend/model/jobs/jobs/FileJob.ts index 9c7d5969..9f50f35d 100644 --- a/src/backend/model/jobs/jobs/FileJob.ts +++ b/src/backend/model/jobs/jobs/FileJob.ts @@ -1,4 +1,4 @@ -import {JobProgressDTO} from '../../../../common/entities/settings/JobProgressDTO'; +import {JobProgressDTO} from '../../../../common/entities/job/JobProgressDTO'; import {ConfigTemplateEntry} from '../../../../common/entities/job/JobDTO'; import {Job} from './Job'; import * as path from 'path'; diff --git a/src/backend/model/jobs/jobs/IJob.ts b/src/backend/model/jobs/jobs/IJob.ts index cf094be1..835bc909 100644 --- a/src/backend/model/jobs/jobs/IJob.ts +++ b/src/backend/model/jobs/jobs/IJob.ts @@ -1,12 +1,14 @@ -import {JobProgressDTO} from '../../../../common/entities/settings/JobProgressDTO'; +import {JobProgressDTO} from '../../../../common/entities/job/JobProgressDTO'; import {JobDTO} from '../../../../common/entities/job/JobDTO'; +import {JobLastRunDTO} from '../../../../common/entities/job/JobLastRunDTO'; export interface IJob extends JobDTO { Name: string; Supported: boolean; Progress: JobProgressDTO; + LastRuns: { [key: string]: JobLastRunDTO }; - start(config: T, onFinishCB?: () => void): Promise; + start(config: T, OnFinishCB: () => void): Promise; stop(): void; diff --git a/src/backend/model/jobs/jobs/IndexingJob.ts b/src/backend/model/jobs/jobs/IndexingJob.ts index ee94ddd6..524deecd 100644 --- a/src/backend/model/jobs/jobs/IndexingJob.ts +++ b/src/backend/model/jobs/jobs/IndexingJob.ts @@ -1,4 +1,4 @@ -import {JobProgressDTO, JobState} from '../../../../common/entities/settings/JobProgressDTO'; +import {JobProgressDTO, JobState} from '../../../../common/entities/job/JobProgressDTO'; import {ObjectManagers} from '../../ObjectManagers'; import * as path from 'path'; import {Config} from '../../../../common/config/private/Config'; diff --git a/src/backend/model/jobs/jobs/Job.ts b/src/backend/model/jobs/jobs/Job.ts index 8127f34c..9154c694 100644 --- a/src/backend/model/jobs/jobs/Job.ts +++ b/src/backend/model/jobs/jobs/Job.ts @@ -1,9 +1,11 @@ -import {JobProgressDTO, JobState} from '../../../../common/entities/settings/JobProgressDTO'; +import {JobProgressDTO, JobState} from '../../../../common/entities/job/JobProgressDTO'; import {Logger} from '../../../Logger'; import {IJob} from './IJob'; import {ConfigTemplateEntry, JobDTO} from '../../../../common/entities/job/JobDTO'; +import {JobLastRunDTO, JobLastRunState} from '../../../../common/entities/job/JobLastRunDTO'; declare const process: any; +declare const global: any; const LOG_TAG = '[JOB]'; @@ -14,6 +16,7 @@ export abstract class Job implements IJob { protected config: T; protected prResolve: () => void; protected IsInstant = false; + protected lastRuns: { [key: string]: JobLastRunDTO } = {}; public abstract get Supported(): boolean; @@ -21,12 +24,15 @@ export abstract class Job implements IJob { public abstract get ConfigTemplate(): ConfigTemplateEntry[]; + public get LastRuns(): { [key: string]: JobLastRunDTO } { + return this.lastRuns; + } + public get Progress(): JobProgressDTO { return this.progress; } - public start(config: T, onFinishCB = () => { - }): Promise { + public start(config: T, onFinishCB: () => void): Promise { this.OnFinishCB = onFinishCB; if (this.state === JobState.idle && this.Supported) { Logger.info(LOG_TAG, 'Running job: ' + this.Name); @@ -78,6 +84,17 @@ export abstract class Job implements IJob { protected abstract async init(): Promise; private onFinish(): void { + this.lastRuns[JSON.stringify(this.config)] = { + all: this.progress.left + this.progress.progress, + done: this.progress.progress, + comment: '', + config: this.config, + state: this.progress.state === JobState.stopping ? JobLastRunState.canceled : JobLastRunState.finished, + time: { + start: this.progress.time.start, + end: Date.now() + } + }; this.progress = null; if (global.gc) { global.gc(); @@ -95,16 +112,16 @@ export abstract class Job implements IJob { if (this.state === JobState.idle) { return; } + let prg = null; if (this.state === JobState.running) { - this.progress = await this.step(); - } else { - this.progress = null; + prg = await this.step(); } - if (this.progress == null) { // finished + if (prg == null) { // finished this.state = JobState.idle; this.onFinish(); return; } + this.progress = prg; this.run(); } catch (e) { Logger.error(LOG_TAG, e); diff --git a/src/backend/model/jobs/jobs/TempFolderCleaningJob.ts b/src/backend/model/jobs/jobs/TempFolderCleaningJob.ts index 070ff37a..a6fafe63 100644 --- a/src/backend/model/jobs/jobs/TempFolderCleaningJob.ts +++ b/src/backend/model/jobs/jobs/TempFolderCleaningJob.ts @@ -3,7 +3,7 @@ import * as path from 'path'; import * as util from 'util'; import {promises as fsp} from 'fs'; import {Job} from './Job'; -import {JobProgressDTO} from '../../../../common/entities/settings/JobProgressDTO'; +import {JobProgressDTO} from '../../../../common/entities/job/JobProgressDTO'; import {ProjectPath} from '../../../ProjectPath'; import {PhotoProcessing} from '../../fileprocessing/PhotoProcessing'; import {VideoProcessing} from '../../fileprocessing/VideoProcessing'; diff --git a/src/backend/model/jobs/jobs/ThumbnailGenerationJob.ts b/src/backend/model/jobs/jobs/ThumbnailGenerationJob.ts index e41c4ea2..d0a96d8e 100644 --- a/src/backend/model/jobs/jobs/ThumbnailGenerationJob.ts +++ b/src/backend/model/jobs/jobs/ThumbnailGenerationJob.ts @@ -28,14 +28,14 @@ export class ThumbnailGenerationJob extends FileJob { + start(config: { sizes: number[] }, OnFinishCB: () => void): Promise { for (let i = 0; i < config.sizes.length; ++i) { if (Config.Client.Media.Thumbnail.thumbnailSizes.indexOf(config.sizes[i]) === -1) { throw new Error('unknown thumbnails size: ' + config.sizes[i] + '. Add it to the possible thumbnail sizes.'); } } - return super.start(config); + return super.start(config, OnFinishCB); } protected async processDirectory(directory: DirectoryDTO): Promise { diff --git a/src/backend/routes/admin/AdminRouter.ts b/src/backend/routes/admin/AdminRouter.ts index 5bd4d1c9..3f7b2aca 100644 --- a/src/backend/routes/admin/AdminRouter.ts +++ b/src/backend/routes/admin/AdminRouter.ts @@ -43,6 +43,12 @@ export class AdminRouter { AdminMWs.getJobProgresses, RenderingMWs.renderResult ); + app.get('/api/admin/jobs/scheduled/lastRun', + AuthenticationMWs.authenticate, + AuthenticationMWs.authorise(UserRoles.Admin), + AdminMWs.getJobLastRuns, + RenderingMWs.renderResult + ); app.post('/api/admin/jobs/scheduled/:id/start', AuthenticationMWs.authenticate, AuthenticationMWs.authorise(UserRoles.Admin), diff --git a/src/common/config/private/PrivateConfigDefaultsClass.ts b/src/common/config/private/PrivateConfigDefaultsClass.ts index 08f26b5b..a2e3b038 100644 --- a/src/common/config/private/PrivateConfigDefaultsClass.ts +++ b/src/common/config/private/PrivateConfigDefaultsClass.ts @@ -75,17 +75,50 @@ export class PrivateConfigDefaultsClass extends PublicConfigClass implements IPr listingLimit: 1000 }, Jobs: { - scheduled: [{ - name: DefaultsJobs[DefaultsJobs['Database Reset']], - jobName: DefaultsJobs[DefaultsJobs['Database Reset']], - config: {}, - trigger: {type: JobTriggerType.never} - }, { - name: DefaultsJobs[DefaultsJobs.Indexing], - jobName: DefaultsJobs[DefaultsJobs.Indexing], - config: {}, - trigger: {type: JobTriggerType.never} - }] + scheduled: [ + { + name: DefaultsJobs[DefaultsJobs.Indexing], + jobName: DefaultsJobs[DefaultsJobs.Indexing], + config: {}, + trigger: {type: JobTriggerType.never} + }, + { + name: DefaultsJobs[DefaultsJobs['Thumbnail Generation']], + jobName: DefaultsJobs[DefaultsJobs['Thumbnail Generation']], + config: {sizes: [160]}, + trigger: { + type: JobTriggerType.after, + afterScheduleName: DefaultsJobs[DefaultsJobs.Indexing] + } + }, + { + name: DefaultsJobs[DefaultsJobs['Photo Converting']], + jobName: DefaultsJobs[DefaultsJobs['Photo Converting']], + config: {}, + trigger: { + type: JobTriggerType.after, + afterScheduleName: DefaultsJobs[DefaultsJobs['Thumbnail Generation']] + } + }, + { + name: DefaultsJobs[DefaultsJobs['Video Converting']], + jobName: DefaultsJobs[DefaultsJobs['Video Converting']], + config: {}, + trigger: { + type: JobTriggerType.after, + afterScheduleName: DefaultsJobs[DefaultsJobs['Photo Converting']] + } + }, + { + name: DefaultsJobs[DefaultsJobs['Temp Folder Cleaning']], + jobName: DefaultsJobs[DefaultsJobs['Temp Folder Cleaning']], + config: {}, + trigger: { + type: JobTriggerType.after, + afterScheduleName: DefaultsJobs[DefaultsJobs['Video Converting']] + } + } + ] } }; } diff --git a/src/common/config/public/ConfigClass.ts b/src/common/config/public/ConfigClass.ts index b74911d9..b0f66bf9 100644 --- a/src/common/config/public/ConfigClass.ts +++ b/src/common/config/public/ConfigClass.ts @@ -115,7 +115,7 @@ export module ClientConfig { /** * These configuration will be available at frontend and backend too */ -export class PublicConfigClass { +export class PublicConfigClass { public Client: ClientConfig.Config = { applicationTitle: 'PiGallery 2', diff --git a/src/common/entities/job/JobLastRunDTO.ts b/src/common/entities/job/JobLastRunDTO.ts new file mode 100644 index 00000000..1e1442e5 --- /dev/null +++ b/src/common/entities/job/JobLastRunDTO.ts @@ -0,0 +1,15 @@ +export enum JobLastRunState { + finished = 1, canceled = 2 +} + +export interface JobLastRunDTO { + config: any; + done: number; + all: number; + state: JobLastRunState; + comment: string; + time: { + start: number, + end: number + }; +} diff --git a/src/common/entities/settings/JobProgressDTO.ts b/src/common/entities/job/JobProgressDTO.ts similarity index 100% rename from src/common/entities/settings/JobProgressDTO.ts rename to src/common/entities/job/JobProgressDTO.ts diff --git a/src/frontend/app/ui/admin/admin.component.html b/src/frontend/app/ui/admin/admin.component.html index 078c7a53..726bb462 100644 --- a/src/frontend/app/ui/admin/admin.component.html +++ b/src/frontend/app/ui/admin/admin.component.html @@ -64,47 +64,47 @@
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + diff --git a/src/frontend/app/ui/settings/indexing/indexing.settings.component.ts b/src/frontend/app/ui/settings/indexing/indexing.settings.component.ts index 9d9b7ab4..fd69093c 100644 --- a/src/frontend/app/ui/settings/indexing/indexing.settings.component.ts +++ b/src/frontend/app/ui/settings/indexing/indexing.settings.component.ts @@ -10,7 +10,7 @@ import {I18n} from '@ngx-translate/i18n-polyfill'; import {ScheduledJobsService} from '../scheduled-jobs.service'; import {DefaultsJobs} from '../../../../../common/entities/job/JobDTO'; import {ServerConfig} from '../../../../../common/config/private/IPrivateConfig'; -import {JobState} from '../../../../../common/entities/settings/JobProgressDTO'; +import {JobState} from '../../../../../common/entities/job/JobProgressDTO'; @Component({ selector: 'app-settings-indexing', diff --git a/src/frontend/app/ui/settings/jobs/jobs.settings.component.html b/src/frontend/app/ui/settings/jobs/jobs.settings.component.html index 0f32cf83..4ba16978 100644 --- a/src/frontend/app/ui/settings/jobs/jobs.settings.component.html +++ b/src/frontend/app/ui/settings/jobs/jobs.settings.component.html @@ -189,9 +189,11 @@
+ + [progress]="jobsService.progress.value[schedule.jobName]" + [lastRun]="(jobsService.lastRuns.value[schedule.jobName] || {})[getConfigHash(schedule)]"> diff --git a/src/frontend/app/ui/settings/jobs/jobs.settings.component.ts b/src/frontend/app/ui/settings/jobs/jobs.settings.component.ts index dd8f5abe..31604bf8 100644 --- a/src/frontend/app/ui/settings/jobs/jobs.settings.component.ts +++ b/src/frontend/app/ui/settings/jobs/jobs.settings.component.ts @@ -18,7 +18,7 @@ import { import {Utils} from '../../../../../common/Utils'; import {ServerConfig} from '../../../../../common/config/private/IPrivateConfig'; import {ConfigTemplateEntry} from '../../../../../common/entities/job/JobDTO'; -import {JobState} from '../../../../../common/entities/settings/JobProgressDTO'; +import {JobState} from '../../../../../common/entities/job/JobProgressDTO'; import {Job} from '../../../../../backend/model/jobs/jobs/Job'; import {ModalDirective} from 'ngx-bootstrap/modal'; @@ -211,6 +211,10 @@ export class JobsSettingsComponent extends SettingsComponent list.length) { return 0; diff --git a/src/frontend/app/ui/settings/jobs/progress/job-progress.settings.component.html b/src/frontend/app/ui/settings/jobs/progress/job-progress.settings.component.html index 30370646..7275c564 100644 --- a/src/frontend/app/ui/settings/jobs/progress/job-progress.settings.component.html +++ b/src/frontend/app/ui/settings/jobs/progress/job-progress.settings.component.html @@ -1,3 +1,20 @@ +
+
+ Last run: +
+
+ + {{lastRun.time.start | date:'medium'}} - {{lastRun.time.end | date:'mediumTime'}} +
+
+ + {{lastRun.all}}/{{lastRun.done}} +
+
+ + {{JobLastRunState[lastRun.state]}} +
+
diff --git a/src/frontend/app/ui/settings/jobs/progress/job-progress.settings.component.ts b/src/frontend/app/ui/settings/jobs/progress/job-progress.settings.component.ts index edcf9707..ed25a50d 100644 --- a/src/frontend/app/ui/settings/jobs/progress/job-progress.settings.component.ts +++ b/src/frontend/app/ui/settings/jobs/progress/job-progress.settings.component.ts @@ -1,6 +1,7 @@ import {Component, Input, OnChanges, OnDestroy} from '@angular/core'; -import {JobProgressDTO, JobState} from '../../../../../../common/entities/settings/JobProgressDTO'; +import {JobProgressDTO, JobState} from '../../../../../../common/entities/job/JobProgressDTO'; import {Subscription, timer} from 'rxjs'; +import {JobLastRunDTO, JobLastRunState} from '../../../../../../common/entities/job/JobLastRunDTO'; @Component({ selector: 'app-settings-job-progress', @@ -10,8 +11,10 @@ import {Subscription, timer} from 'rxjs'; export class JobProgressComponent implements OnDestroy, OnChanges { @Input() progress: JobProgressDTO; + @Input() lastRun: JobLastRunDTO; JobState = JobState; timeCurrentCopy: number; + JobLastRunState = JobLastRunState; private timerSub: Subscription; constructor() { diff --git a/src/frontend/app/ui/settings/photo/photo.settings.component.ts b/src/frontend/app/ui/settings/photo/photo.settings.component.ts index 8b97e349..9a29b045 100644 --- a/src/frontend/app/ui/settings/photo/photo.settings.component.ts +++ b/src/frontend/app/ui/settings/photo/photo.settings.component.ts @@ -11,7 +11,7 @@ import {ServerConfig} from '../../../../../common/config/private/IPrivateConfig' import {Utils} from '../../../../../common/Utils'; import {DefaultsJobs} from '../../../../../common/entities/job/JobDTO'; import {ErrorDTO} from '../../../../../common/entities/Error'; -import {JobState} from '../../../../../common/entities/settings/JobProgressDTO'; +import {JobState} from '../../../../../common/entities/job/JobProgressDTO'; @Component({ diff --git a/src/frontend/app/ui/settings/scheduled-jobs.service.ts b/src/frontend/app/ui/settings/scheduled-jobs.service.ts index 54739b49..317a40ca 100644 --- a/src/frontend/app/ui/settings/scheduled-jobs.service.ts +++ b/src/frontend/app/ui/settings/scheduled-jobs.service.ts @@ -1,19 +1,22 @@ import {EventEmitter, Injectable} from '@angular/core'; import {BehaviorSubject} from 'rxjs'; -import {JobProgressDTO} from '../../../../common/entities/settings/JobProgressDTO'; +import {JobProgressDTO} from '../../../../common/entities/job/JobProgressDTO'; import {NetworkService} from '../../model/network/network.service'; +import {JobLastRunDTO} from '../../../../common/entities/job/JobLastRunDTO'; @Injectable() export class ScheduledJobsService { public progress: BehaviorSubject<{ [key: string]: JobProgressDTO }>; + public lastRuns: BehaviorSubject<{ [key: string]: { [key: string]: JobLastRunDTO } }>; public onJobFinish: EventEmitter = new EventEmitter(); timer: number = null; private subscribers = 0; constructor(private _networkService: NetworkService) { this.progress = new BehaviorSubject({}); + this.lastRuns = new BehaviorSubject({}); } public calcTimeElapsed(progress: JobProgressDTO) { @@ -53,6 +56,7 @@ export class ScheduledJobsService { protected async getProgress(): Promise { const prevPrg = this.progress.value; this.progress.next(await this._networkService.getJson<{ [key: string]: JobProgressDTO }>('/admin/jobs/scheduled/progress')); + this.lastRuns.next(await this._networkService.getJson<{ [key: string]: { [key: string]: JobLastRunDTO } }>('/admin/jobs/scheduled/lastRun')); for (const prg in prevPrg) { if (!this.progress.value.hasOwnProperty(prg)) { this.onJobFinish.emit(prg); diff --git a/src/frontend/app/ui/settings/thumbnail/thumbnail.settings.component.ts b/src/frontend/app/ui/settings/thumbnail/thumbnail.settings.component.ts index e07d2386..fedd720d 100644 --- a/src/frontend/app/ui/settings/thumbnail/thumbnail.settings.component.ts +++ b/src/frontend/app/ui/settings/thumbnail/thumbnail.settings.component.ts @@ -10,7 +10,7 @@ import {ServerConfig} from '../../../../../common/config/private/IPrivateConfig' import {DefaultsJobs} from '../../../../../common/entities/job/JobDTO'; import {ErrorDTO} from '../../../../../common/entities/Error'; import {ScheduledJobsService} from '../scheduled-jobs.service'; -import {JobState} from '../../../../../common/entities/settings/JobProgressDTO'; +import {JobState} from '../../../../../common/entities/job/JobProgressDTO'; @Component({ selector: 'app-settings-thumbnail', diff --git a/src/frontend/app/ui/settings/video/video.settings.component.ts b/src/frontend/app/ui/settings/video/video.settings.component.ts index 4dced266..68f1aba8 100644 --- a/src/frontend/app/ui/settings/video/video.settings.component.ts +++ b/src/frontend/app/ui/settings/video/video.settings.component.ts @@ -10,7 +10,7 @@ import {ScheduledJobsService} from '../scheduled-jobs.service'; import {DefaultsJobs} from '../../../../../common/entities/job/JobDTO'; import {ErrorDTO} from '../../../../../common/entities/Error'; import {ServerConfig} from '../../../../../common/config/private/IPrivateConfig'; -import { JobState } from '../../../../../common/entities/settings/JobProgressDTO'; +import { JobState } from '../../../../../common/entities/job/JobProgressDTO'; @Component({