You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

82 lines
2.4 KiB

<?php
namespace App\Http\Controllers\Miniapp;
use App\Http\Controllers\Controller;
use App\Models\MiniappUser;
use App\Models\Paper;
use App\Support\ApiResponse;
use App\Support\Miniapp\MiniappPresenter;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class PaperController extends Controller
{
use ApiResponse;
public function index(Request $request): JsonResponse
{
/** @var MiniappUser $user */
$user = $request->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<string, mixed>
*/
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),
];
}
}