user(); $payload = MiniappPresenter::userPayload($user); if (! ($payload['can_see_papers'] ?? false)) { return $this->fail('无权访问论文库', 403); } $query = Paper::query()->withCount('teachers'); if ($kw = $request->query('keyword')) { $query->where(function ($q) use ($kw) { $q->where('title', 'like', "%{$kw}%") ->orWhere('authors', 'like', "%{$kw}%") ->orWhere('school_name', 'like', "%{$kw}%") ->orWhere('summary', 'like', "%{$kw}%"); }); } $paginator = $query ->orderByDesc('published_at') ->orderByDesc('id') ->paginate((int) $request->query('page_size', 20)) ->withQueryString(); $paginator->getCollection()->transform(fn (Paper $p) => $this->serializePaper($p)); return $this->paginated($paginator); } public function show(Request $request, int $paper): JsonResponse { /** @var MiniappUser $user */ $user = $request->user(); $payload = MiniappPresenter::userPayload($user); if (! ($payload['can_see_papers'] ?? false)) { return $this->fail('无权访问论文库', 403); } $model = Paper::query()->withCount('teachers')->findOrFail($paper); return $this->ok($this->serializePaper($model)); } /** * @return array */ protected function serializePaper(Paper $paper): array { return [ 'id' => $paper->id, 'title' => $paper->title, 'authors' => $paper->authors, 'school_name' => $paper->school_name, 'published_at' => $paper->published_at?->toDateString(), 'url' => $paper->url, 'summary' => $paper->summary, 'source_site' => $paper->source_site, 'teachers_count' => (int) ($paper->teachers_count ?? 0), ]; } }