1
0
mirror of https://github.com/bpatrik/pigallery2.git synced 2024-12-23 01:27:14 +02:00

Refactoring Job config and exposing it to messenger #753

This commit is contained in:
Patrik J. Braun 2023-11-18 14:43:22 +01:00
parent 9f5257626f
commit 7208a3b4fe
11 changed files with 47 additions and 28 deletions

View File

@ -1,10 +1,11 @@
import {ObjectManagers} from '../../ObjectManagers'; import {ObjectManagers} from '../../ObjectManagers';
import {ConfigTemplateEntry, DefaultsJobs,} from '../../../../common/entities/job/JobDTO'; import {DefaultsJobs} from '../../../../common/entities/job/JobDTO';
import {Job} from './Job'; import {Job} from './Job';
import {DynamicConfig} from '../../../../common/entities/DynamicConfig';
export class AlbumCoverFillingJob extends Job { export class AlbumCoverFillingJob extends Job {
public readonly Name = DefaultsJobs[DefaultsJobs['Album Cover Filling']]; public readonly Name = DefaultsJobs[DefaultsJobs['Album Cover Filling']];
public readonly ConfigTemplate: ConfigTemplateEntry[] = null; public readonly ConfigTemplate: DynamicConfig[] = null;
directoryToSetCover: { id: number; name: string; path: string }[] = null; directoryToSetCover: { id: number; name: string; path: string }[] = null;
status: 'Persons' | 'Albums' | 'Directory' = 'Persons'; status: 'Persons' | 'Albums' | 'Directory' = 'Persons';
@ -20,7 +21,7 @@ export class AlbumCoverFillingJob extends Job {
if (!this.directoryToSetCover) { if (!this.directoryToSetCover) {
this.Progress.log('Loading Directories to process'); this.Progress.log('Loading Directories to process');
this.directoryToSetCover = this.directoryToSetCover =
await ObjectManagers.getInstance().CoverManager.getPartialDirsWithoutCovers(); await ObjectManagers.getInstance().CoverManager.getPartialDirsWithoutCovers();
this.Progress.Left = this.directoryToSetCover.length + 2; this.Progress.Left = this.directoryToSetCover.length + 2;
return true; return true;
} }
@ -57,7 +58,7 @@ export class AlbumCoverFillingJob extends Job {
private async stepDirectoryCover(): Promise<boolean> { private async stepDirectoryCover(): Promise<boolean> {
if (this.directoryToSetCover.length === 0) { if (this.directoryToSetCover.length === 0) {
this.directoryToSetCover = this.directoryToSetCover =
await ObjectManagers.getInstance().CoverManager.getPartialDirsWithoutCovers(); await ObjectManagers.getInstance().CoverManager.getPartialDirsWithoutCovers();
// double check if there is really no more // double check if there is really no more
if (this.directoryToSetCover.length > 0) { if (this.directoryToSetCover.length > 0) {
return true; // continue return true; // continue
@ -70,7 +71,7 @@ export class AlbumCoverFillingJob extends Job {
this.Progress.Left = this.directoryToSetCover.length; this.Progress.Left = this.directoryToSetCover.length;
await ObjectManagers.getInstance().CoverManager.setAndGetCoverForDirectory( await ObjectManagers.getInstance().CoverManager.setAndGetCoverForDirectory(
directory directory
); );
this.Progress.Processed++; this.Progress.Processed++;
return true; return true;

View File

@ -1,10 +1,11 @@
import {ObjectManagers} from '../../ObjectManagers'; import {ObjectManagers} from '../../ObjectManagers';
import {ConfigTemplateEntry, DefaultsJobs,} from '../../../../common/entities/job/JobDTO'; import {DefaultsJobs} from '../../../../common/entities/job/JobDTO';
import {Job} from './Job'; import {Job} from './Job';
import {DynamicConfig} from '../../../../common/entities/DynamicConfig';
export class AlbumCoverRestJob extends Job { export class AlbumCoverRestJob extends Job {
public readonly Name = DefaultsJobs[DefaultsJobs['Album Cover Reset']]; public readonly Name = DefaultsJobs[DefaultsJobs['Album Cover Reset']];
public readonly ConfigTemplate: ConfigTemplateEntry[] = null; public readonly ConfigTemplate: DynamicConfig[] = null;
protected readonly IsInstant = true; protected readonly IsInstant = true;
public get Supported(): boolean { public get Supported(): boolean {

View File

@ -1,10 +1,11 @@
import {ObjectManagers} from '../../ObjectManagers'; import {ObjectManagers} from '../../ObjectManagers';
import {ConfigTemplateEntry, DefaultsJobs,} from '../../../../common/entities/job/JobDTO'; import {DefaultsJobs,} from '../../../../common/entities/job/JobDTO';
import {Job} from './Job'; import {Job} from './Job';
import {DynamicConfig} from '../../../../common/entities/DynamicConfig';
export class AlbumRestJob extends Job { export class AlbumRestJob extends Job {
public readonly Name = DefaultsJobs[DefaultsJobs['Album Reset']]; public readonly Name = DefaultsJobs[DefaultsJobs['Album Reset']];
public readonly ConfigTemplate: ConfigTemplateEntry[] = null; public readonly ConfigTemplate: DynamicConfig[] = null;
protected readonly IsInstant = true; protected readonly IsInstant = true;
public get Supported(): boolean { public get Supported(): boolean {

View File

@ -1,4 +1,3 @@
import {ConfigTemplateEntry} from '../../../../common/entities/job/JobDTO';
import {Job} from './Job'; import {Job} from './Job';
import * as path from 'path'; import * as path from 'path';
import {Logger} from '../../../Logger'; import {Logger} from '../../../Logger';
@ -13,6 +12,7 @@ import {ProjectPath} from '../../../ProjectPath';
import {FileEntity} from '../../database/enitites/FileEntity'; import {FileEntity} from '../../database/enitites/FileEntity';
import {DirectoryBaseDTO, DirectoryDTOUtils} from '../../../../common/entities/DirectoryDTO'; import {DirectoryBaseDTO, DirectoryDTOUtils} from '../../../../common/entities/DirectoryDTO';
import {DirectoryScanSettings, DiskManager} from '../../fileaccess/DiskManager'; import {DirectoryScanSettings, DiskManager} from '../../fileaccess/DiskManager';
import {DynamicConfig} from '../../../../common/entities/DynamicConfig';
const LOG_TAG = '[FileJob]'; const LOG_TAG = '[FileJob]';
@ -20,7 +20,7 @@ const LOG_TAG = '[FileJob]';
* Abstract class for thumbnail creation, file deleting etc. * Abstract class for thumbnail creation, file deleting etc.
*/ */
export abstract class FileJob<S extends { indexedOnly?: boolean } = { indexedOnly?: boolean }> extends Job<S> { export abstract class FileJob<S extends { indexedOnly?: boolean } = { indexedOnly?: boolean }> extends Job<S> {
public readonly ConfigTemplate: ConfigTemplateEntry[] = []; public readonly ConfigTemplate: DynamicConfig[] = [];
directoryQueue: string[] = []; directoryQueue: string[] = [];
fileQueue: string[] = []; fileQueue: string[] = [];
DBProcessing = { DBProcessing = {

View File

@ -1,10 +1,11 @@
import {ObjectManagers} from '../../ObjectManagers'; import {ObjectManagers} from '../../ObjectManagers';
import {ConfigTemplateEntry, DefaultsJobs,} from '../../../../common/entities/job/JobDTO'; import {DefaultsJobs} from '../../../../common/entities/job/JobDTO';
import {Job} from './Job'; import {Job} from './Job';
import {DynamicConfig} from '../../../../common/entities/DynamicConfig';
export class GalleryRestJob extends Job { export class GalleryRestJob extends Job {
public readonly Name = DefaultsJobs[DefaultsJobs['Gallery Reset']]; public readonly Name = DefaultsJobs[DefaultsJobs['Gallery Reset']];
public readonly ConfigTemplate: ConfigTemplateEntry[] = null; public readonly ConfigTemplate: DynamicConfig[] = null;
protected readonly IsInstant = true; protected readonly IsInstant = true;
public get Supported(): boolean { public get Supported(): boolean {

View File

@ -2,7 +2,7 @@ import {ObjectManagers} from '../../ObjectManagers';
import * as path from 'path'; import * as path from 'path';
import * as fs from 'fs'; import * as fs from 'fs';
import {Job} from './Job'; import {Job} from './Job';
import {ConfigTemplateEntry, DefaultsJobs,} from '../../../../common/entities/job/JobDTO'; import {DefaultsJobs} from '../../../../common/entities/job/JobDTO';
import {JobProgressStates} from '../../../../common/entities/job/JobProgressDTO'; import {JobProgressStates} from '../../../../common/entities/job/JobProgressDTO';
import {ProjectPath} from '../../../ProjectPath'; import {ProjectPath} from '../../../ProjectPath';
import {backendTexts} from '../../../../common/BackendTexts'; import {backendTexts} from '../../../../common/BackendTexts';
@ -10,6 +10,7 @@ import {ParentDirectoryDTO} from '../../../../common/entities/DirectoryDTO';
import {Logger} from '../../../Logger'; import {Logger} from '../../../Logger';
import {FileDTO} from '../../../../common/entities/FileDTO'; import {FileDTO} from '../../../../common/entities/FileDTO';
import {DiskManager} from '../../fileaccess/DiskManager'; import {DiskManager} from '../../fileaccess/DiskManager';
import {DynamicConfig} from '../../../../common/entities/DynamicConfig';
const LOG_TAG = '[IndexingJob]'; const LOG_TAG = '[IndexingJob]';
@ -18,7 +19,7 @@ export class IndexingJob<
> extends Job<S> { > extends Job<S> {
public readonly Name = DefaultsJobs[DefaultsJobs.Indexing]; public readonly Name = DefaultsJobs[DefaultsJobs.Indexing];
directoriesToIndex: string[] = []; directoriesToIndex: string[] = [];
public readonly ConfigTemplate: ConfigTemplateEntry[] = [ public readonly ConfigTemplate: DynamicConfig[] = [
{ {
id: 'indexChangesOnly', id: 'indexChangesOnly',
type: 'boolean', type: 'boolean',

View File

@ -1,9 +1,10 @@
import {Logger} from '../../../Logger'; import {Logger} from '../../../Logger';
import {IJob} from './IJob'; import {IJob} from './IJob';
import {ConfigTemplateEntry, JobDTO, JobDTOUtils,} from '../../../../common/entities/job/JobDTO'; import {JobDTO, JobDTOUtils} from '../../../../common/entities/job/JobDTO';
import {JobProgress} from './JobProgress'; import {JobProgress} from './JobProgress';
import {IJobListener} from './IJobListener'; import {IJobListener} from './IJobListener';
import {JobProgressStates} from '../../../../common/entities/job/JobProgressDTO'; import {JobProgressStates} from '../../../../common/entities/job/JobProgressDTO';
import {DynamicConfig} from '../../../../common/entities/DynamicConfig';
declare const process: { nextTick: (_: unknown) => void }; declare const process: { nextTick: (_: unknown) => void };
declare const global: { gc: () => void }; declare const global: { gc: () => void };
@ -27,7 +28,7 @@ export abstract class Job<T extends Record<string, unknown> = Record<string, unk
public abstract get Name(): string; public abstract get Name(): string;
public abstract get ConfigTemplate(): ConfigTemplateEntry[]; public abstract get ConfigTemplate(): DynamicConfig[];
public get Progress(): JobProgress { public get Progress(): JobProgress {
return this.progress; return this.progress;

View File

@ -1,4 +1,4 @@
import {ConfigTemplateEntry, DefaultsJobs,} from '../../../../common/entities/job/JobDTO'; import {DefaultsJobs} from '../../../../common/entities/job/JobDTO';
import * as path from 'path'; import * as path from 'path';
import * as fs from 'fs'; import * as fs from 'fs';
import {Job} from './Job'; import {Job} from './Job';
@ -6,10 +6,11 @@ import {ProjectPath} from '../../../ProjectPath';
import {GPXProcessing} from '../../fileaccess/fileprocessing/GPXProcessing'; import {GPXProcessing} from '../../fileaccess/fileprocessing/GPXProcessing';
import {PhotoProcessing} from '../../fileaccess/fileprocessing/PhotoProcessing'; import {PhotoProcessing} from '../../fileaccess/fileprocessing/PhotoProcessing';
import {VideoProcessing} from '../../fileaccess/fileprocessing/VideoProcessing'; import {VideoProcessing} from '../../fileaccess/fileprocessing/VideoProcessing';
import { DynamicConfig } from '../../../../common/entities/DynamicConfig';
export class TempFolderCleaningJob extends Job { export class TempFolderCleaningJob extends Job {
public readonly Name = DefaultsJobs[DefaultsJobs['Temp Folder Cleaning']]; public readonly Name = DefaultsJobs[DefaultsJobs['Temp Folder Cleaning']];
public readonly ConfigTemplate: ConfigTemplateEntry[] = null; public readonly ConfigTemplate: DynamicConfig[] = null;
public readonly Supported: boolean = true; public readonly Supported: boolean = true;
directoryQueue: string[] = []; directoryQueue: string[] = [];
private tempRootCleaned = false; private tempRootCleaned = false;

View File

@ -8,6 +8,7 @@ import {PhotoEntity} from '../../database/enitites/PhotoEntity';
import {EmailMediaMessenger} from '../../mediamessengers/EmailMediaMessenger'; import {EmailMediaMessenger} from '../../mediamessengers/EmailMediaMessenger';
import {MediaPickDTO} from '../../../../common/entities/MediaPickDTO'; import {MediaPickDTO} from '../../../../common/entities/MediaPickDTO';
import {MediaDTOUtils} from '../../../../common/entities/MediaDTO'; import {MediaDTOUtils} from '../../../../common/entities/MediaDTO';
import {DynamicConfig} from '../../../../common/entities/DynamicConfig';
export class TopPickSendJob extends Job<{ export class TopPickSendJob extends Job<{
@ -19,7 +20,7 @@ export class TopPickSendJob extends Job<{
}> { }> {
public readonly Name = DefaultsJobs[DefaultsJobs['Top Pick Sending']]; public readonly Name = DefaultsJobs[DefaultsJobs['Top Pick Sending']];
public readonly Supported: boolean = true; public readonly Supported: boolean = true;
public readonly ConfigTemplate: ConfigTemplateEntry[] = [ public readonly ConfigTemplate: DynamicConfig[] = [
{ {
id: 'mediaPick', id: 'mediaPick',
type: 'MediaPickDTO-array', type: 'MediaPickDTO-array',

View File

@ -0,0 +1,17 @@
import {backendText} from '../BackendTexts';
import {fieldType} from './job/JobDTO';
/**
* Dynamic configs are not part of the typeconfig maintained config.
* Pigallery uses them to dynamically define configuration
* on the serverside so the client can parse and render it.
* It is mostly used for configuring jobs
*/
export interface DynamicConfig {
id: string;
// Use a predefined and localized backend text id or explicitly define the text
name: backendText | string;
description: backendText | string;
type: fieldType;
defaultValue: unknown;
}

View File

@ -1,4 +1,5 @@
import {backendText} from '../../BackendTexts'; import {backendText} from '../../BackendTexts';
import {DynamicConfig} from '../DynamicConfig';
export type fieldType = 'string' | 'string-array' | 'number' | 'boolean' | 'number-array' | 'MediaPickDTO-array'; export type fieldType = 'string' | 'string-array' | 'number' | 'boolean' | 'number-array' | 'MediaPickDTO-array';
@ -17,17 +18,10 @@ export enum DefaultsJobs {
'Top Pick Sending' = 12 'Top Pick Sending' = 12
} }
export interface ConfigTemplateEntry {
id: string;
name: backendText;
description: backendText;
type: fieldType;
defaultValue: any;
}
export interface JobDTO { export interface JobDTO {
Name: string; Name: string;
ConfigTemplate: ConfigTemplateEntry[]; ConfigTemplate: DynamicConfig[];
} }
export const JobDTOUtils = { export const JobDTOUtils = {