refactor: repositories (#16036)

This commit is contained in:
Jason Rasmussen
2025-02-11 14:08:13 -05:00
committed by GitHub
parent d2575d8f00
commit 9d85272c2b
90 changed files with 686 additions and 1088 deletions

View File

@@ -1,7 +1,8 @@
import { IAlbumRepository } from 'src/interfaces/album.interface';
import { AlbumRepository } from 'src/repositories/album.repository';
import { RepositoryInterface } from 'src/types';
import { Mocked, vitest } from 'vitest';
export const newAlbumRepositoryMock = (): Mocked<IAlbumRepository> => {
export const newAlbumRepositoryMock = (): Mocked<RepositoryInterface<AlbumRepository>> => {
return {
getById: vitest.fn(),
getByAssetId: vitest.fn(),

View File

@@ -1,7 +1,8 @@
import { IAssetRepository } from 'src/interfaces/asset.interface';
import { AssetRepository } from 'src/repositories/asset.repository';
import { RepositoryInterface } from 'src/types';
import { Mocked, vitest } from 'vitest';
export const newAssetRepositoryMock = (): Mocked<IAssetRepository> => {
export const newAssetRepositoryMock = (): Mocked<RepositoryInterface<AssetRepository>> => {
return {
create: vitest.fn(),
upsertExif: vitest.fn(),

View File

@@ -1,5 +1,4 @@
import { ImmichEnvironment, ImmichWorker } from 'src/enum';
import { DatabaseExtension } from 'src/interfaces/database.interface';
import { DatabaseExtension, ImmichEnvironment, ImmichWorker } from 'src/enum';
import { ConfigRepository, EnvData } from 'src/repositories/config.repository';
import { RepositoryInterface } from 'src/types';
import { Mocked, vitest } from 'vitest';

View File

@@ -1,7 +1,8 @@
import { ICryptoRepository } from 'src/interfaces/crypto.interface';
import { CryptoRepository } from 'src/repositories/crypto.repository';
import { RepositoryInterface } from 'src/types';
import { Mocked, vitest } from 'vitest';
export const newCryptoRepositoryMock = (): Mocked<ICryptoRepository> => {
export const newCryptoRepositoryMock = (): Mocked<RepositoryInterface<CryptoRepository>> => {
return {
randomUUID: vitest.fn().mockReturnValue('random-uuid'),
randomBytes: vitest.fn().mockReturnValue(Buffer.from('random-bytes', 'utf8')),

View File

@@ -1,7 +1,8 @@
import { IDatabaseRepository } from 'src/interfaces/database.interface';
import { DatabaseRepository } from 'src/repositories/database.repository';
import { RepositoryInterface } from 'src/types';
import { Mocked, vitest } from 'vitest';
export const newDatabaseRepositoryMock = (): Mocked<IDatabaseRepository> => {
export const newDatabaseRepositoryMock = (): Mocked<RepositoryInterface<DatabaseRepository>> => {
return {
init: vitest.fn(),
shutdown: vitest.fn(),

View File

@@ -1,7 +1,8 @@
import { ILibraryRepository } from 'src/interfaces/library.interface';
import { LibraryRepository } from 'src/repositories/library.repository';
import { RepositoryInterface } from 'src/types';
import { Mocked, vitest } from 'vitest';
export const newLibraryRepositoryMock = (): Mocked<ILibraryRepository> => {
export const newLibraryRepositoryMock = (): Mocked<RepositoryInterface<LibraryRepository>> => {
return {
get: vitest.fn(),
create: vitest.fn(),

View File

@@ -1,7 +1,8 @@
import { IMoveRepository } from 'src/interfaces/move.interface';
import { MoveRepository } from 'src/repositories/move.repository';
import { RepositoryInterface } from 'src/types';
import { Mocked, vitest } from 'vitest';
export const newMoveRepositoryMock = (): Mocked<IMoveRepository> => {
export const newMoveRepositoryMock = (): Mocked<RepositoryInterface<MoveRepository>> => {
return {
create: vitest.fn(),
getByEntity: vitest.fn(),

View File

@@ -1,7 +1,8 @@
import { IPartnerRepository } from 'src/interfaces/partner.interface';
import { PartnerRepository } from 'src/repositories/partner.repository';
import { RepositoryInterface } from 'src/types';
import { Mocked, vitest } from 'vitest';
export const newPartnerRepositoryMock = (): Mocked<IPartnerRepository> => {
export const newPartnerRepositoryMock = (): Mocked<RepositoryInterface<PartnerRepository>> => {
return {
create: vitest.fn(),
remove: vitest.fn(),

View File

@@ -1,7 +1,8 @@
import { IPersonRepository } from 'src/interfaces/person.interface';
import { PersonRepository } from 'src/repositories/person.repository';
import { RepositoryInterface } from 'src/types';
import { Mocked, vitest } from 'vitest';
export const newPersonRepositoryMock = (): Mocked<IPersonRepository> => {
export const newPersonRepositoryMock = (): Mocked<RepositoryInterface<PersonRepository>> => {
return {
getById: vitest.fn(),
getAll: vitest.fn(),

View File

@@ -1,7 +1,8 @@
import { ISearchRepository } from 'src/interfaces/search.interface';
import { SearchRepository } from 'src/repositories/search.repository';
import { RepositoryInterface } from 'src/types';
import { Mocked, vitest } from 'vitest';
export const newSearchRepositoryMock = (): Mocked<ISearchRepository> => {
export const newSearchRepositoryMock = (): Mocked<RepositoryInterface<SearchRepository>> => {
return {
searchMetadata: vitest.fn(),
searchSmart: vitest.fn(),

View File

@@ -1,7 +1,8 @@
import { ISharedLinkRepository } from 'src/interfaces/shared-link.interface';
import { SharedLinkRepository } from 'src/repositories/shared-link.repository';
import { RepositoryInterface } from 'src/types';
import { Mocked, vitest } from 'vitest';
export const newSharedLinkRepositoryMock = (): Mocked<ISharedLinkRepository> => {
export const newSharedLinkRepositoryMock = (): Mocked<RepositoryInterface<SharedLinkRepository>> => {
return {
getAll: vitest.fn(),
get: vitest.fn(),

View File

@@ -1,7 +1,8 @@
import { IStackRepository } from 'src/interfaces/stack.interface';
import { StackRepository } from 'src/repositories/stack.repository';
import { RepositoryInterface } from 'src/types';
import { Mocked, vitest } from 'vitest';
export const newStackRepositoryMock = (): Mocked<IStackRepository> => {
export const newStackRepositoryMock = (): Mocked<RepositoryInterface<StackRepository>> => {
return {
search: vitest.fn(),
create: vitest.fn(),

View File

@@ -1,6 +1,7 @@
import { WatchOptions } from 'chokidar';
import { StorageCore } from 'src/cores/storage.core';
import { IStorageRepository, WatchEvents } from 'src/interfaces/storage.interface';
import { StorageRepository, WatchEvents } from 'src/repositories/storage.repository';
import { RepositoryInterface } from 'src/types';
import { Mocked, vitest } from 'vitest';
interface MockWatcherOptions {
@@ -39,7 +40,7 @@ export const makeMockWatcher =
return () => Promise.resolve();
};
export const newStorageRepositoryMock = (reset = true): Mocked<IStorageRepository> => {
export const newStorageRepositoryMock = (reset = true): Mocked<RepositoryInterface<StorageRepository>> => {
if (reset) {
StorageCore.reset();
}

View File

@@ -1,7 +1,8 @@
import { ITagRepository } from 'src/interfaces/tag.interface';
import { TagRepository } from 'src/repositories/tag.repository';
import { RepositoryInterface } from 'src/types';
import { Mocked, vitest } from 'vitest';
export const newTagRepositoryMock = (): Mocked<ITagRepository> => {
export const newTagRepositoryMock = (): Mocked<RepositoryInterface<TagRepository>> => {
return {
getAll: vitest.fn(),
getByValue: vitest.fn(),

View File

@@ -1,7 +1,8 @@
import { IUserRepository } from 'src/interfaces/user.interface';
import { UserRepository } from 'src/repositories/user.repository';
import { RepositoryInterface } from 'src/types';
import { Mocked, vitest } from 'vitest';
export const newUserRepositoryMock = (): Mocked<IUserRepository> => {
export const newUserRepositoryMock = (): Mocked<RepositoryInterface<UserRepository>> => {
return {
get: vitest.fn(),
getAdmin: vitest.fn(),

View File

@@ -2,16 +2,14 @@ import { ChildProcessWithoutNullStreams } from 'node:child_process';
import { Writable } from 'node:stream';
import { PNG } from 'pngjs';
import { ImmichWorker } from 'src/enum';
import { IAlbumRepository } from 'src/interfaces/album.interface';
import { IAssetRepository } from 'src/interfaces/asset.interface';
import { ICryptoRepository } from 'src/interfaces/crypto.interface';
import { IEventRepository } from 'src/interfaces/event.interface';
import { IMachineLearningRepository } from 'src/interfaces/machine-learning.interface';
import { IUserRepository } from 'src/interfaces/user.interface';
import { AccessRepository } from 'src/repositories/access.repository';
import { ActivityRepository } from 'src/repositories/activity.repository';
import { AlbumUserRepository } from 'src/repositories/album-user.repository';
import { AlbumRepository } from 'src/repositories/album.repository';
import { ApiKeyRepository } from 'src/repositories/api-key.repository';
import { AssetRepository } from 'src/repositories/asset.repository';
import { AuditRepository } from 'src/repositories/audit.repository';
import { ConfigRepository } from 'src/repositories/config.repository';
import { CronRepository } from 'src/repositories/cron.repository';
@@ -40,6 +38,7 @@ import { SystemMetadataRepository } from 'src/repositories/system-metadata.repos
import { TagRepository } from 'src/repositories/tag.repository';
import { TelemetryRepository } from 'src/repositories/telemetry.repository';
import { TrashRepository } from 'src/repositories/trash.repository';
import { UserRepository } from 'src/repositories/user.repository';
import { VersionHistoryRepository } from 'src/repositories/version-history.repository';
import { ViewRepository } from 'src/repositories/view-repository';
import { BaseService } from 'src/services/base.service';
@@ -100,14 +99,14 @@ type IAccessRepository = { [K in keyof AccessRepository]: RepositoryInterface<Ac
export type ServiceMocks = {
access: IAccessRepositoryMock;
activity: Mocked<RepositoryInterface<ActivityRepository>>;
album: Mocked<IAlbumRepository>;
album: Mocked<RepositoryInterface<AlbumRepository>>;
albumUser: Mocked<RepositoryInterface<AlbumUserRepository>>;
apiKey: Mocked<RepositoryInterface<ApiKeyRepository>>;
audit: Mocked<RepositoryInterface<AuditRepository>>;
asset: Mocked<IAssetRepository>;
asset: Mocked<RepositoryInterface<AssetRepository>>;
config: Mocked<RepositoryInterface<ConfigRepository>>;
cron: Mocked<RepositoryInterface<CronRepository>>;
crypto: Mocked<ICryptoRepository>;
crypto: Mocked<RepositoryInterface<CryptoRepository>>;
database: Mocked<RepositoryInterface<DatabaseRepository>>;
event: Mocked<IEventRepository>;
job: Mocked<RepositoryInterface<JobRepository>>;
@@ -134,7 +133,7 @@ export type ServiceMocks = {
tag: Mocked<RepositoryInterface<TagRepository>>;
telemetry: ITelemetryRepositoryMock;
trash: Mocked<RepositoryInterface<TrashRepository>>;
user: Mocked<IUserRepository>;
user: Mocked<RepositoryInterface<UserRepository>>;
versionHistory: Mocked<RepositoryInterface<VersionHistoryRepository>>;
view: Mocked<RepositoryInterface<ViewRepository>>;
};
@@ -192,39 +191,39 @@ export const newTestService = <T extends BaseService>(
accessMock as IAccessRepository as AccessRepository,
activityMock as RepositoryInterface<ActivityRepository> as ActivityRepository,
auditMock as RepositoryInterface<AuditRepository> as AuditRepository,
albumMock,
albumMock as RepositoryInterface<AlbumRepository> as AlbumRepository,
albumUserMock as RepositoryInterface<AlbumUserRepository> as AlbumUserRepository,
assetMock,
assetMock as RepositoryInterface<AssetRepository> as AssetRepository,
configMock,
cronMock as RepositoryInterface<CronRepository> as CronRepository,
cryptoMock as RepositoryInterface<CryptoRepository> as CryptoRepository,
databaseMock,
databaseMock as RepositoryInterface<DatabaseRepository> as DatabaseRepository,
eventMock,
jobMock,
apiKeyMock as RepositoryInterface<ApiKeyRepository> as ApiKeyRepository,
libraryMock,
libraryMock as RepositoryInterface<LibraryRepository> as LibraryRepository,
machineLearningMock,
mapMock as RepositoryInterface<MapRepository> as MapRepository,
mediaMock as RepositoryInterface<MediaRepository> as MediaRepository,
memoryMock as RepositoryInterface<MemoryRepository> as MemoryRepository,
metadataMock as RepositoryInterface<MetadataRepository> as MetadataRepository,
moveMock,
moveMock as RepositoryInterface<MoveRepository> as MoveRepository,
notificationMock as RepositoryInterface<NotificationRepository> as NotificationRepository,
oauthMock as RepositoryInterface<OAuthRepository> as OAuthRepository,
partnerMock,
personMock,
partnerMock as RepositoryInterface<PartnerRepository> as PartnerRepository,
personMock as RepositoryInterface<PersonRepository> as PersonRepository,
processMock as RepositoryInterface<ProcessRepository> as ProcessRepository,
searchMock,
searchMock as RepositoryInterface<SearchRepository> as SearchRepository,
serverInfoMock as RepositoryInterface<ServerInfoRepository> as ServerInfoRepository,
sessionMock as RepositoryInterface<SessionRepository> as SessionRepository,
sharedLinkMock,
stackMock,
storageMock,
sharedLinkMock as RepositoryInterface<SharedLinkRepository> as SharedLinkRepository,
stackMock as RepositoryInterface<StackRepository> as StackRepository,
storageMock as RepositoryInterface<StorageRepository> as StorageRepository,
systemMock as RepositoryInterface<SystemMetadataRepository> as SystemMetadataRepository,
tagMock,
tagMock as RepositoryInterface<TagRepository> as TagRepository,
telemetryMock as unknown as TelemetryRepository,
trashMock as RepositoryInterface<TrashRepository> as TrashRepository,
userMock,
userMock as RepositoryInterface<UserRepository> as UserRepository,
versionHistoryMock as RepositoryInterface<VersionHistoryRepository> as VersionHistoryRepository,
viewMock as RepositoryInterface<ViewRepository> as ViewRepository,
);