ContainerController.php 6.3 KB

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