configurable cleanup

This commit is contained in:
mertalev
2025-10-09 16:38:21 -04:00
parent 883eb15ecb
commit ae2abb3cfe
14 changed files with 182 additions and 4 deletions

View File

@@ -133,6 +133,10 @@ export interface SystemConfig {
clusterNewFaces: boolean;
generateMemories: boolean;
syncQuotaUsage: boolean;
removeStaleUploads: {
enabled: boolean;
hoursAgo: number;
};
};
trash: {
enabled: boolean;
@@ -325,6 +329,10 @@ export const defaults = Object.freeze<SystemConfig>({
syncQuotaUsage: true,
missingThumbnails: true,
clusterNewFaces: true,
removeStaleUploads: {
enabled: true,
hoursAgo: 72,
},
},
trash: {
enabled: true,

View File

@@ -326,6 +326,17 @@ class SystemConfigNewVersionCheckDto {
enabled!: boolean;
}
class SystemConfigRemovePartialUploadsDto {
@ValidateBoolean()
enabled!: boolean;
@IsInt()
@Min(1)
@Type(() => Number)
@ApiProperty({ type: 'integer' })
hoursAgo!: number;
}
class SystemConfigNightlyTasksDto {
@IsDateStringFormat('HH:mm', { message: 'startTime must be in HH:mm format' })
startTime!: string;
@@ -344,6 +355,11 @@ class SystemConfigNightlyTasksDto {
@ValidateBoolean()
syncQuotaUsage!: boolean;
@Type(() => SystemConfigRemovePartialUploadsDto)
@ValidateNested()
@IsObject()
removeStaleUploads!: SystemConfigRemovePartialUploadsDto;
}
class SystemConfigOAuthDto {

View File

@@ -202,8 +202,8 @@ export class AssetUploadService extends BaseService {
@OnJob({ name: JobName.PartialAssetCleanupQueueAll, queue: QueueName.BackgroundTask })
async removeStaleUploads(): Promise<void> {
// TODO: make this configurable
const createdBefore = DateTime.now().minus({ days: 7 }).toJSDate();
const config = await this.getConfig({ withCache: false });
const createdBefore = DateTime.now().minus({ hours: config.nightlyTasks.removeStaleUploads.hoursAgo }).toJSDate();
let jobs: JobItem[] = [];
const assets = this.assetJobRepository.streamForPartialAssetCleanupJob(createdBefore);
for await (const asset of assets) {

View File

@@ -48,6 +48,7 @@ describe(JobService.name, () => {
{ name: JobName.UserSyncUsage },
{ name: JobName.AssetGenerateThumbnailsQueueAll, data: { force: false } },
{ name: JobName.FacialRecognitionQueueAll, data: { force: false, nightly: true } },
{ name: JobName.PartialAssetCleanupQueueAll },
]);
});
});

View File

@@ -302,6 +302,10 @@ export class JobService extends BaseService {
jobs.push({ name: JobName.FacialRecognitionQueueAll, data: { force: false, nightly: true } });
}
if (config.nightlyTasks.removeStaleUploads.enabled) {
jobs.push({ name: JobName.PartialAssetCleanupQueueAll });
}
await this.jobRepository.queueAll(jobs);
}

View File

@@ -115,6 +115,10 @@ const updatedConfig = Object.freeze<SystemConfig>({
missingThumbnails: true,
generateMemories: true,
syncQuotaUsage: true,
removeStaleUploads: {
enabled: true,
hoursAgo: 72,
},
},
reverseGeocoding: {
enabled: true,

View File

@@ -353,7 +353,7 @@ export type JobItem =
| { name: JobName.AssetDelete; data: IAssetDeleteJob }
| { name: JobName.AssetDeleteCheck; data?: IBaseJob }
| { name: JobName.PartialAssetCleanup; data: IEntityJob }
| { name: JobName.PartialAssetCleanupQueueAll; data: IBaseJob }
| { name: JobName.PartialAssetCleanupQueueAll; data?: IBaseJob }
// Library Management
| { name: JobName.LibrarySyncFiles; data: ILibraryFileJob }