ContainerController.php 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  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("folder_id", 0)
  40. ->where("is_latest_version", 1)
  41. ->selectRaw("count(*) as cut, object_id")
  42. ->groupBy("object_id")
  43. ->pluck("cut", "object_id");
  44. $containers = $containers->map(function (Container $container) use ($foldsCount,$fileCount) {
  45. $container->itemCount =$foldsCount->get($container->id, 0)+$fileCount->get($container->id, 0);
  46. $container->type = 'container';
  47. $container->uniId = $container->type . '_' . $container->id;
  48. return $container;
  49. });
  50. return $this->success([
  51. 'data' => $containers
  52. ]);
  53. //return ContainerResource::collection($containers);
  54. }
  55. /**
  56. * Store a newly created resource in storage.
  57. */
  58. public function store(
  59. CreateOrUpdateRequest $request,
  60. ImageUrlService $imageUrlService,
  61. FileAssociationService $service,
  62. CustomFieldRepository $customFieldRepo
  63. )
  64. {
  65. $formData = [
  66. ...$request->all(),
  67. 'company_id' => Auth::user()->company_id,
  68. 'created_by' => Auth::id(),
  69. 'whitelist' => $request->whitelist ? sprintf(",%s,", implode(',', $request->whitelist)) : null,
  70. ];
  71. $service->check(
  72. $request->get("file_ids", []),
  73. FileObjectType::CONTAINER,
  74. $request->get("file_uuid"),
  75. );
  76. if ($request->has("naming_rule_id") && $request->get("naming_rule_id") > 0) {
  77. $keys = $customFieldRepo->keysByGroup($request->get("naming_rule_id"));
  78. $formData['naming_rules'] = $request->only($keys);
  79. }
  80. $container = new Container();
  81. $container->mergeFillable(['company_id']);
  82. $container->fill($formData);
  83. $container->save();
  84. ActionRepository::createByContainer($container, ObjectAction::CREATED);
  85. $service->association($container->id);
  86. $files = File::query()->where('object_id', $container->id)
  87. ->where('object_type', ActionObjectType::CONTAINER)
  88. ->where('source', 1)
  89. ->pluck("id")
  90. ->sort();
  91. $contentFormData = [
  92. 'description' => $imageUrlService->interceptImageUrl($request->description),
  93. 'container_id' => $container->id,
  94. 'created_by' => Auth::id(),
  95. 'name' => $request->name,
  96. 'files' => $files->implode(",") ?: null
  97. ];
  98. ContainerContent::query()->create($contentFormData);
  99. return $this->created();
  100. }
  101. /**
  102. * Display the specified resource.
  103. */
  104. public function show(string $id)
  105. {
  106. $container = Container::query()->allowed()
  107. ->when(\request("version") > 0, fn($query) => $query->where("version", ">=", \request("version")))
  108. ->findOrFail($id);
  109. return new ContainerDetailResource($container);
  110. }
  111. /**
  112. * Update the specified resource in storage.
  113. */
  114. public function update(
  115. CreateOrUpdateRequest $request,
  116. ImageUrlService $imageUrlService,
  117. CustomFieldRepository $customFieldRepo,
  118. string $id
  119. )
  120. {
  121. $container = Container::query()->allowed()->findOrFail($id);
  122. $formData = [
  123. ...$request->all(),
  124. 'whitelist' => $request->whitelist ? sprintf(",%s,", implode(',', $request->whitelist)) : null,
  125. 'description' => $imageUrlService->interceptImageUrl($request->description) ,
  126. ];
  127. if ($request->has("naming_rule_id") && $request->get("naming_rule_id") > 0) {
  128. $keys = $customFieldRepo->keysByGroup($request->get("naming_rule_id"));
  129. $formData['naming_rules'] = $request->only($keys);
  130. }
  131. $container->fill($formData);
  132. $changes = ModelChangeDetector::detector(ActionObjectType::CONTAINER, $container);
  133. $files = File::query()->where('object_id', $container->id)
  134. ->where('object_type', ActionObjectType::CONTAINER)
  135. ->where('source', 1)
  136. ->pluck("id")
  137. ->sort();
  138. $contentFormData = [
  139. 'description' => $imageUrlService->interceptImageUrl($request->description),
  140. 'name' => $request->name,
  141. 'files' => $files->implode(",") ?: null
  142. ];
  143. $containerContent = $container->content;
  144. $containerContent->fill($contentFormData);
  145. $contentChange = ModelChangeDetector::detector(ActionObjectType::CONTAINER_CONTENT, $containerContent);
  146. if ($contentChange) {
  147. $container->version++;
  148. $changes = array_merge($changes, $contentChange);
  149. ContainerContent::query()->create([
  150. ...$contentFormData,
  151. 'container_id' => $container->id,
  152. 'created_by' => Auth::id(),
  153. 'version' => $container->version,
  154. ]);
  155. }
  156. $container->save();
  157. ActionRepository::createByContainer($container, ObjectAction::EDITED, objectChanges: $changes);
  158. return $this->noContent();
  159. }
  160. /**
  161. * Remove the specified resource from storage.
  162. */
  163. public function destroy(string $id)
  164. {
  165. $container = Container::query()->allowed()->findOrFail($id);
  166. $container->delete();
  167. ActionRepository::createByContainer($container, ObjectAction::DELETED);
  168. return $this->noContent();
  169. }
  170. public function linkage(string $libraryId)
  171. {
  172. $items = Container::query()->allowed()->where("library_id", $libraryId)->get(['id', 'name'])->each(function ($items) {
  173. // 设置固定的type值
  174. $items->type = 'container';
  175. $items->uniId=$items->type.'_'.$items->id;
  176. });
  177. return $this->success([
  178. 'data' => $items
  179. ]);
  180. }
  181. }