ContainerController.php 5.9 KB

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