with(['createdBy'])->orderByDesc("id")->paginate(); return ApprovalFlowResource::collection($approvalFlows); } public function store(CreateOrUpdateRequest $request) { $nodes = $this->getApprovalNodes($request); $limitObject = $request->get("object_type") && $request->get("object_id") && in_array($request->get("type"), [ApprovalFlowType::TASK->value]); $exists = ApprovalFlow::query()->where("type", $request->type) ->when( $limitObject, fn ($query) => $query->where([ 'object_type' => $request->object_type, 'object_id' => $request->object_id, ]) ) ->count(); throw_validation_if($exists, "Please do not add repeatedly."); $approvalFlow = new ApprovalFlow(); $approvalFlow->mergeFillable([ 'company_id', 'type' ]); $approvalFlow->fill([ ...$request->all(), 'company_id' => Auth::user()->company_id, 'created_by' => Auth::id(), 'nodes' => $nodes, ]); $approvalFlow->save(); return $this->created(); } protected function getApprovalNodes(Request $request) { $nodes = []; foreach ($request->nodes as $node) { $userCount = User::query()->whereIn("id", $node['approval_users'])->count(); throw_validation_if($userCount != count($node['approval_users']), "The selected approver does not exist"); $nodes[$node['level']] = $node; } throw_validation_if(max(array_keys($nodes)) != count($nodes), "The level field is incorrect"); return $nodes; } public function update(CreateOrUpdateRequest $request, string $id) { $approvalFlow = ApprovalFlow::query()->findOrFail($id); $nodes = $this->getApprovalNodes($request); $nodeIsChange = false; if (count($nodes) != count($approvalFlow->nodes)) { $nodeIsChange = true; } else { foreach ($approvalFlow->nodes as $node) { $oldNodeUsers = $node['approval_users']; $nowNodeUsers = $nodes[$node['level']]['approval_users']; sort($oldNodeUsers); sort($nowNodeUsers); if (implode(',', $oldNodeUsers) != implode(',', $nowNodeUsers)) { $nodeIsChange = true; break; } } } if ($nodeIsChange) { $newApprovalFlow = new ApprovalFlow(); $newApprovalFlow->mergeFillable([ 'company_id', 'type', ]); $newApprovalFlow->fill([ 'name' => $request->name, 'type' => $approvalFlow->type, 'object_type' => $approvalFlow->object_type, 'object_id' => $approvalFlow->object_id, 'company_id' => Auth::user()->company_id, 'created_by' => Auth::id(), 'nodes' => $nodes, ]); $newApprovalFlow->save(); $approvalFlow->delete(); return new ApprovalFlowDetailResource($newApprovalFlow); } else { $approvalFlow->name = $request->name; $approvalFlow->nodes = $nodes; $approvalFlow->save(); } return new ApprovalFlowDetailResource($approvalFlow); } public function show(string $id) { $approvalFlow = ApprovalFlow::query()->findOrFail($id); return new ApprovalFlowDetailResource($approvalFlow); } public function destroy(string $id) { $approvalFlow = ApprovalFlow::query()->findOrFail($id); $approvalFlow->delete(); return $this->noContent(); } }