import { Inject } from '@nestjs/common'; import { DateTime } from 'luxon'; import { AccessCore, Permission } from 'src/cores/access.core'; import { JOBS_ASSET_PAGINATION_SIZE, JobName } from 'src/domain/job/job.constants'; import { BulkIdsDto } from 'src/dtos/asset-ids.response.dto'; import { AuthDto } from 'src/dtos/auth.dto'; import { IAccessRepository } from 'src/interfaces/access.repository'; import { IAssetRepository } from 'src/interfaces/asset.repository'; import { ClientEvent, ICommunicationRepository } from 'src/interfaces/communication.repository'; import { IJobRepository } from 'src/interfaces/job.repository'; import { usePagination } from 'src/utils'; export class TrashService { private access: AccessCore; constructor( @Inject(IAccessRepository) accessRepository: IAccessRepository, @Inject(IAssetRepository) private assetRepository: IAssetRepository, @Inject(IJobRepository) private jobRepository: IJobRepository, @Inject(ICommunicationRepository) private communicationRepository: ICommunicationRepository, ) { this.access = AccessCore.create(accessRepository); } async restoreAssets(auth: AuthDto, dto: BulkIdsDto): Promise { const { ids } = dto; await this.access.requirePermission(auth, Permission.ASSET_RESTORE, ids); await this.restoreAndSend(auth, ids); } async restore(auth: AuthDto): Promise { const assetPagination = usePagination(JOBS_ASSET_PAGINATION_SIZE, (pagination) => this.assetRepository.getByUserId(pagination, auth.user.id, { trashedBefore: DateTime.now().toJSDate(), }), ); for await (const assets of assetPagination) { const ids = assets.map((a) => a.id); await this.restoreAndSend(auth, ids); } } async empty(auth: AuthDto): Promise { const assetPagination = usePagination(JOBS_ASSET_PAGINATION_SIZE, (pagination) => this.assetRepository.getByUserId(pagination, auth.user.id, { trashedBefore: DateTime.now().toJSDate(), }), ); for await (const assets of assetPagination) { await this.jobRepository.queueAll( assets.map((asset) => ({ name: JobName.ASSET_DELETION, data: { id: asset.id } })), ); } } private async restoreAndSend(auth: AuthDto, ids: string[]) { if (ids.length === 0) { return; } await this.assetRepository.restoreAll(ids); this.communicationRepository.send(ClientEvent.ASSET_RESTORE, auth.user.id, ids); } }