diff --git a/server/eslint.config.mjs b/server/eslint.config.mjs index bdbac34da6..c86bc3d72f 100644 --- a/server/eslint.config.mjs +++ b/server/eslint.config.mjs @@ -51,6 +51,7 @@ export default typescriptEslint.config([ 'unicorn/no-array-sort': 'off', '@typescript-eslint/await-thenable': 'error', '@typescript-eslint/no-misused-promises': 'error', + '@typescript-eslint/switch-exhaustiveness-check': ['error', { considerDefaultExhaustiveForUnions: true }], 'require-await': 'off', '@typescript-eslint/require-await': 'error', curly: 2, diff --git a/server/src/commands/schema-check.ts b/server/src/commands/schema-check.ts index e0ccae8469..fc38254dde 100644 --- a/server/src/commands/schema-check.ts +++ b/server/src/commands/schema-check.ts @@ -28,9 +28,13 @@ export class SchemaCheck extends CommandRunner { } case 'missing': { - console.log(` - ${migration.name} exists, but has not been applied to the database`); + console.log(` - ${migration.name} exists on disk, but has not been applied to the database`); break; } + + case 'applied': { + break; // happy path, do nothing + } } } } diff --git a/server/src/cores/storage.core.ts b/server/src/cores/storage.core.ts index 8802145020..6c7d6f0e3e 100644 --- a/server/src/cores/storage.core.ts +++ b/server/src/cores/storage.core.ts @@ -9,6 +9,7 @@ import { PersonPathType, RawExtractedFormat, StorageFolder, + UserPathType, } from 'src/enum'; import { AssetRepository } from 'src/repositories/asset.repository'; import { ConfigRepository } from 'src/repositories/config.repository'; @@ -327,13 +328,19 @@ export class StorageCore { case AssetFileType.EncodedVideo: case AssetFileType.Thumbnail: case AssetFileType.Preview: - case AssetFileType.Sidecar: { + case AssetFileType.Sidecar: + case AssetPathType.EncodedVideo: { return this.assetRepository.upsertFile({ assetId: id, type: pathType as AssetFileType, path: newPath }); } case PersonPathType.Face: { return this.personRepository.update({ id, thumbnailPath: newPath }); } + + case UserPathType.Profile: { + this.logger.warn('Unexpected path type:', pathType); + return; + } } } diff --git a/server/src/maintenance/maintenance-worker.service.ts b/server/src/maintenance/maintenance-worker.service.ts index 61958a0d8a..f2c9086e87 100644 --- a/server/src/maintenance/maintenance-worker.service.ts +++ b/server/src/maintenance/maintenance-worker.service.ts @@ -281,17 +281,20 @@ export class MaintenanceWorkerService { async runAction(action: SetMaintenanceModeDto) { switch (action.action) { - case MaintenanceAction.Start: { + case MaintenanceAction.Start: + case MaintenanceAction.SelectDatabaseRestore: { return; } case MaintenanceAction.End: { return this.endMaintenance(); } - case MaintenanceAction.SelectDatabaseRestore: { - return; + case MaintenanceAction.RestoreDatabase: { + return this.runRestoreDatabase(action); } } + } + async runRestoreDatabase(action: SetMaintenanceModeDto) { const lock = await this.databaseRepository.tryLock(DatabaseLock.MaintenanceOperation); if (!lock) { return; diff --git a/server/src/repositories/config.repository.ts b/server/src/repositories/config.repository.ts index f88deca09d..909d6d62dd 100644 --- a/server/src/repositories/config.repository.ts +++ b/server/src/repositories/config.repository.ts @@ -243,14 +243,16 @@ const getEnv = (): EnvData => { }; let vectorExtension: VectorExtension | undefined; - switch (dto.DB_VECTOR_EXTENSION) { - case 'pgvector': { - vectorExtension = DatabaseExtension.Vector; - break; - } - case 'vectorchord': { - vectorExtension = DatabaseExtension.VectorChord; - break; + if (dto.DB_VECTOR_EXTENSION) { + switch (dto.DB_VECTOR_EXTENSION) { + case 'pgvector': { + vectorExtension = DatabaseExtension.Vector; + break; + } + case 'vectorchord': { + vectorExtension = DatabaseExtension.VectorChord; + break; + } } } diff --git a/server/src/repositories/media.repository.ts b/server/src/repositories/media.repository.ts index c2ec95636a..5f8449e692 100644 --- a/server/src/repositories/media.repository.ts +++ b/server/src/repositories/media.repository.ts @@ -478,8 +478,10 @@ export class MediaRepository { case 'av1': { return this.parseEnum(Av1Profile, profile); } + default: { + return null; + } } - return null; } private compareStreams(a: FfprobeStream, b: FfprobeStream): number { diff --git a/server/src/services/database-backup.service.ts b/server/src/services/database-backup.service.ts index 6afc46c7da..55d69d37b7 100644 --- a/server/src/services/database-backup.service.ts +++ b/server/src/services/database-backup.service.ts @@ -163,6 +163,9 @@ export class DatabaseBackupService { ); switch (bin) { + case 'pg_dump': { + break; + } case 'pg_dumpall': { args.push('--database'); break; diff --git a/server/src/services/job.service.ts b/server/src/services/job.service.ts index 00105103e8..6d4f04df37 100644 --- a/server/src/services/job.service.ts +++ b/server/src/services/job.service.ts @@ -257,6 +257,8 @@ export class JobService extends BaseService { } break; } + + // no default } } } diff --git a/server/src/services/library.service.ts b/server/src/services/library.service.ts index 085650be6f..7e84a8ec52 100644 --- a/server/src/services/library.service.ts +++ b/server/src/services/library.service.ts @@ -498,6 +498,9 @@ export class LibraryService extends BaseService { const stat = stats[i]; const action = this.checkExistingAsset(asset, stat); switch (action) { + case AssetSyncResult.DO_NOTHING: { + break; + } case AssetSyncResult.OFFLINE: { if (asset.status === AssetStatus.Trashed) { trashedAssetIdsToOffline.push(asset.id); diff --git a/server/src/services/metadata.service.ts b/server/src/services/metadata.service.ts index dfa254b78a..a4639db262 100644 --- a/server/src/services/metadata.service.ts +++ b/server/src/services/metadata.service.ts @@ -1138,7 +1138,9 @@ export class MetadataService extends BaseService { case 3: { return ExifOrientation.Rotate90CW; } + default: { + return null; + } } - return null; } }