InviteController.php 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. <?php
  2. namespace App\Http\Controllers\V3;
  3. use App\Http\Controllers\Controller;
  4. use App\Http\Requests\V3\StoreInviteRequest;
  5. use App\Http\Resources\V3\InviteResource;
  6. use App\Services\V3\SignUpService;
  7. /**
  8. * 注册邀请。invite id 是 `POST /v3/users` 的注册凭据。
  9. *
  10. * - show 取代 `GET /v2/invite/{invite}`(`InviteController@show`),邀请注册页用。
  11. * - store 取代 v2「`GET /v2/email-certification/{id}` 取回验证码在前端比对」那一步:
  12. * 改成服务端比对验证码,通过后签发 invite。
  13. *
  14. * studio 发邀请(`POST /v2/invite`,要登录、要 studio 权限)是另一个契约,
  15. * 将来迁成嵌套资源 `studios/{studio}/invites`,不放在这里。
  16. * v2 那几条在 dashboard-v4 下线前原样保留,不要改动。
  17. */
  18. class InviteController extends Controller
  19. {
  20. public function __construct(private readonly SignUpService $signUp) {}
  21. /**
  22. * 用验证码换注册邀请
  23. *
  24. * 验证码正确则返回该邮箱的 invite(已有则复用,状态重置为未使用),验证码随即作废。
  25. * 验证码错误、过期或试错 5 次后返回 422(errors.code)。
  26. *
  27. * @unauthenticated
  28. *
  29. * @bodyParam email string required 收到验证码的邮箱
  30. * @bodyParam code string required 邮件里的 6 位验证码。Example: 123456
  31. *
  32. * @responseStatus 201 首次为该邮箱签发 invite。响应体与 200 同形;复用已有 invite 时是 200
  33. * @responseStatus 429 请求过于频繁
  34. */
  35. public function store(StoreInviteRequest $request): InviteResource
  36. {
  37. return InviteResource::make(
  38. $this->signUp->verifyCode($request->validated('email'), $request->validated('code'))
  39. );
  40. }
  41. /**
  42. * 查看一条可用的注册邀请
  43. *
  44. * 邀请注册页用它显示邮箱。不存在或已被使用都返回 404。
  45. *
  46. * @unauthenticated
  47. *
  48. * @urlParam invite string required 邀请邮件链接里的 uuid
  49. *
  50. * @responseStatus 404 邀请不存在或已被使用
  51. */
  52. public function show(string $invite): InviteResource
  53. {
  54. return InviteResource::make($this->signUp->findPendingInvite($invite));
  55. }
  56. }