get('page_size') ?? 10; $approvalFlows = ApprovalFlow::query()->with(['createdBy'])->orderByDesc("id")->paginate($pageSize); 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_id", 0)) ->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(), 'object_id' => $limitObject ? $request->object_id : 0, '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']] = collect($node)->only(['name', 'approval_users', 'approval_mode', 'level'])->toArray(); } 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) || $node['approval_mode'] != $nodes[$node['level']]['approval_mode'] ) { $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 $this->noContent(); } else { $approvalFlow->name = $request->name; $approvalFlow->nodes = $nodes; $approvalFlow->save(); } //return new ApprovalFlowDetailResource($approvalFlow); return $this->noContent(); } 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(); } }