ContainerController.php 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. <?php
  2. namespace App\Http\Controllers\API;
  3. use App\Http\Controllers\Controller;
  4. use App\Http\Requests\API\Container\CreateOrUpdateRequest;
  5. use App\Http\Resources\API\ContainerDetailResource;
  6. use App\Http\Resources\API\ContainerResource;
  7. use App\Models\Container;
  8. use App\Models\ContainerContent;
  9. use App\Models\Enums\ActionObjectType;
  10. use App\Models\Enums\FileObjectType;
  11. use App\Models\Enums\ObjectAction;
  12. use App\Models\File;
  13. use App\Models\Folder;
  14. use App\Repositories\ActionRepository;
  15. use App\Repositories\CustomFieldRepository;
  16. use App\Services\File\FileAssociationService;
  17. use App\Services\File\ImageUrlService;
  18. use App\Services\History\ModelChangeDetector;
  19. use Illuminate\Http\Request;
  20. use Illuminate\Support\Facades\Auth;
  21. class ContainerController extends Controller
  22. {
  23. /**
  24. * Display a listing of the resource.
  25. */
  26. public function index(Request $request)
  27. {
  28. $containers = Container::query()->filter($request->all())->paginate();
  29. $foldsCount = Folder::query()
  30. ->where('object_type','container')
  31. ->where('parent_id',0)
  32. ->whereIn("object_id", $containers->pluck("id")->toArray())
  33. ->selectRaw("count(*) as cut, object_id")
  34. ->groupBy("object_id")
  35. ->pluck("cut", "object_id");
  36. $fileCount = File::query()
  37. ->where('object_type','container')
  38. ->whereIn('object_id',$containers->pluck("id")->toArray())
  39. ->where("is_latest_version", 1)
  40. ->selectRaw("count(*) as cut, object_id")
  41. ->groupBy("object_id")
  42. ->pluck("cut", "object_id");
  43. $containers = $containers->map(function (Container $container) use ($foldsCount,$fileCount) {
  44. $container->itemCount =$foldsCount->get($container->id, 0)+$fileCount->get($container->id, 0);
  45. $container->type = 'container';
  46. $container->uniId = $container->type . '_' . $container->id;
  47. return $container;
  48. });
  49. return $this->success([
  50. 'data' => $containers
  51. ]);
  52. //return ContainerResource::collection($containers);
  53. }
  54. /**
  55. * Store a newly created resource in storage.
  56. */
  57. public function store(
  58. CreateOrUpdateRequest $request,
  59. ImageUrlService $imageUrlService,
  60. FileAssociationService $service,
  61. CustomFieldRepository $customFieldRepo
  62. )
  63. {
  64. $formData = [
  65. ...$request->all(),
  66. 'company_id' => Auth::user()->company_id,
  67. 'created_by' => Auth::id(),
  68. 'whitelist' => $request->whitelist ? sprintf(",%s,", implode(',', $request->whitelist)) : null,
  69. ];
  70. if ($request->has("naming_rule_id") && $request->get("naming_rule_id") > 0) {
  71. $keys = $customFieldRepo->keysByGroup($request->get("naming_rule_id"));
  72. $formData['naming_rules'] = $request->only($keys);
  73. }
  74. $container = new Container();
  75. $container->mergeFillable(['company_id']);
  76. $container->fill($formData);
  77. $container->save();
  78. ActionRepository::createByContainer($container, ObjectAction::CREATED);
  79. $service->association(
  80. $request->get("file_ids", []),
  81. $container->id,
  82. FileObjectType::CONTAINER
  83. );
  84. $files = File::query()->where('object_id', $container->id)
  85. ->where('object_type', ActionObjectType::CONTAINER)
  86. ->where('source', 1)
  87. ->pluck("id")
  88. ->sort();
  89. $contentFormData = [
  90. 'description' => $imageUrlService->interceptImageUrl($request->description),
  91. 'container_id' => $container->id,
  92. 'created_by' => Auth::id(),
  93. 'name' => $request->name,
  94. 'files' => $files->implode(",") ?: null
  95. ];
  96. ContainerContent::query()->create($contentFormData);
  97. return $this->created();
  98. }
  99. /**
  100. * Display the specified resource.
  101. */
  102. public function show(string $id)
  103. {
  104. $container = Container::query()->allowed()
  105. ->when(\request("version") > 0, fn($query) => $query->where("version", ">=", \request("version")))
  106. ->findOrFail($id);
  107. return new ContainerDetailResource($container);
  108. }
  109. /**
  110. * Update the specified resource in storage.
  111. */
  112. public function update(
  113. CreateOrUpdateRequest $request,
  114. ImageUrlService $imageUrlService,
  115. CustomFieldRepository $customFieldRepo,
  116. string $id
  117. )
  118. {
  119. $container = Container::query()->allowed()->findOrFail($id);
  120. $formData = [
  121. ...$request->all(),
  122. 'whitelist' => $request->whitelist ? sprintf(",%s,", implode(',', $request->whitelist)) : null,
  123. 'description' => $imageUrlService->interceptImageUrl($request->description) ,
  124. ];
  125. if ($request->has("naming_rule_id") && $request->get("naming_rule_id") > 0) {
  126. $keys = $customFieldRepo->keysByGroup($request->get("naming_rule_id"));
  127. $formData['naming_rules'] = $request->only($keys);
  128. }
  129. $container->fill($formData);
  130. $changes = ModelChangeDetector::detector(ActionObjectType::CONTAINER, $container);
  131. $files = File::query()->where('object_id', $container->id)
  132. ->where('object_type', ActionObjectType::CONTAINER)
  133. ->where('source', 1)
  134. ->pluck("id")
  135. ->sort();
  136. $contentFormData = [
  137. 'description' => $imageUrlService->interceptImageUrl($request->description),
  138. 'name' => $request->name,
  139. 'files' => $files->implode(",") ?: null
  140. ];
  141. $containerContent = $container->content;
  142. $containerContent->fill($contentFormData);
  143. $contentChange = ModelChangeDetector::detector(ActionObjectType::CONTAINER_CONTENT, $containerContent);
  144. if ($contentChange) {
  145. $container->version++;
  146. $changes = array_merge($changes, $contentChange);
  147. ContainerContent::query()->create([
  148. ...$contentFormData,
  149. 'container_id' => $container->id,
  150. 'created_by' => Auth::id(),
  151. 'version' => $container->version,
  152. ]);
  153. }
  154. $container->save();
  155. ActionRepository::createByContainer($container, ObjectAction::EDITED, objectChanges: $changes);
  156. return $this->noContent();
  157. }
  158. /**
  159. * Remove the specified resource from storage.
  160. */
  161. public function destroy(string $id)
  162. {
  163. $container = Container::query()->allowed()->findOrFail($id);
  164. $container->delete();
  165. ActionRepository::createByContainer($container, ObjectAction::DELETED);
  166. return $this->noContent();
  167. }
  168. public function linkage(string $libraryId)
  169. {
  170. $items = Container::query()->allowed()->where("library_id", $libraryId)->get(['id', 'name'])->each(function ($items) {
  171. // 设置固定的type值
  172. $items->type = 'container';
  173. $items->uniId=$items->type.'_'.$items->id;
  174. });
  175. return $this->success([
  176. 'data' => $items
  177. ]);
  178. }
  179. }