refactor(server): simplify config init process (#5702)

This commit is contained in:
Jason Rasmussen
2024-01-01 13:16:44 -05:00
committed by GitHub
parent 5f6d09d3da
commit 03eb5ffc5c
8 changed files with 35 additions and 35 deletions
@@ -27,6 +27,7 @@ import {
} from '@test';
import { when } from 'jest-when';
import { Stats } from 'node:fs';
import { SystemConfigCore } from '../system-config';
describe(StorageTemplateService.name, () => {
let sut: StorageTemplateService;
@@ -38,7 +39,7 @@ describe(StorageTemplateService.name, () => {
let storageMock: jest.Mocked<IStorageRepository>;
let userMock: jest.Mocked<IUserRepository>;
let cryptoMock: jest.Mocked<ICryptoRepository>;
let databaseRepository: jest.Mocked<IDatabaseRepository>;
let databaseMock: jest.Mocked<IDatabaseRepository>;
it('should work', () => {
expect(sut).toBeDefined();
@@ -53,22 +54,23 @@ describe(StorageTemplateService.name, () => {
storageMock = newStorageRepositoryMock();
userMock = newUserRepositoryMock();
cryptoMock = newCryptoRepositoryMock();
databaseRepository = newDatabaseRepositoryMock();
databaseMock = newDatabaseRepositoryMock();
configMock.load.mockResolvedValue([{ key: SystemConfigKey.STORAGE_TEMPLATE_ENABLED, value: true }]);
sut = new StorageTemplateService(
albumMock,
assetMock,
configMock,
defaults,
moveMock,
personMock,
storageMock,
userMock,
cryptoMock,
databaseRepository,
databaseMock,
);
configMock.load.mockResolvedValue([{ key: SystemConfigKey.STORAGE_TEMPLATE_ENABLED, value: true }]);
SystemConfigCore.create(configMock).config$.next(defaults);
});
describe('handleMigrationSingle', () => {
@@ -21,7 +21,6 @@ import {
} from '../repositories';
import { StorageCore, StorageFolder } from '../storage';
import {
INITIAL_SYSTEM_CONFIG,
supportedDayTokens,
supportedHourTokens,
supportedMinuteTokens,
@@ -49,32 +48,33 @@ export class StorageTemplateService {
private logger = new ImmichLogger(StorageTemplateService.name);
private configCore: SystemConfigCore;
private storageCore: StorageCore;
private template: {
private _template: {
compiled: HandlebarsTemplateDelegate<any>;
raw: string;
needsAlbum: boolean;
};
} | null = null;
private get template() {
if (!this._template) {
throw new Error('Template not initialized');
}
return this._template;
}
constructor(
@Inject(IAlbumRepository) private albumRepository: IAlbumRepository,
@Inject(IAssetRepository) private assetRepository: IAssetRepository,
@Inject(ISystemConfigRepository) configRepository: ISystemConfigRepository,
@Inject(INITIAL_SYSTEM_CONFIG) config: SystemConfig,
@Inject(IMoveRepository) moveRepository: IMoveRepository,
@Inject(IPersonRepository) personRepository: IPersonRepository,
@Inject(IStorageRepository) private storageRepository: IStorageRepository,
@Inject(IUserRepository) private userRepository: IUserRepository,
@Inject(ICryptoRepository) private cryptoRepository: ICryptoRepository,
@Inject(ICryptoRepository) cryptoRepository: ICryptoRepository,
@Inject(IDatabaseRepository) private databaseRepository: IDatabaseRepository,
) {
this.template = this.compile(config.storageTemplate.template);
this.configCore = SystemConfigCore.create(configRepository);
this.configCore.addValidator((config) => this.validate(config));
this.configCore.config$.subscribe((config) => {
const template = config.storageTemplate.template;
this.logger.debug(`Received config, compiling storage template: ${template}`);
this.template = this.compile(template);
});
this.configCore.config$.subscribe((config) => this.onConfig(config));
this.storageCore = StorageCore.create(
assetRepository,
moveRepository,
@@ -270,6 +270,14 @@ export class StorageTemplateService {
}
}
private onConfig(config: SystemConfig) {
const template = config.storageTemplate.template;
if (!this._template || template !== this.template.raw) {
this.logger.debug(`Compiling new storage template: ${template}`);
this._template = this.compile(template);
}
}
private compile(template: string) {
return {
raw: template,