CollectionController.php 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Models\Collection;
  4. use Illuminate\Http\Request;
  5. use Illuminate\Support\Str;
  6. use Illuminate\Support\Facades\Log;
  7. use App\Http\Api\AuthApi;
  8. use App\Http\Api\StudioApi;
  9. use App\Http\Resources\CollectionResource;
  10. use App\Services\CollectionService;
  11. use Illuminate\Support\Facades\DB;
  12. class CollectionController extends Controller
  13. {
  14. public function __construct(protected CollectionService $service) {}
  15. public function index(Request $request)
  16. {
  17. $result = $this->service->buildIndexQuery($request);
  18. if (isset($result['error'])) {
  19. return $this->error($result['error'], $result['code'] ?? 200, $result['code'] ?? 200);
  20. }
  21. return $this->ok([
  22. 'rows' => CollectionResource::collection($result['data']),
  23. 'count' => $result['count'],
  24. ]);
  25. }
  26. public function showMyNumber(Request $request)
  27. {
  28. $result = $this->service->getMyNumber($request);
  29. if (isset($result['error'])) {
  30. return $this->error($result['error'], $result['code'], $result['code']);
  31. }
  32. return $this->ok($result['data']);
  33. }
  34. public function store(Request $request)
  35. {
  36. $user = AuthApi::current($request);
  37. if (!$user) {
  38. return $this->error(__('auth.failed'), 401, 401);
  39. }
  40. if ($user['user_uid'] !== StudioApi::getIdByName($request->get('studio'))) {
  41. return $this->error(__('auth.failed'), 403, 403);
  42. }
  43. if (Collection::where('title', $request->get('title'))->where('owner', $user['user_uid'])->exists()) {
  44. return $this->error(__('validation.exists'), 200, 200);
  45. }
  46. $newOne = new Collection;
  47. $newOne->id = app('snowflake')->id();
  48. $newOne->uid = Str::uuid();
  49. $newOne->title = $request->get('title');
  50. $newOne->lang = $request->get('lang');
  51. $newOne->article_list = '[]';
  52. $newOne->owner = $user['user_uid'];
  53. $newOne->owner_id = $user['user_id'];
  54. $newOne->editor_id = $user['user_id'];
  55. $newOne->create_time = time() * 1000;
  56. $newOne->modify_time = time() * 1000;
  57. $newOne->save();
  58. return $this->ok(new CollectionResource($newOne));
  59. }
  60. public function show(Request $request, $id)
  61. {
  62. $result = Collection::where('uid', $id)->first();
  63. if (!$result) {
  64. Log::warning("没有查询到数据 id={$id}");
  65. return $this->error("没有查询到数据 id={$id}");
  66. }
  67. if ($result->status < 30) {
  68. Log::info('私有文章,判断权限' . $id);
  69. $user = AuthApi::current($request);
  70. if (!$user) {
  71. Log::warning('未登录');
  72. return $this->error(__('auth.failed'), 403, 403);
  73. }
  74. if ($user['user_uid'] !== $result->owner) {
  75. Log::info($user['user_uid'] . '私有文章,判断权限' . $id);
  76. if (!$this->service->userCanRead($user['user_uid'], $result)) {
  77. Log::warning($user['user_uid'] . '没有读取权限');
  78. return $this->error(__('auth.failed'), 403, 403);
  79. }
  80. }
  81. }
  82. $result->fullArticleList = true;
  83. return $this->ok(new CollectionResource($result));
  84. }
  85. public function update(Request $request, string $id)
  86. {
  87. $collection = Collection::find($id);
  88. if (!$collection) {
  89. return $this->error('no recorder');
  90. }
  91. $user = AuthApi::current($request);
  92. if (!$user) {
  93. return $this->error(__('auth.failed'), 401, 401);
  94. }
  95. if (!$this->service->userCanEdit($user['user_uid'], $collection)) {
  96. return $this->error(__('auth.failed'), 403, 403);
  97. }
  98. $collection->title = $request->get('title');
  99. $collection->subtitle = $request->get('subtitle');
  100. $collection->summary = $request->get('summary');
  101. $collection->lang = $request->get('lang');
  102. $collection->status = $request->get('status');
  103. $collection->default_channel = $request->get('default_channel');
  104. $collection->modify_time = time() * 1000;
  105. if ($request->has('aritcle_list')) {
  106. $collection->article_list = json_encode($request->get('aritcle_list'));
  107. }
  108. $collection->save();
  109. return $this->ok(new CollectionResource($collection));
  110. }
  111. public function destroy(Request $request, string $id)
  112. {
  113. $user = AuthApi::current($request);
  114. if (!$user) {
  115. return $this->error(__('auth.failed'));
  116. }
  117. $collection = Collection::find($id);
  118. if ($user['user_uid'] !== $collection['owner']) {
  119. return $this->error(__('auth.failed'));
  120. }
  121. DB::transaction(function () use ($collection) {
  122. // TODO: 删除文集中的文章
  123. $collection->delete();
  124. });
  125. return $this->ok(true);
  126. }
  127. }