get("tab")) { 'wait_for_me' => $query->allowed(true), 'pr' => $query->where("created_by", Auth::id()), default => $query->allowed(), }; $approvals = $query->filter($request->all())->orderByDesc("created_at")->paginate(); return new ApprovalCollection($approvals); } /** * Store a newly created resource in storage. */ public function store(CreateOrUpdateRequest $request, StoreService $service) { $service->store(); return $this->created(); } /** * Display the specified resource. */ public function show(string $id) { $approval = Approval::query() ->where("id", $id) ->allowed() ->firstOrFail(); $approvalObjectType = ApprovalObjectType::from($approval->object_type); $object = $approvalObjectType ->modelBuilder() ->find($approval->object_id); $actions = Action::with(['createdBy'])->where([ 'object_type' => $approvalObjectType->actionObjectType(), 'object_id' => $object->id, 'additional_id' => $approval->id, ])->orderByDesc("created_at")->get(); return $this->success([ 'data' => [ 'id' => $approval->id, 'status' => $approval->status, 'object_type' => $approval->object_type, 'object_id' => $approval->object_id, 'object' => [ 'id' => $object->id, 'name' => $object[$approvalObjectType->nameField()], ], 'remark' => $approval->remark, 'node_level' => $approval->node_level, 'created_by' => new UserProfileResource($approval->createdBy), 'approval_flow' => new ApprovalFlowDetailResource($approval->approvalFlow), 'approval_logs' => ActionByApprovalLogResource::collection($actions), ] ]); } public function action(ActionRequest $request, string $id, ActionService $actionService) { $approval = Approval::query() ->allowed(true) ->whereIn("status", [ ObjectApprovalStatus::DOING->value, ]) ->find($id); throw_validation_if(! $approval, "No authority for approval"); $actionService->action($approval, $request->status, $request->get("comment")); return $this->noContent(); } /** * Update the specified resource in storage. */ public function update(CreateOrUpdateRequest $request, string $id) { $approval = Approval::query()->findOrFail($id); ApprovalObjectType::from($approval->object_type)->modelBuilderAllowed($approval->object_id)->findOrFail($approval->object_id); $approval->remark = $request->remark; $approval->save(); return $this->noContent(); } /** * Remove the specified resource from storage. */ public function cancel(Request $request) { $mode = $request->get("mode", "approval"); throw_validation_if(!$request->get("id"), "ID cannot be empty"); $where = match ($mode) { "approval" => ["id" => $request->id], "object_type" => ["object_type" => $request->object_type, "object_id" => $request->id], default => [], }; throw_validation_if(! $where, "Please enter valid parameters."); $approval = Approval::query() ->whereIn("status", [ ObjectApprovalStatus::DOING->value, ]) ->where($where) ->first(); throw_validation_if(! $approval, "The data does not exist or the operation is denied permission."); $object = ApprovalObjectType::from($approval->object_type)->modelBuilderAllowed($approval->object_id)->findOrFail($approval->object_id); $approval->status = ObjectApprovalStatus::CANCELED; $approval->save(); ActionRepository::createByApproval($approval, ObjectAction::APPROVED_CANCELED); $object->approval_status = ObjectApprovalStatus::WAIT; $object->save(); return $this->noContent(); } }