mirror of
https://github.com/immich-app/immich.git
synced 2024-11-24 08:52:28 +02:00
refactor(server): rename asset stack to stack (#10828)
This commit is contained in:
parent
23b3073687
commit
eb1ba11d60
@ -1,12 +1,12 @@
|
|||||||
import { AlbumEntity } from 'src/entities/album.entity';
|
import { AlbumEntity } from 'src/entities/album.entity';
|
||||||
import { AssetFaceEntity } from 'src/entities/asset-face.entity';
|
import { AssetFaceEntity } from 'src/entities/asset-face.entity';
|
||||||
import { AssetJobStatusEntity } from 'src/entities/asset-job-status.entity';
|
import { AssetJobStatusEntity } from 'src/entities/asset-job-status.entity';
|
||||||
import { AssetStackEntity } from 'src/entities/asset-stack.entity';
|
|
||||||
import { ExifEntity } from 'src/entities/exif.entity';
|
import { ExifEntity } from 'src/entities/exif.entity';
|
||||||
import { LibraryEntity } from 'src/entities/library.entity';
|
import { LibraryEntity } from 'src/entities/library.entity';
|
||||||
import { SharedLinkEntity } from 'src/entities/shared-link.entity';
|
import { SharedLinkEntity } from 'src/entities/shared-link.entity';
|
||||||
import { SmartInfoEntity } from 'src/entities/smart-info.entity';
|
import { SmartInfoEntity } from 'src/entities/smart-info.entity';
|
||||||
import { SmartSearchEntity } from 'src/entities/smart-search.entity';
|
import { SmartSearchEntity } from 'src/entities/smart-search.entity';
|
||||||
|
import { StackEntity } from 'src/entities/stack.entity';
|
||||||
import { TagEntity } from 'src/entities/tag.entity';
|
import { TagEntity } from 'src/entities/tag.entity';
|
||||||
import { UserEntity } from 'src/entities/user.entity';
|
import { UserEntity } from 'src/entities/user.entity';
|
||||||
import {
|
import {
|
||||||
@ -164,9 +164,9 @@ export class AssetEntity {
|
|||||||
@Column({ nullable: true })
|
@Column({ nullable: true })
|
||||||
stackId?: string | null;
|
stackId?: string | null;
|
||||||
|
|
||||||
@ManyToOne(() => AssetStackEntity, { nullable: true, onDelete: 'SET NULL', onUpdate: 'CASCADE' })
|
@ManyToOne(() => StackEntity, { nullable: true, onDelete: 'SET NULL', onUpdate: 'CASCADE' })
|
||||||
@JoinColumn()
|
@JoinColumn()
|
||||||
stack?: AssetStackEntity | null;
|
stack?: StackEntity | null;
|
||||||
|
|
||||||
@OneToOne(() => AssetJobStatusEntity, (jobStatus) => jobStatus.asset, { nullable: true })
|
@OneToOne(() => AssetJobStatusEntity, (jobStatus) => jobStatus.asset, { nullable: true })
|
||||||
jobStatus?: AssetJobStatusEntity;
|
jobStatus?: AssetJobStatusEntity;
|
||||||
|
@ -4,7 +4,6 @@ import { AlbumEntity } from 'src/entities/album.entity';
|
|||||||
import { APIKeyEntity } from 'src/entities/api-key.entity';
|
import { APIKeyEntity } from 'src/entities/api-key.entity';
|
||||||
import { AssetFaceEntity } from 'src/entities/asset-face.entity';
|
import { AssetFaceEntity } from 'src/entities/asset-face.entity';
|
||||||
import { AssetJobStatusEntity } from 'src/entities/asset-job-status.entity';
|
import { AssetJobStatusEntity } from 'src/entities/asset-job-status.entity';
|
||||||
import { AssetStackEntity } from 'src/entities/asset-stack.entity';
|
|
||||||
import { AssetEntity } from 'src/entities/asset.entity';
|
import { AssetEntity } from 'src/entities/asset.entity';
|
||||||
import { AuditEntity } from 'src/entities/audit.entity';
|
import { AuditEntity } from 'src/entities/audit.entity';
|
||||||
import { ExifEntity } from 'src/entities/exif.entity';
|
import { ExifEntity } from 'src/entities/exif.entity';
|
||||||
@ -19,6 +18,7 @@ import { SessionEntity } from 'src/entities/session.entity';
|
|||||||
import { SharedLinkEntity } from 'src/entities/shared-link.entity';
|
import { SharedLinkEntity } from 'src/entities/shared-link.entity';
|
||||||
import { SmartInfoEntity } from 'src/entities/smart-info.entity';
|
import { SmartInfoEntity } from 'src/entities/smart-info.entity';
|
||||||
import { SmartSearchEntity } from 'src/entities/smart-search.entity';
|
import { SmartSearchEntity } from 'src/entities/smart-search.entity';
|
||||||
|
import { StackEntity } from 'src/entities/stack.entity';
|
||||||
import { SystemMetadataEntity } from 'src/entities/system-metadata.entity';
|
import { SystemMetadataEntity } from 'src/entities/system-metadata.entity';
|
||||||
import { TagEntity } from 'src/entities/tag.entity';
|
import { TagEntity } from 'src/entities/tag.entity';
|
||||||
import { UserMetadataEntity } from 'src/entities/user-metadata.entity';
|
import { UserMetadataEntity } from 'src/entities/user-metadata.entity';
|
||||||
@ -30,7 +30,6 @@ export const entities = [
|
|||||||
AlbumUserEntity,
|
AlbumUserEntity,
|
||||||
APIKeyEntity,
|
APIKeyEntity,
|
||||||
AssetEntity,
|
AssetEntity,
|
||||||
AssetStackEntity,
|
|
||||||
AssetFaceEntity,
|
AssetFaceEntity,
|
||||||
AssetJobStatusEntity,
|
AssetJobStatusEntity,
|
||||||
AuditEntity,
|
AuditEntity,
|
||||||
@ -44,6 +43,7 @@ export const entities = [
|
|||||||
SharedLinkEntity,
|
SharedLinkEntity,
|
||||||
SmartInfoEntity,
|
SmartInfoEntity,
|
||||||
SmartSearchEntity,
|
SmartSearchEntity,
|
||||||
|
StackEntity,
|
||||||
SystemMetadataEntity,
|
SystemMetadataEntity,
|
||||||
TagEntity,
|
TagEntity,
|
||||||
UserEntity,
|
UserEntity,
|
||||||
|
@ -2,7 +2,7 @@ import { AssetEntity } from 'src/entities/asset.entity';
|
|||||||
import { Column, Entity, JoinColumn, OneToMany, OneToOne, PrimaryGeneratedColumn } from 'typeorm';
|
import { Column, Entity, JoinColumn, OneToMany, OneToOne, PrimaryGeneratedColumn } from 'typeorm';
|
||||||
|
|
||||||
@Entity('asset_stack')
|
@Entity('asset_stack')
|
||||||
export class AssetStackEntity {
|
export class StackEntity {
|
||||||
@PrimaryGeneratedColumn('uuid')
|
@PrimaryGeneratedColumn('uuid')
|
||||||
id!: string;
|
id!: string;
|
||||||
|
|
@ -1,11 +0,0 @@
|
|||||||
import { AssetStackEntity } from 'src/entities/asset-stack.entity';
|
|
||||||
|
|
||||||
export const IAssetStackRepository = 'IAssetStackRepository';
|
|
||||||
|
|
||||||
export interface IAssetStackRepository {
|
|
||||||
create(assetStack: Partial<AssetStackEntity>): Promise<AssetStackEntity>;
|
|
||||||
update(asset: Pick<AssetStackEntity, 'id'> & Partial<AssetStackEntity>): Promise<AssetStackEntity>;
|
|
||||||
delete(id: string): Promise<void>;
|
|
||||||
getById(id: string): Promise<AssetStackEntity | null>;
|
|
||||||
deleteAll(userId: string): Promise<void>;
|
|
||||||
}
|
|
11
server/src/interfaces/stack.interface.ts
Normal file
11
server/src/interfaces/stack.interface.ts
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import { StackEntity } from 'src/entities/stack.entity';
|
||||||
|
|
||||||
|
export const IStackRepository = 'IStackRepository';
|
||||||
|
|
||||||
|
export interface IStackRepository {
|
||||||
|
create(stack: Partial<StackEntity>): Promise<StackEntity>;
|
||||||
|
update(stack: Pick<StackEntity, 'id'> & Partial<StackEntity>): Promise<StackEntity>;
|
||||||
|
delete(id: string): Promise<void>;
|
||||||
|
getById(id: string): Promise<StackEntity | null>;
|
||||||
|
deleteAll(userId: string): Promise<void>;
|
||||||
|
}
|
@ -3,7 +3,6 @@ import { IActivityRepository } from 'src/interfaces/activity.interface';
|
|||||||
import { IAlbumUserRepository } from 'src/interfaces/album-user.interface';
|
import { IAlbumUserRepository } from 'src/interfaces/album-user.interface';
|
||||||
import { IAlbumRepository } from 'src/interfaces/album.interface';
|
import { IAlbumRepository } from 'src/interfaces/album.interface';
|
||||||
import { IKeyRepository } from 'src/interfaces/api-key.interface';
|
import { IKeyRepository } from 'src/interfaces/api-key.interface';
|
||||||
import { IAssetStackRepository } from 'src/interfaces/asset-stack.interface';
|
|
||||||
import { IAssetRepository } from 'src/interfaces/asset.interface';
|
import { IAssetRepository } from 'src/interfaces/asset.interface';
|
||||||
import { IAuditRepository } from 'src/interfaces/audit.interface';
|
import { IAuditRepository } from 'src/interfaces/audit.interface';
|
||||||
import { ICryptoRepository } from 'src/interfaces/crypto.interface';
|
import { ICryptoRepository } from 'src/interfaces/crypto.interface';
|
||||||
@ -26,6 +25,7 @@ import { ISearchRepository } from 'src/interfaces/search.interface';
|
|||||||
import { IServerInfoRepository } from 'src/interfaces/server-info.interface';
|
import { IServerInfoRepository } from 'src/interfaces/server-info.interface';
|
||||||
import { ISessionRepository } from 'src/interfaces/session.interface';
|
import { ISessionRepository } from 'src/interfaces/session.interface';
|
||||||
import { ISharedLinkRepository } from 'src/interfaces/shared-link.interface';
|
import { ISharedLinkRepository } from 'src/interfaces/shared-link.interface';
|
||||||
|
import { IStackRepository } from 'src/interfaces/stack.interface';
|
||||||
import { IStorageRepository } from 'src/interfaces/storage.interface';
|
import { IStorageRepository } from 'src/interfaces/storage.interface';
|
||||||
import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.interface';
|
import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.interface';
|
||||||
import { ITagRepository } from 'src/interfaces/tag.interface';
|
import { ITagRepository } from 'src/interfaces/tag.interface';
|
||||||
@ -35,7 +35,6 @@ import { ActivityRepository } from 'src/repositories/activity.repository';
|
|||||||
import { AlbumUserRepository } from 'src/repositories/album-user.repository';
|
import { AlbumUserRepository } from 'src/repositories/album-user.repository';
|
||||||
import { AlbumRepository } from 'src/repositories/album.repository';
|
import { AlbumRepository } from 'src/repositories/album.repository';
|
||||||
import { ApiKeyRepository } from 'src/repositories/api-key.repository';
|
import { ApiKeyRepository } from 'src/repositories/api-key.repository';
|
||||||
import { AssetStackRepository } from 'src/repositories/asset-stack.repository';
|
|
||||||
import { AssetRepository } from 'src/repositories/asset.repository';
|
import { AssetRepository } from 'src/repositories/asset.repository';
|
||||||
import { AuditRepository } from 'src/repositories/audit.repository';
|
import { AuditRepository } from 'src/repositories/audit.repository';
|
||||||
import { CryptoRepository } from 'src/repositories/crypto.repository';
|
import { CryptoRepository } from 'src/repositories/crypto.repository';
|
||||||
@ -58,6 +57,7 @@ import { SearchRepository } from 'src/repositories/search.repository';
|
|||||||
import { ServerInfoRepository } from 'src/repositories/server-info.repository';
|
import { ServerInfoRepository } from 'src/repositories/server-info.repository';
|
||||||
import { SessionRepository } from 'src/repositories/session.repository';
|
import { SessionRepository } from 'src/repositories/session.repository';
|
||||||
import { SharedLinkRepository } from 'src/repositories/shared-link.repository';
|
import { SharedLinkRepository } from 'src/repositories/shared-link.repository';
|
||||||
|
import { StackRepository } from 'src/repositories/stack.repository';
|
||||||
import { StorageRepository } from 'src/repositories/storage.repository';
|
import { StorageRepository } from 'src/repositories/storage.repository';
|
||||||
import { SystemMetadataRepository } from 'src/repositories/system-metadata.repository';
|
import { SystemMetadataRepository } from 'src/repositories/system-metadata.repository';
|
||||||
import { TagRepository } from 'src/repositories/tag.repository';
|
import { TagRepository } from 'src/repositories/tag.repository';
|
||||||
@ -69,7 +69,6 @@ export const repositories = [
|
|||||||
{ provide: IAlbumRepository, useClass: AlbumRepository },
|
{ provide: IAlbumRepository, useClass: AlbumRepository },
|
||||||
{ provide: IAlbumUserRepository, useClass: AlbumUserRepository },
|
{ provide: IAlbumUserRepository, useClass: AlbumUserRepository },
|
||||||
{ provide: IAssetRepository, useClass: AssetRepository },
|
{ provide: IAssetRepository, useClass: AssetRepository },
|
||||||
{ provide: IAssetStackRepository, useClass: AssetStackRepository },
|
|
||||||
{ provide: IAuditRepository, useClass: AuditRepository },
|
{ provide: IAuditRepository, useClass: AuditRepository },
|
||||||
{ provide: ICryptoRepository, useClass: CryptoRepository },
|
{ provide: ICryptoRepository, useClass: CryptoRepository },
|
||||||
{ provide: IDatabaseRepository, useClass: DatabaseRepository },
|
{ provide: IDatabaseRepository, useClass: DatabaseRepository },
|
||||||
@ -92,6 +91,7 @@ export const repositories = [
|
|||||||
{ provide: IServerInfoRepository, useClass: ServerInfoRepository },
|
{ provide: IServerInfoRepository, useClass: ServerInfoRepository },
|
||||||
{ provide: ISessionRepository, useClass: SessionRepository },
|
{ provide: ISessionRepository, useClass: SessionRepository },
|
||||||
{ provide: ISharedLinkRepository, useClass: SharedLinkRepository },
|
{ provide: ISharedLinkRepository, useClass: SharedLinkRepository },
|
||||||
|
{ provide: IStackRepository, useClass: StackRepository },
|
||||||
{ provide: IStorageRepository, useClass: StorageRepository },
|
{ provide: IStorageRepository, useClass: StorageRepository },
|
||||||
{ provide: ISystemMetadataRepository, useClass: SystemMetadataRepository },
|
{ provide: ISystemMetadataRepository, useClass: SystemMetadataRepository },
|
||||||
{ provide: ITagRepository, useClass: TagRepository },
|
{ provide: ITagRepository, useClass: TagRepository },
|
||||||
|
@ -1,16 +1,16 @@
|
|||||||
import { Injectable } from '@nestjs/common';
|
import { Injectable } from '@nestjs/common';
|
||||||
import { InjectRepository } from '@nestjs/typeorm';
|
import { InjectRepository } from '@nestjs/typeorm';
|
||||||
import { AssetStackEntity } from 'src/entities/asset-stack.entity';
|
import { StackEntity } from 'src/entities/stack.entity';
|
||||||
import { IAssetStackRepository } from 'src/interfaces/asset-stack.interface';
|
import { IStackRepository } from 'src/interfaces/stack.interface';
|
||||||
import { Instrumentation } from 'src/utils/instrumentation';
|
import { Instrumentation } from 'src/utils/instrumentation';
|
||||||
import { In, Repository } from 'typeorm';
|
import { In, Repository } from 'typeorm';
|
||||||
|
|
||||||
@Instrumentation()
|
@Instrumentation()
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class AssetStackRepository implements IAssetStackRepository {
|
export class StackRepository implements IStackRepository {
|
||||||
constructor(@InjectRepository(AssetStackEntity) private repository: Repository<AssetStackEntity>) {}
|
constructor(@InjectRepository(StackEntity) private repository: Repository<StackEntity>) {}
|
||||||
|
|
||||||
create(entity: Partial<AssetStackEntity>) {
|
create(entity: Partial<StackEntity>) {
|
||||||
return this.save(entity);
|
return this.save(entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -18,11 +18,11 @@ export class AssetStackRepository implements IAssetStackRepository {
|
|||||||
await this.repository.delete(id);
|
await this.repository.delete(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
update(entity: Partial<AssetStackEntity>) {
|
update(entity: Partial<StackEntity>) {
|
||||||
return this.save(entity);
|
return this.save(entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
async getById(id: string): Promise<AssetStackEntity | null> {
|
async getById(id: string): Promise<StackEntity | null> {
|
||||||
return this.repository.findOne({
|
return this.repository.findOne({
|
||||||
where: {
|
where: {
|
||||||
id,
|
id,
|
||||||
@ -41,7 +41,7 @@ export class AssetStackRepository implements IAssetStackRepository {
|
|||||||
await this.repository.delete({ id: In([...stackIds]) });
|
await this.repository.delete({ id: In([...stackIds]) });
|
||||||
}
|
}
|
||||||
|
|
||||||
private async save(entity: Partial<AssetStackEntity>) {
|
private async save(entity: Partial<StackEntity>) {
|
||||||
const { id } = await this.repository.save(entity);
|
const { id } = await this.repository.save(entity);
|
||||||
return this.repository.findOneOrFail({
|
return this.repository.findOneOrFail({
|
||||||
where: {
|
where: {
|
@ -2,27 +2,27 @@ import { BadRequestException } from '@nestjs/common';
|
|||||||
import { mapAsset } from 'src/dtos/asset-response.dto';
|
import { mapAsset } from 'src/dtos/asset-response.dto';
|
||||||
import { AssetJobName, AssetStatsResponseDto } from 'src/dtos/asset.dto';
|
import { AssetJobName, AssetStatsResponseDto } from 'src/dtos/asset.dto';
|
||||||
import { AssetEntity, AssetType } from 'src/entities/asset.entity';
|
import { AssetEntity, AssetType } from 'src/entities/asset.entity';
|
||||||
import { IAssetStackRepository } from 'src/interfaces/asset-stack.interface';
|
|
||||||
import { AssetStats, IAssetRepository } from 'src/interfaces/asset.interface';
|
import { AssetStats, IAssetRepository } from 'src/interfaces/asset.interface';
|
||||||
import { ClientEvent, IEventRepository } from 'src/interfaces/event.interface';
|
import { ClientEvent, IEventRepository } from 'src/interfaces/event.interface';
|
||||||
import { IJobRepository, JobName } from 'src/interfaces/job.interface';
|
import { IJobRepository, JobName } from 'src/interfaces/job.interface';
|
||||||
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
||||||
import { IPartnerRepository } from 'src/interfaces/partner.interface';
|
import { IPartnerRepository } from 'src/interfaces/partner.interface';
|
||||||
|
import { IStackRepository } from 'src/interfaces/stack.interface';
|
||||||
import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.interface';
|
import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.interface';
|
||||||
import { IUserRepository } from 'src/interfaces/user.interface';
|
import { IUserRepository } from 'src/interfaces/user.interface';
|
||||||
import { AssetService } from 'src/services/asset.service';
|
import { AssetService } from 'src/services/asset.service';
|
||||||
import { assetStackStub, assetStub } from 'test/fixtures/asset.stub';
|
import { assetStub, stackStub } from 'test/fixtures/asset.stub';
|
||||||
import { authStub } from 'test/fixtures/auth.stub';
|
import { authStub } from 'test/fixtures/auth.stub';
|
||||||
import { faceStub } from 'test/fixtures/face.stub';
|
import { faceStub } from 'test/fixtures/face.stub';
|
||||||
import { partnerStub } from 'test/fixtures/partner.stub';
|
import { partnerStub } from 'test/fixtures/partner.stub';
|
||||||
import { userStub } from 'test/fixtures/user.stub';
|
import { userStub } from 'test/fixtures/user.stub';
|
||||||
import { IAccessRepositoryMock, newAccessRepositoryMock } from 'test/repositories/access.repository.mock';
|
import { IAccessRepositoryMock, newAccessRepositoryMock } from 'test/repositories/access.repository.mock';
|
||||||
import { newAssetStackRepositoryMock } from 'test/repositories/asset-stack.repository.mock';
|
|
||||||
import { newAssetRepositoryMock } from 'test/repositories/asset.repository.mock';
|
import { newAssetRepositoryMock } from 'test/repositories/asset.repository.mock';
|
||||||
import { newEventRepositoryMock } from 'test/repositories/event.repository.mock';
|
import { newEventRepositoryMock } from 'test/repositories/event.repository.mock';
|
||||||
import { newJobRepositoryMock } from 'test/repositories/job.repository.mock';
|
import { newJobRepositoryMock } from 'test/repositories/job.repository.mock';
|
||||||
import { newLoggerRepositoryMock } from 'test/repositories/logger.repository.mock';
|
import { newLoggerRepositoryMock } from 'test/repositories/logger.repository.mock';
|
||||||
import { newPartnerRepositoryMock } from 'test/repositories/partner.repository.mock';
|
import { newPartnerRepositoryMock } from 'test/repositories/partner.repository.mock';
|
||||||
|
import { newStackRepositoryMock } from 'test/repositories/stack.repository.mock';
|
||||||
import { newSystemMetadataRepositoryMock } from 'test/repositories/system-metadata.repository.mock';
|
import { newSystemMetadataRepositoryMock } from 'test/repositories/system-metadata.repository.mock';
|
||||||
import { newUserRepositoryMock } from 'test/repositories/user.repository.mock';
|
import { newUserRepositoryMock } from 'test/repositories/user.repository.mock';
|
||||||
import { Mocked, vitest } from 'vitest';
|
import { Mocked, vitest } from 'vitest';
|
||||||
@ -47,9 +47,9 @@ describe(AssetService.name, () => {
|
|||||||
let jobMock: Mocked<IJobRepository>;
|
let jobMock: Mocked<IJobRepository>;
|
||||||
let userMock: Mocked<IUserRepository>;
|
let userMock: Mocked<IUserRepository>;
|
||||||
let eventMock: Mocked<IEventRepository>;
|
let eventMock: Mocked<IEventRepository>;
|
||||||
|
let stackMock: Mocked<IStackRepository>;
|
||||||
let systemMock: Mocked<ISystemMetadataRepository>;
|
let systemMock: Mocked<ISystemMetadataRepository>;
|
||||||
let partnerMock: Mocked<IPartnerRepository>;
|
let partnerMock: Mocked<IPartnerRepository>;
|
||||||
let assetStackMock: Mocked<IAssetStackRepository>;
|
|
||||||
let loggerMock: Mocked<ILoggerRepository>;
|
let loggerMock: Mocked<ILoggerRepository>;
|
||||||
|
|
||||||
it('should work', () => {
|
it('should work', () => {
|
||||||
@ -70,7 +70,7 @@ describe(AssetService.name, () => {
|
|||||||
userMock = newUserRepositoryMock();
|
userMock = newUserRepositoryMock();
|
||||||
systemMock = newSystemMetadataRepositoryMock();
|
systemMock = newSystemMetadataRepositoryMock();
|
||||||
partnerMock = newPartnerRepositoryMock();
|
partnerMock = newPartnerRepositoryMock();
|
||||||
assetStackMock = newAssetStackRepositoryMock();
|
stackMock = newStackRepositoryMock();
|
||||||
loggerMock = newLoggerRepositoryMock();
|
loggerMock = newLoggerRepositoryMock();
|
||||||
|
|
||||||
sut = new AssetService(
|
sut = new AssetService(
|
||||||
@ -81,7 +81,7 @@ describe(AssetService.name, () => {
|
|||||||
userMock,
|
userMock,
|
||||||
eventMock,
|
eventMock,
|
||||||
partnerMock,
|
partnerMock,
|
||||||
assetStackMock,
|
stackMock,
|
||||||
loggerMock,
|
loggerMock,
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -274,10 +274,10 @@ describe(AssetService.name, () => {
|
|||||||
{
|
{
|
||||||
id: 'child-1',
|
id: 'child-1',
|
||||||
stackId: 'stack-1',
|
stackId: 'stack-1',
|
||||||
stack: assetStackStub('stack-1', [{ id: 'parent' } as AssetEntity, { id: 'child-1' } as AssetEntity]),
|
stack: stackStub('stack-1', [{ id: 'parent' } as AssetEntity, { id: 'child-1' } as AssetEntity]),
|
||||||
} as AssetEntity,
|
} as AssetEntity,
|
||||||
]);
|
]);
|
||||||
assetStackMock.getById.mockResolvedValue(assetStackStub('stack-1', [{ id: 'parent' } as AssetEntity]));
|
stackMock.getById.mockResolvedValue(stackStub('stack-1', [{ id: 'parent' } as AssetEntity]));
|
||||||
|
|
||||||
await sut.updateAll(authStub.user1, {
|
await sut.updateAll(authStub.user1, {
|
||||||
ids: ['child-1'],
|
ids: ['child-1'],
|
||||||
@ -287,13 +287,13 @@ describe(AssetService.name, () => {
|
|||||||
expect(assetMock.updateAll).toHaveBeenCalledWith(expect.arrayContaining(['parent']), {
|
expect(assetMock.updateAll).toHaveBeenCalledWith(expect.arrayContaining(['parent']), {
|
||||||
updatedAt: expect.any(Date),
|
updatedAt: expect.any(Date),
|
||||||
});
|
});
|
||||||
expect(assetStackMock.delete).toHaveBeenCalledWith('stack-1');
|
expect(stackMock.delete).toHaveBeenCalledWith('stack-1');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('update parentId for new children', async () => {
|
it('update parentId for new children', async () => {
|
||||||
accessMock.asset.checkOwnerAccess.mockResolvedValueOnce(new Set(['child-1', 'child-2']));
|
accessMock.asset.checkOwnerAccess.mockResolvedValueOnce(new Set(['child-1', 'child-2']));
|
||||||
accessMock.asset.checkOwnerAccess.mockResolvedValueOnce(new Set(['parent']));
|
accessMock.asset.checkOwnerAccess.mockResolvedValueOnce(new Set(['parent']));
|
||||||
const stack = assetStackStub('stack-1', [
|
const stack = stackStub('stack-1', [
|
||||||
{ id: 'parent' } as AssetEntity,
|
{ id: 'parent' } as AssetEntity,
|
||||||
{ id: 'child-1' } as AssetEntity,
|
{ id: 'child-1' } as AssetEntity,
|
||||||
{ id: 'child-2' } as AssetEntity,
|
{ id: 'child-2' } as AssetEntity,
|
||||||
@ -308,8 +308,8 @@ describe(AssetService.name, () => {
|
|||||||
ids: ['child-1', 'child-2'],
|
ids: ['child-1', 'child-2'],
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(assetStackMock.update).toHaveBeenCalledWith({
|
expect(stackMock.update).toHaveBeenCalledWith({
|
||||||
...assetStackStub('stack-1', [
|
...stackStub('stack-1', [
|
||||||
{ id: 'child-1' } as AssetEntity,
|
{ id: 'child-1' } as AssetEntity,
|
||||||
{ id: 'child-2' } as AssetEntity,
|
{ id: 'child-2' } as AssetEntity,
|
||||||
{ id: 'parent' } as AssetEntity,
|
{ id: 'parent' } as AssetEntity,
|
||||||
@ -337,18 +337,18 @@ describe(AssetService.name, () => {
|
|||||||
{
|
{
|
||||||
id: 'child-1',
|
id: 'child-1',
|
||||||
stackId: 'stack-1',
|
stackId: 'stack-1',
|
||||||
stack: assetStackStub('stack-1', [{ id: 'child-1' } as AssetEntity, { id: 'child-2' } as AssetEntity]),
|
stack: stackStub('stack-1', [{ id: 'child-1' } as AssetEntity, { id: 'child-2' } as AssetEntity]),
|
||||||
} as AssetEntity,
|
} as AssetEntity,
|
||||||
]);
|
]);
|
||||||
assetStackMock.getById.mockResolvedValue(assetStackStub('stack-1', [{ id: 'parent' } as AssetEntity]));
|
stackMock.getById.mockResolvedValue(stackStub('stack-1', [{ id: 'parent' } as AssetEntity]));
|
||||||
|
|
||||||
await sut.updateAll(authStub.user1, {
|
await sut.updateAll(authStub.user1, {
|
||||||
ids: ['child-1'],
|
ids: ['child-1'],
|
||||||
stackParentId: 'parent',
|
stackParentId: 'parent',
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(assetStackMock.delete).toHaveBeenCalledWith('stack-1');
|
expect(stackMock.delete).toHaveBeenCalledWith('stack-1');
|
||||||
expect(assetStackMock.create).toHaveBeenCalledWith({
|
expect(stackMock.create).toHaveBeenCalledWith({
|
||||||
assets: [{ id: 'child-1' }, { id: 'parent' }, { id: 'child-1' }, { id: 'child-2' }],
|
assets: [{ id: 'child-1' }, { id: 'parent' }, { id: 'child-1' }, { id: 'child-2' }],
|
||||||
primaryAssetId: 'parent',
|
primaryAssetId: 'parent',
|
||||||
});
|
});
|
||||||
@ -437,7 +437,7 @@ describe(AssetService.name, () => {
|
|||||||
|
|
||||||
await sut.handleAssetDeletion({ id: assetStub.primaryImage.id, deleteOnDisk: true });
|
await sut.handleAssetDeletion({ id: assetStub.primaryImage.id, deleteOnDisk: true });
|
||||||
|
|
||||||
expect(assetStackMock.update).toHaveBeenCalledWith({
|
expect(stackMock.update).toHaveBeenCalledWith({
|
||||||
id: 'stack-1',
|
id: 'stack-1',
|
||||||
primaryAssetId: 'stack-child-asset-1',
|
primaryAssetId: 'stack-child-asset-1',
|
||||||
});
|
});
|
||||||
@ -552,7 +552,7 @@ describe(AssetService.name, () => {
|
|||||||
newParentId: 'new',
|
newParentId: 'new',
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(assetStackMock.update).toBeCalledWith({ id: 'stack-1', primaryAssetId: 'new' });
|
expect(stackMock.update).toBeCalledWith({ id: 'stack-1', primaryAssetId: 'new' });
|
||||||
expect(assetMock.updateAll).toBeCalledWith([assetStub.image.id, 'new', assetStub.image.id], {
|
expect(assetMock.updateAll).toBeCalledWith([assetStub.image.id, 'new', assetStub.image.id], {
|
||||||
updatedAt: expect.any(Date),
|
updatedAt: expect.any(Date),
|
||||||
});
|
});
|
||||||
|
@ -23,7 +23,6 @@ import { MemoryLaneDto } from 'src/dtos/search.dto';
|
|||||||
import { UpdateStackParentDto } from 'src/dtos/stack.dto';
|
import { UpdateStackParentDto } from 'src/dtos/stack.dto';
|
||||||
import { AssetEntity } from 'src/entities/asset.entity';
|
import { AssetEntity } from 'src/entities/asset.entity';
|
||||||
import { IAccessRepository } from 'src/interfaces/access.interface';
|
import { IAccessRepository } from 'src/interfaces/access.interface';
|
||||||
import { IAssetStackRepository } from 'src/interfaces/asset-stack.interface';
|
|
||||||
import { IAssetRepository } from 'src/interfaces/asset.interface';
|
import { IAssetRepository } from 'src/interfaces/asset.interface';
|
||||||
import { ClientEvent, IEventRepository } from 'src/interfaces/event.interface';
|
import { ClientEvent, IEventRepository } from 'src/interfaces/event.interface';
|
||||||
import {
|
import {
|
||||||
@ -37,6 +36,7 @@ import {
|
|||||||
} from 'src/interfaces/job.interface';
|
} from 'src/interfaces/job.interface';
|
||||||
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
||||||
import { IPartnerRepository } from 'src/interfaces/partner.interface';
|
import { IPartnerRepository } from 'src/interfaces/partner.interface';
|
||||||
|
import { IStackRepository } from 'src/interfaces/stack.interface';
|
||||||
import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.interface';
|
import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.interface';
|
||||||
import { IUserRepository } from 'src/interfaces/user.interface';
|
import { IUserRepository } from 'src/interfaces/user.interface';
|
||||||
import { getMyPartnerIds } from 'src/utils/asset.util';
|
import { getMyPartnerIds } from 'src/utils/asset.util';
|
||||||
@ -54,7 +54,7 @@ export class AssetService {
|
|||||||
@Inject(IUserRepository) private userRepository: IUserRepository,
|
@Inject(IUserRepository) private userRepository: IUserRepository,
|
||||||
@Inject(IEventRepository) private eventRepository: IEventRepository,
|
@Inject(IEventRepository) private eventRepository: IEventRepository,
|
||||||
@Inject(IPartnerRepository) private partnerRepository: IPartnerRepository,
|
@Inject(IPartnerRepository) private partnerRepository: IPartnerRepository,
|
||||||
@Inject(IAssetStackRepository) private assetStackRepository: IAssetStackRepository,
|
@Inject(IStackRepository) private stackRepository: IStackRepository,
|
||||||
@Inject(ILoggerRepository) private logger: ILoggerRepository,
|
@Inject(ILoggerRepository) private logger: ILoggerRepository,
|
||||||
) {
|
) {
|
||||||
this.logger.setContext(AssetService.name);
|
this.logger.setContext(AssetService.name);
|
||||||
@ -211,13 +211,13 @@ export class AssetService {
|
|||||||
ids.push(...assetsWithChildren.flatMap((child) => child.stack!.assets.map((gChild) => gChild.id)));
|
ids.push(...assetsWithChildren.flatMap((child) => child.stack!.assets.map((gChild) => gChild.id)));
|
||||||
|
|
||||||
if (stack) {
|
if (stack) {
|
||||||
await this.assetStackRepository.update({
|
await this.stackRepository.update({
|
||||||
id: stack.id,
|
id: stack.id,
|
||||||
primaryAssetId: primaryAsset.id,
|
primaryAssetId: primaryAsset.id,
|
||||||
assets: ids.map((id) => ({ id }) as AssetEntity),
|
assets: ids.map((id) => ({ id }) as AssetEntity),
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
stack = await this.assetStackRepository.create({
|
stack = await this.stackRepository.create({
|
||||||
primaryAssetId: primaryAsset.id,
|
primaryAssetId: primaryAsset.id,
|
||||||
assets: ids.map((id) => ({ id }) as AssetEntity),
|
assets: ids.map((id) => ({ id }) as AssetEntity),
|
||||||
});
|
});
|
||||||
@ -233,13 +233,11 @@ export class AssetService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
await this.assetRepository.updateAll(ids, options);
|
await this.assetRepository.updateAll(ids, options);
|
||||||
const stackIdsToDelete = await Promise.all(
|
const stackIdsToDelete = await Promise.all(stackIdsToCheckForDelete.map((id) => this.stackRepository.getById(id)));
|
||||||
stackIdsToCheckForDelete.map((id) => this.assetStackRepository.getById(id)),
|
|
||||||
);
|
|
||||||
const stacksToDelete = stackIdsToDelete
|
const stacksToDelete = stackIdsToDelete
|
||||||
.flatMap((stack) => (stack ? [stack] : []))
|
.flatMap((stack) => (stack ? [stack] : []))
|
||||||
.filter((stack) => stack.assets.length < 2);
|
.filter((stack) => stack.assets.length < 2);
|
||||||
await Promise.all(stacksToDelete.map((as) => this.assetStackRepository.delete(as.id)));
|
await Promise.all(stacksToDelete.map((as) => this.stackRepository.delete(as.id)));
|
||||||
this.eventRepository.clientSend(ClientEvent.ASSET_STACK_UPDATE, auth.user.id, ids);
|
this.eventRepository.clientSend(ClientEvent.ASSET_STACK_UPDATE, auth.user.id, ids);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -289,12 +287,12 @@ export class AssetService {
|
|||||||
const stackAssetIds = asset.stack.assets.map((a) => a.id);
|
const stackAssetIds = asset.stack.assets.map((a) => a.id);
|
||||||
if (stackAssetIds.length > 2) {
|
if (stackAssetIds.length > 2) {
|
||||||
const newPrimaryAssetId = stackAssetIds.find((a) => a !== id)!;
|
const newPrimaryAssetId = stackAssetIds.find((a) => a !== id)!;
|
||||||
await this.assetStackRepository.update({
|
await this.stackRepository.update({
|
||||||
id: asset.stack.id,
|
id: asset.stack.id,
|
||||||
primaryAssetId: newPrimaryAssetId,
|
primaryAssetId: newPrimaryAssetId,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
await this.assetStackRepository.delete(asset.stack.id);
|
await this.stackRepository.delete(asset.stack.id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -365,7 +363,7 @@ export class AssetService {
|
|||||||
// Get all children of old parent
|
// Get all children of old parent
|
||||||
childIds.push(oldParent.id, ...(oldParent.stack?.assets.map((a) => a.id) ?? []));
|
childIds.push(oldParent.id, ...(oldParent.stack?.assets.map((a) => a.id) ?? []));
|
||||||
}
|
}
|
||||||
await this.assetStackRepository.update({
|
await this.stackRepository.update({
|
||||||
id: oldParent.stackId,
|
id: oldParent.stackId,
|
||||||
primaryAssetId: newParentId,
|
primaryAssetId: newParentId,
|
||||||
});
|
});
|
||||||
|
@ -2,10 +2,10 @@ import { BadRequestException, InternalServerErrorException, NotFoundException }
|
|||||||
import { UserMetadataKey } from 'src/entities/user-metadata.entity';
|
import { UserMetadataKey } from 'src/entities/user-metadata.entity';
|
||||||
import { UserEntity } from 'src/entities/user.entity';
|
import { UserEntity } from 'src/entities/user.entity';
|
||||||
import { IAlbumRepository } from 'src/interfaces/album.interface';
|
import { IAlbumRepository } from 'src/interfaces/album.interface';
|
||||||
import { IAssetStackRepository } from 'src/interfaces/asset-stack.interface';
|
|
||||||
import { ICryptoRepository } from 'src/interfaces/crypto.interface';
|
import { ICryptoRepository } from 'src/interfaces/crypto.interface';
|
||||||
import { IJobRepository, JobName } from 'src/interfaces/job.interface';
|
import { IJobRepository, JobName } from 'src/interfaces/job.interface';
|
||||||
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
||||||
|
import { IStackRepository } from 'src/interfaces/stack.interface';
|
||||||
import { IStorageRepository } from 'src/interfaces/storage.interface';
|
import { IStorageRepository } from 'src/interfaces/storage.interface';
|
||||||
import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.interface';
|
import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.interface';
|
||||||
import { IUserRepository } from 'src/interfaces/user.interface';
|
import { IUserRepository } from 'src/interfaces/user.interface';
|
||||||
@ -15,10 +15,10 @@ import { authStub } from 'test/fixtures/auth.stub';
|
|||||||
import { systemConfigStub } from 'test/fixtures/system-config.stub';
|
import { systemConfigStub } from 'test/fixtures/system-config.stub';
|
||||||
import { userStub } from 'test/fixtures/user.stub';
|
import { userStub } from 'test/fixtures/user.stub';
|
||||||
import { newAlbumRepositoryMock } from 'test/repositories/album.repository.mock';
|
import { newAlbumRepositoryMock } from 'test/repositories/album.repository.mock';
|
||||||
import { newAssetStackRepositoryMock } from 'test/repositories/asset-stack.repository.mock';
|
|
||||||
import { newCryptoRepositoryMock } from 'test/repositories/crypto.repository.mock';
|
import { newCryptoRepositoryMock } from 'test/repositories/crypto.repository.mock';
|
||||||
import { newJobRepositoryMock } from 'test/repositories/job.repository.mock';
|
import { newJobRepositoryMock } from 'test/repositories/job.repository.mock';
|
||||||
import { newLoggerRepositoryMock } from 'test/repositories/logger.repository.mock';
|
import { newLoggerRepositoryMock } from 'test/repositories/logger.repository.mock';
|
||||||
|
import { newStackRepositoryMock } from 'test/repositories/stack.repository.mock';
|
||||||
import { newStorageRepositoryMock } from 'test/repositories/storage.repository.mock';
|
import { newStorageRepositoryMock } from 'test/repositories/storage.repository.mock';
|
||||||
import { newSystemMetadataRepositoryMock } from 'test/repositories/system-metadata.repository.mock';
|
import { newSystemMetadataRepositoryMock } from 'test/repositories/system-metadata.repository.mock';
|
||||||
import { newUserRepositoryMock } from 'test/repositories/user.repository.mock';
|
import { newUserRepositoryMock } from 'test/repositories/user.repository.mock';
|
||||||
@ -37,7 +37,7 @@ describe(UserService.name, () => {
|
|||||||
|
|
||||||
let albumMock: Mocked<IAlbumRepository>;
|
let albumMock: Mocked<IAlbumRepository>;
|
||||||
let jobMock: Mocked<IJobRepository>;
|
let jobMock: Mocked<IJobRepository>;
|
||||||
let stackMock: Mocked<IAssetStackRepository>;
|
let stackMock: Mocked<IStackRepository>;
|
||||||
let storageMock: Mocked<IStorageRepository>;
|
let storageMock: Mocked<IStorageRepository>;
|
||||||
let systemMock: Mocked<ISystemMetadataRepository>;
|
let systemMock: Mocked<ISystemMetadataRepository>;
|
||||||
let loggerMock: Mocked<ILoggerRepository>;
|
let loggerMock: Mocked<ILoggerRepository>;
|
||||||
@ -47,7 +47,7 @@ describe(UserService.name, () => {
|
|||||||
systemMock = newSystemMetadataRepositoryMock();
|
systemMock = newSystemMetadataRepositoryMock();
|
||||||
cryptoRepositoryMock = newCryptoRepositoryMock();
|
cryptoRepositoryMock = newCryptoRepositoryMock();
|
||||||
jobMock = newJobRepositoryMock();
|
jobMock = newJobRepositoryMock();
|
||||||
stackMock = newAssetStackRepositoryMock();
|
stackMock = newStackRepositoryMock();
|
||||||
storageMock = newStorageRepositoryMock();
|
storageMock = newStorageRepositoryMock();
|
||||||
userMock = newUserRepositoryMock();
|
userMock = newUserRepositoryMock();
|
||||||
loggerMock = newLoggerRepositoryMock();
|
loggerMock = newLoggerRepositoryMock();
|
||||||
|
@ -6,16 +6,16 @@ import { StorageCore, StorageFolder } from 'src/cores/storage.core';
|
|||||||
import { SystemConfigCore } from 'src/cores/system-config.core';
|
import { SystemConfigCore } from 'src/cores/system-config.core';
|
||||||
import { AuthDto } from 'src/dtos/auth.dto';
|
import { AuthDto } from 'src/dtos/auth.dto';
|
||||||
import { LicenseKeyDto, LicenseResponseDto } from 'src/dtos/license.dto';
|
import { LicenseKeyDto, LicenseResponseDto } from 'src/dtos/license.dto';
|
||||||
import { mapPreferences, UserPreferencesResponseDto, UserPreferencesUpdateDto } from 'src/dtos/user-preferences.dto';
|
import { UserPreferencesResponseDto, UserPreferencesUpdateDto, mapPreferences } from 'src/dtos/user-preferences.dto';
|
||||||
import { CreateProfileImageResponseDto, mapCreateProfileImageResponse } from 'src/dtos/user-profile.dto';
|
import { CreateProfileImageResponseDto, mapCreateProfileImageResponse } from 'src/dtos/user-profile.dto';
|
||||||
import { mapUser, mapUserAdmin, UserAdminResponseDto, UserResponseDto, UserUpdateMeDto } from 'src/dtos/user.dto';
|
import { UserAdminResponseDto, UserResponseDto, UserUpdateMeDto, mapUser, mapUserAdmin } from 'src/dtos/user.dto';
|
||||||
import { UserMetadataEntity, UserMetadataKey } from 'src/entities/user-metadata.entity';
|
import { UserMetadataEntity, UserMetadataKey } from 'src/entities/user-metadata.entity';
|
||||||
import { UserEntity } from 'src/entities/user.entity';
|
import { UserEntity } from 'src/entities/user.entity';
|
||||||
import { IAlbumRepository } from 'src/interfaces/album.interface';
|
import { IAlbumRepository } from 'src/interfaces/album.interface';
|
||||||
import { IAssetStackRepository } from 'src/interfaces/asset-stack.interface';
|
|
||||||
import { ICryptoRepository } from 'src/interfaces/crypto.interface';
|
import { ICryptoRepository } from 'src/interfaces/crypto.interface';
|
||||||
import { IEntityJob, IJobRepository, JobName, JobStatus } from 'src/interfaces/job.interface';
|
import { IEntityJob, IJobRepository, JobName, JobStatus } from 'src/interfaces/job.interface';
|
||||||
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
||||||
|
import { IStackRepository } from 'src/interfaces/stack.interface';
|
||||||
import { IStorageRepository } from 'src/interfaces/storage.interface';
|
import { IStorageRepository } from 'src/interfaces/storage.interface';
|
||||||
import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.interface';
|
import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.interface';
|
||||||
import { IUserRepository, UserFindOptions } from 'src/interfaces/user.interface';
|
import { IUserRepository, UserFindOptions } from 'src/interfaces/user.interface';
|
||||||
@ -30,7 +30,7 @@ export class UserService {
|
|||||||
@Inject(IAlbumRepository) private albumRepository: IAlbumRepository,
|
@Inject(IAlbumRepository) private albumRepository: IAlbumRepository,
|
||||||
@Inject(ICryptoRepository) private cryptoRepository: ICryptoRepository,
|
@Inject(ICryptoRepository) private cryptoRepository: ICryptoRepository,
|
||||||
@Inject(IJobRepository) private jobRepository: IJobRepository,
|
@Inject(IJobRepository) private jobRepository: IJobRepository,
|
||||||
@Inject(IAssetStackRepository) private stackRepository: IAssetStackRepository,
|
@Inject(IStackRepository) private stackRepository: IStackRepository,
|
||||||
@Inject(IStorageRepository) private storageRepository: IStorageRepository,
|
@Inject(IStorageRepository) private storageRepository: IStorageRepository,
|
||||||
@Inject(ISystemMetadataRepository) systemMetadataRepository: ISystemMetadataRepository,
|
@Inject(ISystemMetadataRepository) systemMetadataRepository: ISystemMetadataRepository,
|
||||||
@Inject(IUserRepository) private userRepository: IUserRepository,
|
@Inject(IUserRepository) private userRepository: IUserRepository,
|
||||||
|
6
server/test/fixtures/asset.stub.ts
vendored
6
server/test/fixtures/asset.stub.ts
vendored
@ -1,12 +1,12 @@
|
|||||||
import { AssetStackEntity } from 'src/entities/asset-stack.entity';
|
|
||||||
import { AssetEntity, AssetType } from 'src/entities/asset.entity';
|
import { AssetEntity, AssetType } from 'src/entities/asset.entity';
|
||||||
import { ExifEntity } from 'src/entities/exif.entity';
|
import { ExifEntity } from 'src/entities/exif.entity';
|
||||||
|
import { StackEntity } from 'src/entities/stack.entity';
|
||||||
import { authStub } from 'test/fixtures/auth.stub';
|
import { authStub } from 'test/fixtures/auth.stub';
|
||||||
import { fileStub } from 'test/fixtures/file.stub';
|
import { fileStub } from 'test/fixtures/file.stub';
|
||||||
import { libraryStub } from 'test/fixtures/library.stub';
|
import { libraryStub } from 'test/fixtures/library.stub';
|
||||||
import { userStub } from 'test/fixtures/user.stub';
|
import { userStub } from 'test/fixtures/user.stub';
|
||||||
|
|
||||||
export const assetStackStub = (stackId: string, assets: AssetEntity[]): AssetStackEntity => {
|
export const stackStub = (stackId: string, assets: AssetEntity[]): StackEntity => {
|
||||||
return {
|
return {
|
||||||
id: stackId,
|
id: stackId,
|
||||||
assets: assets,
|
assets: assets,
|
||||||
@ -161,7 +161,7 @@ export const assetStub = {
|
|||||||
exifImageHeight: 1000,
|
exifImageHeight: 1000,
|
||||||
exifImageWidth: 1000,
|
exifImageWidth: 1000,
|
||||||
} as ExifEntity,
|
} as ExifEntity,
|
||||||
stack: assetStackStub('stack-1', [
|
stack: stackStub('stack-1', [
|
||||||
{ id: 'primary-asset-id' } as AssetEntity,
|
{ id: 'primary-asset-id' } as AssetEntity,
|
||||||
{ id: 'stack-child-asset-1' } as AssetEntity,
|
{ id: 'stack-child-asset-1' } as AssetEntity,
|
||||||
{ id: 'stack-child-asset-2' } as AssetEntity,
|
{ id: 'stack-child-asset-2' } as AssetEntity,
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { IAssetStackRepository } from 'src/interfaces/asset-stack.interface';
|
import { IStackRepository } from 'src/interfaces/stack.interface';
|
||||||
import { Mocked, vitest } from 'vitest';
|
import { Mocked, vitest } from 'vitest';
|
||||||
|
|
||||||
export const newAssetStackRepositoryMock = (): Mocked<IAssetStackRepository> => {
|
export const newStackRepositoryMock = (): Mocked<IStackRepository> => {
|
||||||
return {
|
return {
|
||||||
create: vitest.fn(),
|
create: vitest.fn(),
|
||||||
update: vitest.fn(),
|
update: vitest.fn(),
|
Loading…
Reference in New Issue
Block a user