6
0
Fork 0
jiqu-library-server/app/Endpoint/Api/Http/Controllers/ArticleController.php

129 lines
4.1 KiB
PHP

<?php
namespace App\Endpoint\Api\Http\Controllers;
use App\Endpoint\Api\Http\Resources\ArticleResource;
use App\Endpoint\Api\Http\Resources\ArticleSimpleResource;
use App\Exceptions\BizException;
use App\Helpers\Paginator as PaginatorHelper;
use App\Models\Article;
use App\Models\ArticleLikesLog;
use App\Models\ArticlePointsLog;
use App\Models\PointsLog;
use App\Services\PointsService;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
use Throwable;
class ArticleController extends Controller
{
/**
*
*
* @param \Illuminate\Http\Request $request
* @return void
*/
public function index(Request $request)
{
$cate = (string) $request->query('cate');
$key = (string) $request->query('key');
$categoryId = Arr::get([
'help'=> config('settings.article_help'),
'agreement'=> config('settings.article_agreement'),
'health'=> config('settings.article_health'),
], $cate);
$query = Article::query()->with(['likesInfo'=>function ($q) use ($request) {
return $q->where('user_id', $request->user()->id);
}])->where('is_show', 1);
if ($categoryId) {
$query->where('category_id', $categoryId);
}
if ($key) {
$query->where('title', 'like', '%'.$key.'%');
}
$query->orderBy('is_recommend', 'desc');
$query->orderBy('sort', 'desc');
$query->orderBy('created_at', 'desc');
$list = $query->simplePaginate(PaginatorHelper::resolvePerPage('per_page', 20, 50));
return ArticleSimpleResource::collection($list);
}
/**
* 文章详情
*
* @param [type] $id
* @return void
*/
public function show($id, Request $request)
{
$article = Article::with(['likesInfo'=>function ($q) use ($request) {
return $q->where('user_id', $request->user()->id);
}])->where('is_show', 1)->findOrFail($id);
return ArticleResource::make($article);
}
/**
* 文章点赞
*
* @param [type] $id
* @param Request $request
* @return void
*/
public function like($id, Request $request)
{
$article = Article::where('is_show', 1)->findOrFail($id);
if (ArticleLikesLog::where('user_id', $request->user()->id)->where('article_id', $article->id)->exists()) {
throw new BizException('您已点赞过这篇文章');
}
try {
DB::beginTransaction();
ArticleLikesLog::create([
'article_id' => $article->id,
'user_id' => $request->user()->id,
]);
$article->increment('likes');
DB::commit();
} catch (Throwable $th) {
DB::rollBack();
report($th);
throw new BizException('系统繁忙,请稍后再试');
}
return response()->noContent();
}
/**
* 阅读加积分接口
*
* @param [type] $id
* @return void
*/
public function read($id, Request $request, PointsService $pointsService)
{
$article = Article::where('is_show', 1)->findOrFail($id);
if ($article->points > 0) {
if (ArticlePointsLog::where('user_id', $request->user()->id)->whereDate('created_at', now())->exists()) {
throw new BizException('您今天已拿过积分了,请明天再来');
}
try {
DB::beginTransaction();
ArticlePointsLog::create([
'user_id' => $request->user()->id,
'article_id' => $article->id,
]);
$pointsService->sendPoints(PointsLog::TYPE_READ, $request->user(), $article->points, '阅读文章送积分');
DB::commit();
} catch (Throwable $th) {
DB::rollBack();
report($th);
throw new BizException('系统繁忙,请稍后再试');
}
}
return response()->json([
'points'=>$article->points,
]);
}
}