legacyError(410, [ 'Image upload via the legacy service API has been discontinued. Use POST /api/v1/press-releases/{id}/images with copyright, ai_declaration, rights_confirmed and confirm_text_version.', ]); } abort_unless($request->user()->tokenCan('press-release-images:write'), 403); $pressRelease = PressRelease::withoutGlobalScope(PortalScope::class)->find($pressRelease); if (! $pressRelease) { return $this->legacyError(404, [sprintf('Object press_release does not exist (%s).', $request->route('pressRelease'))]); } if ($pressRelease->user_id !== $request->user()->id) { return $this->legacyError(403, ['You are not the creator of this press release']); } try { $validated = $request->validate([ 'press_release_image' => ['required', 'array'], 'press_release_image.image' => ['required', 'image', 'mimes:jpg,jpeg,png,webp', 'max:8192'], 'press_release_image.title' => ['nullable', 'string', 'max:120'], 'press_release_image.description' => ['nullable', 'string', 'max:500'], 'press_release_image.copyright' => ['nullable', 'string', 'max:255'], ])['press_release_image']; } catch (ValidationException $exception) { return $this->legacyValidationError($exception); } try { $stored = $this->imageService->storePressReleaseImage( $request->file('press_release_image.image'), $pressRelease->id, ); } catch (RuntimeException $exception) { return $this->legacyError(422, [$exception->getMessage()]); } $image = $pressRelease->images()->create([ 'disk' => $stored['disk'], 'path' => $stored['path'], 'variants' => $stored['variants'], 'ai_declaration' => AiImageDeclaration::Original->value, 'title' => $validated['title'] ?? null, 'description' => $validated['description'] ?? null, 'copyright' => $validated['copyright'] ?? null, 'is_preview' => false, 'sort_order' => ((int) $pressRelease->images()->max('sort_order')) + 1, 'width' => $stored['width'], 'height' => $stored['height'], 'mime' => $stored['mime'], ]); return $this->legacyCreated(url("/service/pressreleases/{$pressRelease->id}/images/{$image->id}")); } }