id === null) { throw new BadRequestException('setId is required'); } if ($request->name === null || $request->name === '') { throw new BadRequestException('name is required'); } if ( $request->description === null || $request->description === '' ) { throw new BadRequestException('description is required'); } $set = $this->setRepository->find($request->id); if ($set === null) { throw new NotFoundException('Set not found'); } $oldIconImageUrl = $set->getIconImageUrl(); $newIconImageUrl = $this->iconImageUrl($request, $oldIconImageUrl); $set->setName($request->name); $set->setDescription($request->description); $set->setIconImageUrl($newIconImageUrl); $updatedSet = $this->setRepository->update($set); if ($newIconImageUrl !== $oldIconImageUrl) { $this->deleteManagedSetIcon($oldIconImageUrl); } return $updatedSet; } /** * @throws BadRequestException */ private function iconImageUrl( UpdateSetRequest $request, string $currentIconImageUrl, ): string { if ( $request->iconImageContents === null && $request->iconImageOriginalName === null && $request->iconImageMimeType === null && $request->iconImageSizeBytes === null ) { return $currentIconImageUrl; } if ( $request->iconImageContents === null || $request->iconImageOriginalName === null || $request->iconImageMimeType === null || $request->iconImageSizeBytes === null ) { throw new BadRequestException('icon image is required'); } if ( ! in_array( $request->iconImageMimeType, self::ALLOWED_MIME_TYPES, true, ) ) { throw new BadRequestException( 'icon image must be a jpeg, png or webp image', ); } if ($request->iconImageSizeBytes > self::MAX_SIZE_BYTES) { throw new BadRequestException( 'icon image must be 5MB or smaller', ); } $iconImage = new FileToUpload( contents: $request->iconImageContents, originalName: $request->iconImageOriginalName, mimeType: $request->iconImageMimeType, sizeBytes: $request->iconImageSizeBytes, ); return $this->filesystem->upload($iconImage, 'set-icons'); } private function deleteManagedSetIcon(string $path): void { if (! str_starts_with($path, 'set-icons/')) { return; } $this->filesystem->delete($path); } }