IndexProgressRequest.php 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. <?php
  2. namespace App\Http\Requests\V3;
  3. use Illuminate\Foundation\Http\FormRequest;
  4. use Illuminate\Validation\Rule;
  5. /**
  6. * `GET /v3/progress` 的入参。
  7. *
  8. * 原来有个 `view` 参数,但它只有 `channel` 一个合法值,传别的直接 422——
  9. * 那不是业务路径开关,是噪音,已去掉(硬规范第 1 条)。
  10. */
  11. class IndexProgressRequest extends FormRequest
  12. {
  13. /**
  14. * 排序可用的列。**必须白名单**:原来是 `'progress_chapters.'.$request->input('order')`
  15. * 直接拼进 orderBy,传个不存在的列名就是 QueryException → 500。
  16. *
  17. * @var list<string>
  18. */
  19. public const SORTABLE = [
  20. 'book', 'para', 'lang', 'progress', 'title',
  21. 'last_chapter_completed_at', 'completed_at', 'updated_at',
  22. ];
  23. /**
  24. * 公开的只读接口。
  25. */
  26. public function authorize(): bool
  27. {
  28. return true;
  29. }
  30. /**
  31. * @return array<string, array<int, mixed>>
  32. */
  33. public function rules(): array
  34. {
  35. return [
  36. // channel uid 列表,**下划线分隔**(不是逗号)——既有契约,不要改
  37. 'channels' => ['required', 'string'],
  38. 'level' => ['sometimes', 'integer', 'min:1'],
  39. 'lang' => ['sometimes', 'string', 'max:20'],
  40. 'book' => ['sometimes', 'integer', 'min:1'],
  41. 'order' => ['sometimes', 'string', Rule::in(self::SORTABLE)],
  42. 'dir' => ['sometimes', 'string', 'in:asc,desc'],
  43. 'page' => ['sometimes', 'integer', 'min:1'],
  44. 'per_page' => ['sometimes', 'integer', 'min:1', 'max:200'],
  45. ];
  46. }
  47. }