DomainBlocksController.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <?php
  2. namespace App\Http\Controllers\Api\V1\Admin;
  3. use Illuminate\Http\Request;
  4. use Illuminate\Validation\Rule;
  5. use App\Http\Controllers\Api\ApiController;
  6. use App\Instance;
  7. use App\Services\InstanceService;
  8. use App\Http\Resources\MastoApi\Admin\DomainBlockResource;
  9. class DomainBlocksController extends ApiController {
  10. public function index(Request $request) {
  11. $this->validate($request, [
  12. 'limit' => 'sometimes|integer|max:100|min:1',
  13. ]);
  14. $limit = $request->input('limit', 100);
  15. $res = Instance::moderated()
  16. ->orderBy('id')
  17. ->cursorPaginate($limit)
  18. ->withQueryString();
  19. return $this->json(DomainBlockResource::collection($res), [
  20. 'Link' => $this->linksForCollection($res)
  21. ]);
  22. }
  23. public function show(Request $request, $id) {
  24. $res = Instance::moderated()
  25. ->findOrFail($id);
  26. return $this->json(new DomainBlockResource($res));
  27. }
  28. public function create(Request $request) {
  29. $this->validate($request, [
  30. 'domain' => 'required|string|min:1|max:120',
  31. 'severity' => [
  32. 'sometimes',
  33. Rule::in(['noop', 'silence', 'suspend'])
  34. ],
  35. 'reject_media' => 'sometimes|required|boolean',
  36. 'reject_reports' => 'sometimes|required|boolean',
  37. 'private_comment' => 'sometimes|string|min:1|max:1000',
  38. 'public_comment' => 'sometimes|string|min:1|max:1000',
  39. 'obfuscate' => 'sometimes|required|boolean'
  40. ]);
  41. $domain = $request->input('domain');
  42. $severity = $request->input('severity');
  43. $private_comment = $request->input('private_comment');
  44. abort_if(!strpos($domain, '.'), 400, 'Invalid domain');
  45. abort_if(!filter_var($domain, FILTER_VALIDATE_DOMAIN), 400, 'Invalid domain');
  46. $existing = Instance::moderated()->whereDomain($domain)->first();
  47. if ($existing) {
  48. return $this->json([
  49. 'error' => 'A domain block already exists for this domain',
  50. 'existing_domain_block' => new DomainBlockResource($existing)
  51. ], [], 422);
  52. }
  53. $domain_block = Instance::updateOrCreate(
  54. [ 'domain' => $domain ],
  55. [ 'banned' => $severity === 'suspend', 'unlisted' => $severity === 'silence', 'notes' => [$private_comment]]
  56. );
  57. InstanceService::refresh();
  58. return $this->json(new DomainBlockResource($domain_block));
  59. }
  60. public function update(Request $request, $id) {
  61. $this->validate($request, [
  62. 'severity' => [
  63. 'sometimes',
  64. Rule::in(['noop', 'silence', 'suspend'])
  65. ],
  66. 'reject_media' => 'sometimes|required|boolean',
  67. 'reject_reports' => 'sometimes|required|boolean',
  68. 'private_comment' => 'sometimes|string|min:1|max:1000',
  69. 'public_comment' => 'sometimes|string|min:1|max:1000',
  70. 'obfuscate' => 'sometimes|required|boolean'
  71. ]);
  72. $severity = $request->input('severity');
  73. $private_comment = $request->input('private_comment');
  74. $instance = Instance::moderated()->findOrFail($id);
  75. $instance->banned = $severity === 'suspend';
  76. $instance->unlisted = $severity === 'silence';
  77. $instance->notes = [$private_comment];
  78. $instance->save();
  79. InstanceService::refresh();
  80. return $this->json(new DomainBlockResource($instance));
  81. }
  82. public function delete(Request $request, $id) {
  83. $instance = Instance::moderated()->findOrFail($id);
  84. $instance->banned = false;
  85. $instance->unlisted = false;
  86. $instance->save();
  87. InstanceService::refresh();
  88. return $this->json([], [], 200);
  89. }
  90. }