DiscussionReplyController.php 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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\IndexDiscussionReplyRequest;
  6. use App\Http\Requests\V3\StoreDiscussionReplyRequest;
  7. use App\Http\Resources\V3\DiscussionResource;
  8. use App\Models\Discussion;
  9. use App\Services\V3\AgentGrantService;
  10. use App\Services\V3\DiscussionService;
  11. /**
  12. * 话题下的回复。线程只有两层:回复不能再被回复。
  13. *
  14. * 取代 `GET /v2/discussion?view=answer` 与带 `parent` 的 `POST /v2/discussion`。
  15. */
  16. class DiscussionReplyController extends Controller
  17. {
  18. use ResolvesCurrentUser;
  19. public function __construct(
  20. private readonly DiscussionService $discussions,
  21. private readonly AgentGrantService $grants,
  22. ) {}
  23. /**
  24. * 列出话题的回复
  25. *
  26. * 按时间正序。删除了的话题(墓碑)下的回复照样可读。
  27. *
  28. * @unauthenticated
  29. *
  30. * @urlParam discussion string required 话题的 uuid
  31. *
  32. * @queryParam page integer 页码。Default: 1
  33. * @queryParam per_page integer 每页数量,最大 200。Default: 50
  34. */
  35. public function index(IndexDiscussionReplyRequest $request, Discussion $discussion)
  36. {
  37. return DiscussionResource::collection($this->discussions->listReplies(
  38. $discussion,
  39. $this->currentUserUid($request),
  40. $request->integer('per_page', 50),
  41. ));
  42. }
  43. /**
  44. * 回复话题
  45. *
  46. * 类型与挂靠对象继承话题。已关闭的话题不能回复(409),对一条回复再回复 422。
  47. * AI 代写同 `POST /v3/discussions`(`X-Agent-Grant` 请求头)。
  48. * 文章上的 qa 只有文章的编辑者能回答。默认发通知,`notify=false` 关闭。
  49. *
  50. * @responseStatus 201 回复成功
  51. * @responseStatus 403 当前用户不能回复这个话题
  52. * @responseStatus 409 话题已关闭
  53. *
  54. * @urlParam discussion string required 话题的 uuid
  55. *
  56. * @bodyParam content string required 正文(markdown)
  57. * @bodyParam notify boolean 是否发通知。Default: true
  58. */
  59. public function store(StoreDiscussionReplyRequest $request, Discussion $discussion)
  60. {
  61. return DiscussionResource::make($this->discussions->createReply(
  62. $discussion,
  63. $this->grants->actor(
  64. $this->currentUser($request)['user_uid'],
  65. $request->header(AgentGrantService::HEADER),
  66. ),
  67. $request->validated(),
  68. ));
  69. }
  70. }