ReactionTallyController.php 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. <?php
  2. namespace App\Http\Controllers\V3;
  3. use App\Http\Controllers\Concerns\ResolvesCurrentUser;
  4. use App\Http\Controllers\Controller;
  5. use App\Http\Requests\V3\IndexReactionTallyRequest;
  6. use App\Http\Resources\V3\ReactionTallyResource;
  7. use App\Services\V3\ReactionService;
  8. /**
  9. * 某个 target 下各 type 的计数与「当前用户是否已操作」的摘要——公共只读。
  10. *
  11. * 取代 `GET /v2/like?view=count`。登录时额外富化 selected / id 两个字段,
  12. * 不登录也能拿到全局计数。
  13. *
  14. * 资源改名(v2 的 `like` → v3 的 `reactions`)是根目录 CLAUDE.md
  15. * 「已登记的改名例外」里的唯一一条,底层仍是 `likes` 表。
  16. */
  17. class ReactionTallyController extends Controller
  18. {
  19. use ResolvesCurrentUser;
  20. public function __construct(private readonly ReactionService $reactions) {}
  21. /**
  22. * 统计某个 target 下各 type 的计数
  23. *
  24. * 一次聚合查询出各 type 的 count;登录时再查一次当前用户的选择,补 selected / id。
  25. *
  26. * @unauthenticated
  27. *
  28. * @queryParam target_id string required target 的 uuid。Example: 5b4511c1-c99f-47e7-9798-97b9e5229e18
  29. */
  30. public function index(IndexReactionTallyRequest $request)
  31. {
  32. $items = $this->reactions->tally(
  33. $request->validated('target_id'),
  34. $this->currentUserUid($request),
  35. );
  36. // 非分页列表:手工给 meta,使响应形状与规格里的 {data, meta} 一致
  37. // FIXME: current_page / per_page / last_page 在不分页的聚合上是假值,
  38. // 只是为了套上生成器写死的 PaginationMeta,待定夺
  39. return ReactionTallyResource::collection($items)->additional(['meta' => [
  40. 'current_page' => 1,
  41. 'per_page' => count($items),
  42. 'total' => count($items),
  43. 'last_page' => 1,
  44. ]]);
  45. }
  46. }