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
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),
|
|
];
|
|
}
|
|
}
|