diff --git a/app/Http/Controllers/V1/User/KnowledgeController.php b/app/Http/Controllers/V1/User/KnowledgeController.php index 00f28b3..e3646c9 100644 --- a/app/Http/Controllers/V1/User/KnowledgeController.php +++ b/app/Http/Controllers/V1/User/KnowledgeController.php @@ -4,50 +4,58 @@ namespace App\Http\Controllers\V1\User; use App\Exceptions\ApiException; use App\Http\Controllers\Controller; +use App\Http\Resources\KnowledgeResource; use App\Models\Knowledge; use App\Models\User; +use App\Services\Plugin\HookManager; use App\Services\UserService; use App\Utils\Helper; use Illuminate\Http\Request; class KnowledgeController extends Controller { + private UserService $userService; + + public function __construct(UserService $userService) + { + $this->userService = $userService; + } + public function fetch(Request $request) { - if ($request->input('id')) { - $knowledge = Knowledge::where('id', $request->input('id')) - ->where('show', 1) - ->first(); - - if (!$knowledge) { - return $this->fail([500, __('Article does not exist')]); - } - - $knowledge = $knowledge->toArray(); - $user = User::find($request->user()->id); - $userService = new UserService(); - if (!$userService->isAvailable($user)) { - $this->formatAccessData($knowledge['body']); - } - $subscribeUrl = Helper::getSubscribeUrl($user['token']); - $knowledge['body'] = str_replace('{{siteName}}', admin_setting('app_name', 'XBoard'), $knowledge['body']); - $knowledge['body'] = str_replace('{{subscribeUrl}}', $subscribeUrl, $knowledge['body']); - $knowledge['body'] = str_replace('{{urlEncodeSubscribeUrl}}', urlencode($subscribeUrl), $knowledge['body']); - $knowledge['body'] = str_replace( - '{{safeBase64SubscribeUrl}}', - str_replace( - array('+', '/', '='), - array('-', '_', ''), - base64_encode($subscribeUrl) - ), - $knowledge['body'] - ); - return $this->success($knowledge); + $request->validate([ + 'id' => 'nullable|sometimes|integer|min:1', + 'language' => 'nullable|sometimes|string|max:10', + 'keyword' => 'nullable|sometimes|string|max:255', + ]); + + return $request->input('id') + ? $this->fetchSingle($request) + : $this->fetchList($request); + } + + private function fetchSingle(Request $request) + { + $knowledge = $this->buildKnowledgeQuery() + ->where('id', $request->input('id')) + ->first(); + + if (!$knowledge) { + return $this->fail([500, __('Article does not exist')]); } - $builder = Knowledge::select(['id', 'category', 'title', 'updated_at']) + + $knowledge = $knowledge->toArray(); + $knowledge = $this->processKnowledgeContent($knowledge, $request->user()); + + return $this->success(KnowledgeResource::make($knowledge)); + } + + private function fetchList(Request $request) + { + $builder = $this->buildKnowledgeQuery(['id', 'category', 'title', 'updated_at', 'body']) ->where('language', $request->input('language')) - ->where('show', 1) ->orderBy('sort', 'ASC'); + $keyword = $request->input('keyword'); if ($keyword) { $builder = $builder->where(function ($query) use ($keyword) { @@ -57,14 +65,86 @@ class KnowledgeController extends Controller } $knowledges = $builder->get() + ->map(function ($knowledge) use ($request) { + $knowledge = $knowledge->toArray(); + $knowledge = $this->processKnowledgeContent($knowledge, $request->user()); + return KnowledgeResource::make($knowledge); + }) ->groupBy('category'); + return $this->success($knowledges); } - private function formatAccessData(&$body) + private function buildKnowledgeQuery(array $select = ['*']) { - $pattern = '/(.*?)/s'; - $replacement = '