validated(); $targetType = (string) $validated['target_type']; $targetId = (int) $validated['target_id']; $userId = get_current_user_id(); if (!FollowService::isValidTargetType($targetType)) { return Response::error([], 422) ->message(__('That is not something this forum lets you follow.', 'bit-connect')); } $wantsToFollow = filter_var($validated['follow'], FILTER_VALIDATE_BOOLEAN); $ok = $wantsToFollow ? FollowService::follow($userId, $targetType, $targetId) : FollowService::unfollow($userId, $targetType, $targetId); if (!$ok) { return Response::error([], 500) ->message(__('That could not be saved. Please try again.', 'bit-connect')); } return Response::success(FollowService::stateFor($userId, $targetType, $targetId)); } /** * Whether the signed-in member follows one thing. * * A topic arrives with its follow state attached; an archive has no payload * of its own to carry one, so its Follow button asks here. Read, never * assumed: a guest is told "not following" without a query. */ public function state(GetFollowStateRequest $request) { $validated = $request->validated(); $targetType = (string) $validated['target_type']; if (!FollowService::isValidTargetType($targetType)) { return Response::error([], 422) ->message(__('That is not something this forum lets you follow.', 'bit-connect')); } return Response::success( FollowService::stateFor(get_current_user_id(), $targetType, (int) $validated['target_id']) ); } public function mine(GetFollowsRequest $request) { $validated = $request->validated(); $targetType = (string) ($validated['target_type'] ?? Follow::TARGET_TOPIC); if (!FollowService::isValidTargetType($targetType)) { return Response::error([], 422)->message('Unknown follow type: ' . $targetType); } return Response::success( FollowService::mine( get_current_user_id(), $targetType, (int) ($validated['page'] ?? 1), (int) ($validated['per_page'] ?? 20) ) ); } }