name === null || $request->name === '') { throw new BadRequestException('name is required'); } if ($request->description === null || $request->description === '') { throw new BadRequestException('description is required'); } $iconPath = $this->uploadIconImage($request); $set = $this->setRepository->create(new CreateSetDto( name: $request->name, description: $request->description, iconImageUrl: $iconPath, )); $this->elementRepository->create(new CreateElementDto( set: $set, title: $set->getName(), description: $set->getDescription(), iconImageUrl: $iconPath, richText: '', shortPdfPath: null, longPdfPath: null, youtubeUrl: null, parentElement: null, )); return $set; } /** * @throws BadRequestException */ private function uploadIconImage(CreateSetWithRootRequest $request): string { 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'); } }