user(); $artwork = Artwork::findOrFail($artworkId); // Rate limit: 10 artwork shares per hour $key = 'share_artwork:' . $user->id; if (RateLimiter::tooManyAttempts($key, 10)) { $seconds = RateLimiter::availableIn($key); return response()->json([ 'message' => "You're sharing too quickly. Please wait {$seconds} seconds.", ], 429); } RateLimiter::hit($key, 3600); $post = $this->shareService->shareArtwork( user: $user, artwork: $artwork, body: $request->input('body'), visibility: $request->input('visibility', 'public'), ); $post->load(['user', 'user.profile', 'targets', 'targets.artwork', 'targets.artwork.user', 'targets.artwork.user.profile', 'reactions']); // Notify original artwork owner (unless self-share) if ($artwork->user_id !== $user->id) { event(new ArtworkShared($post, $artwork, $user)); } return response()->json([ 'post' => $this->feedService->formatPost($post, $user->id), ], 201); } }