Skip to content

Commit

Permalink
refactor: view repository (immich-app#15496)
Browse files Browse the repository at this point in the history
  • Loading branch information
jrasm91 authored and vladd11 committed Jan 25, 2025
1 parent 98fdaa3 commit 8a2cef2
Show file tree
Hide file tree
Showing 9 changed files with 24 additions and 24 deletions.
8 changes: 0 additions & 8 deletions server/src/interfaces/view.interface.ts

This file was deleted.

3 changes: 1 addition & 2 deletions server/src/repositories/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -79,6 +78,7 @@ export const repositories = [
AuditRepository,
ApiKeyRepository,
ConfigRepository,
ViewRepository,
];

export const providers = [
Expand Down Expand Up @@ -115,5 +115,4 @@ export const providers = [
{ provide: ITrashRepository, useClass: TrashRepository },
{ provide: IUserRepository, useClass: UserRepository },
{ provide: IVersionHistoryRepository, useClass: VersionHistoryRepository },
{ provide: IViewRepository, useClass: ViewRepository },
];
11 changes: 5 additions & 6 deletions server/src/repositories/view-repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<DB>) {}

@GenerateSql({ params: [DummyValue.UUID] })
async getUniqueOriginalPaths(userId: string): Promise<string[]> {
async getUniqueOriginalPaths(userId: string) {
const results = await this.db
.selectFrom('assets')
.select((eb) => eb.fn<string>('substring', ['assets.originalPath', eb.val('^(.*/)[^/]*$')]).as('directoryPath'))
Expand All @@ -25,7 +24,7 @@ export class ViewRepository implements IViewRepository {
}

@GenerateSql({ params: [DummyValue.UUID, DummyValue.STRING] })
async getAssetsByOriginalPath(userId: string, partialPath: string): Promise<AssetEntity[]> {
async getAssetsByOriginalPath(userId: string, partialPath: string) {
const normalizedPath = partialPath.replaceAll(/^\/|\/$/g, '');

return this.db
Expand All @@ -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<AssetEntity[]>;
.execute();
}
}
4 changes: 2 additions & 2 deletions server/src/services/base.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand Down Expand Up @@ -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(
Expand Down
4 changes: 2 additions & 2 deletions server/src/services/view.service.spec.ts
Original file line number Diff line number Diff line change
@@ -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';
Expand Down Expand Up @@ -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);
Expand Down
3 changes: 2 additions & 1 deletion server/src/services/view.service.ts
Original file line number Diff line number Diff line change
@@ -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 {
Expand All @@ -9,6 +10,6 @@ export class ViewService extends BaseService {

async getAssetsByOriginalPath(auth: AuthDto, path: string): Promise<AssetResponseDto[]> {
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 }));
}
}
2 changes: 2 additions & 0 deletions server/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -20,6 +21,7 @@ export type IAccessRepository = { [K in keyof AccessRepository]: RepositoryInter
export type IApiKeyRepository = RepositoryInterface<ApiKeyRepository>;
export type IAuditRepository = RepositoryInterface<AuditRepository>;
export type IConfigRepository = RepositoryInterface<ConfigRepository>;
export type IViewRepository = RepositoryInterface<ViewRepository>;

export type ActivityItem =
| Awaited<ReturnType<IActivityRepository['create']>>
Expand Down
2 changes: 1 addition & 1 deletion server/test/repositories/view.repository.mock.ts
Original file line number Diff line number Diff line change
@@ -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<IViewRepository> => {
Expand Down
11 changes: 9 additions & 2 deletions server/test/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -145,7 +152,7 @@ export const newTestService = <T extends BaseService>(
trashMock,
userMock,
versionHistoryMock,
viewMock,
viewMock as IViewRepository as ViewRepository,
);

return {
Expand Down

0 comments on commit 8a2cef2

Please sign in to comment.