diff --git a/server/src/interfaces/view.interface.ts b/server/src/interfaces/view.interface.ts deleted file mode 100644 index f819160002041..0000000000000 --- a/server/src/interfaces/view.interface.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { AssetEntity } from 'src/entities/asset.entity'; - -export const IViewRepository = 'IViewRepository'; - -export interface IViewRepository { - getAssetsByOriginalPath(userId: string, partialPath: string): Promise; - getUniqueOriginalPaths(userId: string): Promise; -} diff --git a/server/src/repositories/index.ts b/server/src/repositories/index.ts index 68c79fbe98e9d..a041cfdb0b0b7 100644 --- a/server/src/repositories/index.ts +++ b/server/src/repositories/index.ts @@ -31,7 +31,6 @@ import { ITelemetryRepository } from 'src/interfaces/telemetry.interface'; import { ITrashRepository } from 'src/interfaces/trash.interface'; import { IUserRepository } from 'src/interfaces/user.interface'; import { IVersionHistoryRepository } from 'src/interfaces/version-history.interface'; -import { IViewRepository } from 'src/interfaces/view.interface'; import { AccessRepository } from 'src/repositories/access.repository'; import { ActivityRepository } from 'src/repositories/activity.repository'; import { AlbumUserRepository } from 'src/repositories/album-user.repository'; @@ -79,6 +78,7 @@ export const repositories = [ AuditRepository, ApiKeyRepository, ConfigRepository, + ViewRepository, ]; export const providers = [ @@ -115,5 +115,4 @@ export const providers = [ { provide: ITrashRepository, useClass: TrashRepository }, { provide: IUserRepository, useClass: UserRepository }, { provide: IVersionHistoryRepository, useClass: VersionHistoryRepository }, - { provide: IViewRepository, useClass: ViewRepository }, ]; diff --git a/server/src/repositories/view-repository.ts b/server/src/repositories/view-repository.ts index 13a042a174bf9..f24b1bac6e4d0 100644 --- a/server/src/repositories/view-repository.ts +++ b/server/src/repositories/view-repository.ts @@ -2,15 +2,14 @@ import { Kysely } from 'kysely'; import { InjectKysely } from 'nestjs-kysely'; import { DB } from 'src/db'; import { DummyValue, GenerateSql } from 'src/decorators'; -import { AssetEntity, withExif } from 'src/entities/asset.entity'; -import { IViewRepository } from 'src/interfaces/view.interface'; +import { withExif } from 'src/entities/asset.entity'; import { asUuid } from 'src/utils/database'; -export class ViewRepository implements IViewRepository { +export class ViewRepository { constructor(@InjectKysely() private db: Kysely) {} @GenerateSql({ params: [DummyValue.UUID] }) - async getUniqueOriginalPaths(userId: string): Promise { + async getUniqueOriginalPaths(userId: string) { const results = await this.db .selectFrom('assets') .select((eb) => eb.fn('substring', ['assets.originalPath', eb.val('^(.*/)[^/]*$')]).as('directoryPath')) @@ -25,7 +24,7 @@ export class ViewRepository implements IViewRepository { } @GenerateSql({ params: [DummyValue.UUID, DummyValue.STRING] }) - async getAssetsByOriginalPath(userId: string, partialPath: string): Promise { + async getAssetsByOriginalPath(userId: string, partialPath: string) { const normalizedPath = partialPath.replaceAll(/^\/|\/$/g, ''); return this.db @@ -42,6 +41,6 @@ export class ViewRepository implements IViewRepository { (eb) => eb.fn('regexp_replace', ['assets.originalPath', eb.val('.*/(.+)'), eb.val(String.raw`\1`)]), 'asc', ) - .execute() as any as Promise; + .execute(); } } diff --git a/server/src/services/base.service.ts b/server/src/services/base.service.ts index 054cc2acfad60..0ab7979c147bc 100644 --- a/server/src/services/base.service.ts +++ b/server/src/services/base.service.ts @@ -39,12 +39,12 @@ import { ITelemetryRepository } from 'src/interfaces/telemetry.interface'; import { ITrashRepository } from 'src/interfaces/trash.interface'; import { IUserRepository } from 'src/interfaces/user.interface'; import { IVersionHistoryRepository } from 'src/interfaces/version-history.interface'; -import { IViewRepository } from 'src/interfaces/view.interface'; import { AccessRepository } from 'src/repositories/access.repository'; import { ActivityRepository } from 'src/repositories/activity.repository'; import { ApiKeyRepository } from 'src/repositories/api-key.repository'; import { AuditRepository } from 'src/repositories/audit.repository'; import { ConfigRepository } from 'src/repositories/config.repository'; +import { ViewRepository } from 'src/repositories/view-repository'; import { AccessRequest, checkAccess, requireAccess } from 'src/utils/access'; import { getConfig, updateConfig } from 'src/utils/config'; @@ -90,7 +90,7 @@ export class BaseService { @Inject(ITrashRepository) protected trashRepository: ITrashRepository, @Inject(IUserRepository) protected userRepository: IUserRepository, @Inject(IVersionHistoryRepository) protected versionRepository: IVersionHistoryRepository, - @Inject(IViewRepository) protected viewRepository: IViewRepository, + protected viewRepository: ViewRepository, ) { this.logger.setContext(this.constructor.name); this.storageCore = StorageCore.create( diff --git a/server/src/services/view.service.spec.ts b/server/src/services/view.service.spec.ts index e9373ce66fb7f..e033ec0dc8f01 100644 --- a/server/src/services/view.service.spec.ts +++ b/server/src/services/view.service.spec.ts @@ -1,6 +1,6 @@ import { mapAsset } from 'src/dtos/asset-response.dto'; -import { IViewRepository } from 'src/interfaces/view.interface'; import { ViewService } from 'src/services/view.service'; +import { IViewRepository } from 'src/types'; import { assetStub } from 'test/fixtures/asset.stub'; import { authStub } from 'test/fixtures/auth.stub'; import { newTestService } from 'test/utils'; @@ -42,7 +42,7 @@ describe(ViewService.name, () => { const mockAssetReponseDto = mockAssets.map((a) => mapAsset(a, { auth: authStub.admin })); - viewMock.getAssetsByOriginalPath.mockResolvedValue(mockAssets); + viewMock.getAssetsByOriginalPath.mockResolvedValue(mockAssets as any); const result = await sut.getAssetsByOriginalPath(authStub.admin, path); expect(result).toEqual(mockAssetReponseDto); diff --git a/server/src/services/view.service.ts b/server/src/services/view.service.ts index cb805368705df..f1ef40a810213 100644 --- a/server/src/services/view.service.ts +++ b/server/src/services/view.service.ts @@ -1,5 +1,6 @@ import { AssetResponseDto, mapAsset } from 'src/dtos/asset-response.dto'; import { AuthDto } from 'src/dtos/auth.dto'; +import { AssetEntity } from 'src/entities/asset.entity'; import { BaseService } from 'src/services/base.service'; export class ViewService extends BaseService { @@ -9,6 +10,6 @@ export class ViewService extends BaseService { async getAssetsByOriginalPath(auth: AuthDto, path: string): Promise { const assets = await this.viewRepository.getAssetsByOriginalPath(auth.user.id, path); - return assets.map((asset) => mapAsset(asset, { auth })); + return assets.map((asset) => mapAsset(asset as unknown as AssetEntity, { auth })); } } diff --git a/server/src/types.ts b/server/src/types.ts index f6c1ae46ddc1e..55e19c8aee846 100644 --- a/server/src/types.ts +++ b/server/src/types.ts @@ -5,6 +5,7 @@ import { ActivityRepository } from 'src/repositories/activity.repository'; import { ApiKeyRepository } from 'src/repositories/api-key.repository'; import { AuditRepository } from 'src/repositories/audit.repository'; import { ConfigRepository } from 'src/repositories/config.repository'; +import { ViewRepository } from 'src/repositories/view-repository'; export type AuthApiKey = { id: string; @@ -20,6 +21,7 @@ export type IAccessRepository = { [K in keyof AccessRepository]: RepositoryInter export type IApiKeyRepository = RepositoryInterface; export type IAuditRepository = RepositoryInterface; export type IConfigRepository = RepositoryInterface; +export type IViewRepository = RepositoryInterface; export type ActivityItem = | Awaited> diff --git a/server/test/repositories/view.repository.mock.ts b/server/test/repositories/view.repository.mock.ts index a002362ae78f9..bb58fda8a3d6f 100644 --- a/server/test/repositories/view.repository.mock.ts +++ b/server/test/repositories/view.repository.mock.ts @@ -1,4 +1,4 @@ -import { IViewRepository } from 'src/interfaces/view.interface'; +import { IViewRepository } from 'src/types'; import { Mocked, vitest } from 'vitest'; export const newViewRepositoryMock = (): Mocked => { diff --git a/server/test/utils.ts b/server/test/utils.ts index 363f2fcda7611..a5537dcc2d09f 100644 --- a/server/test/utils.ts +++ b/server/test/utils.ts @@ -7,8 +7,15 @@ import { AccessRepository } from 'src/repositories/access.repository'; import { ActivityRepository } from 'src/repositories/activity.repository'; import { ApiKeyRepository } from 'src/repositories/api-key.repository'; import { AuditRepository } from 'src/repositories/audit.repository'; +import { ViewRepository } from 'src/repositories/view-repository'; import { BaseService } from 'src/services/base.service'; -import { IAccessRepository, IActivityRepository, IApiKeyRepository, IAuditRepository } from 'src/types'; +import { + IAccessRepository, + IActivityRepository, + IApiKeyRepository, + IAuditRepository, + IViewRepository, +} from 'src/types'; import { newAccessRepositoryMock } from 'test/repositories/access.repository.mock'; import { newActivityRepositoryMock } from 'test/repositories/activity.repository.mock'; import { newAlbumUserRepositoryMock } from 'test/repositories/album-user.repository.mock'; @@ -145,7 +152,7 @@ export const newTestService = ( trashMock, userMock, versionHistoryMock, - viewMock, + viewMock as IViewRepository as ViewRepository, ); return {