浏览代码

refactor(server): make access core singleton (#4609)

Daniel Dietzler 1 年之前
父节点
当前提交
50bc92aac0

+ 15 - 1
server/src/domain/access/access.core.ts

@@ -37,8 +37,22 @@ export enum Permission {
   PERSON_MERGE = 'person.merge',
 }
 
+let instance: AccessCore | null;
+
 export class AccessCore {
-  constructor(private repository: IAccessRepository) {}
+  private constructor(private repository: IAccessRepository) {}
+
+  static create(repository: IAccessRepository) {
+    if (!instance) {
+      instance = new AccessCore(repository);
+    }
+
+    return instance;
+  }
+
+  static reset() {
+    instance = null;
+  }
 
   requireUploadAccess(authUser: AuthUserDto | null): AuthUserDto {
     if (!authUser || (authUser.isPublicUser && !authUser.isAllowUpload)) {

+ 1 - 1
server/src/domain/album/album.service.ts

@@ -31,7 +31,7 @@ export class AlbumService {
     @Inject(IJobRepository) private jobRepository: IJobRepository,
     @Inject(IUserRepository) private userRepository: IUserRepository,
   ) {
-    this.access = new AccessCore(accessRepository);
+    this.access = AccessCore.create(accessRepository);
   }
 
   async getCount(authUser: AuthUserDto): Promise<AlbumCountResponseDto> {

+ 1 - 1
server/src/domain/asset/asset.service.ts

@@ -89,7 +89,7 @@ export class AssetService {
     @Inject(IStorageRepository) private storageRepository: IStorageRepository,
     @Inject(ICommunicationRepository) private communicationRepository: ICommunicationRepository,
   ) {
-    this.access = new AccessCore(accessRepository);
+    this.access = AccessCore.create(accessRepository);
     this.configCore = SystemConfigCore.create(configRepository);
     this.storageCore = new StorageCore(storageRepository, assetRepository, moveRepository, personRepository);
   }

+ 1 - 1
server/src/domain/audit/audit.service.ts

@@ -40,7 +40,7 @@ export class AuditService {
     @Inject(IStorageRepository) private storageRepository: IStorageRepository,
     @Inject(IUserRepository) private userRepository: IUserRepository,
   ) {
-    this.access = new AccessCore(accessRepository);
+    this.access = AccessCore.create(accessRepository);
   }
 
   async handleCleanup(): Promise<boolean> {

+ 1 - 1
server/src/domain/library/library.service.ts

@@ -43,7 +43,7 @@ export class LibraryService {
     @Inject(IStorageRepository) private storageRepository: IStorageRepository,
     @Inject(IUserRepository) private userRepository: IUserRepository,
   ) {
-    this.access = new AccessCore(accessRepository);
+    this.access = AccessCore.create(accessRepository);
   }
 
   async getStatistics(authUser: AuthUserDto, id: string): Promise<LibraryStatsResponseDto> {

+ 1 - 1
server/src/domain/person/person.service.ts

@@ -56,7 +56,7 @@ export class PersonService {
     @Inject(IStorageRepository) private storageRepository: IStorageRepository,
     @Inject(IJobRepository) private jobRepository: IJobRepository,
   ) {
-    this.access = new AccessCore(accessRepository);
+    this.access = AccessCore.create(accessRepository);
     this.configCore = SystemConfigCore.create(configRepository);
     this.storageCore = new StorageCore(storageRepository, assetRepository, moveRepository, repository);
   }

+ 1 - 1
server/src/domain/shared-link/shared-link.service.ts

@@ -16,7 +16,7 @@ export class SharedLinkService {
     @Inject(ICryptoRepository) private cryptoRepository: ICryptoRepository,
     @Inject(ISharedLinkRepository) private repository: ISharedLinkRepository,
   ) {
-    this.access = new AccessCore(accessRepository);
+    this.access = AccessCore.create(accessRepository);
   }
 
   getAll(authUser: AuthUserDto): Promise<SharedLinkResponseDto[]> {

+ 1 - 1
server/src/immich/api-v1/asset/asset.service.ts

@@ -68,7 +68,7 @@ export class AssetService {
     @Inject(IStorageRepository) private storageRepository: IStorageRepository,
   ) {
     this.assetCore = new AssetCore(_assetRepository, jobRepository);
-    this.access = new AccessCore(accessRepository);
+    this.access = AccessCore.create(accessRepository);
   }
 
   public async uploadFile(

+ 6 - 2
server/test/repositories/access.repository.mock.ts

@@ -1,4 +1,4 @@
-import { IAccessRepository } from '@app/domain';
+import { AccessCore, IAccessRepository } from '@app/domain';
 
 export interface IAccessRepositoryMock {
   asset: jest.Mocked<IAccessRepository['asset']>;
@@ -8,7 +8,11 @@ export interface IAccessRepositoryMock {
   person: jest.Mocked<IAccessRepository['person']>;
 }
 
-export const newAccessRepositoryMock = (): IAccessRepositoryMock => {
+export const newAccessRepositoryMock = (reset = true): IAccessRepositoryMock => {
+  if (reset) {
+    AccessCore.reset();
+  }
+
   return {
     asset: {
       hasOwnerAccess: jest.fn(),