mangaRepository->findById($command->mangaId); if (!$manga) { throw new MangaNotFoundException($command->mangaId); } // 2. Validate that the file is a valid CBZ if (!$this->isValidCbzFile($command->fileBinary)) { throw new \InvalidArgumentException('The provided file is not a valid CBZ file'); } // 3. Check if chapter exists $existingChapter = $this->mangaRepository->findChapterByMangaIdAndNumber( $command->mangaId, $command->chapterNumber ); if (!$existingChapter) { throw new ChapterNotFoundException("Chapter {$command->chapterNumber} not found for manga {$command->mangaId}"); } // 4. Extract CBZ into individual images storage $pagesDirectory = $this->imageStorage->extractFromCbz( $existingChapter->getId(), $command->fileBinary ); $pageCount = $this->imageStorage->countCbzImages($command->fileBinary); // 5. Update existing chapter with new path through the aggregate $manga->updateChapterPages($existingChapter, $pagesDirectory, $pageCount); $this->mangaRepository->save($manga); } private function isValidCbzFile(string $fileBinary): bool { $zipMagicNumber = "\x50\x4b\x03\x04"; // PK\x03\x04 return 0 === strpos($fileBinary, $zipMagicNumber); } }