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

98 lines
2.9 KiB
PHP

<?php
namespace App\Endpoint\Api\Http\Controllers;
use App\Endpoint\Api\Http\Resources\MessageResource;
use App\Exceptions\BizException;
use App\Helpers\Paginator as PaginatorHelper;
use App\Models\Message;
use App\Models\MessageReadLog;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Throwable;
class MessageController extends Controller
{
public function index(Request $request)
{
$list = Message::userMessages($request->user())->with(['logs'=>function ($q) use ($request) {
return $q->where('user_id', '=', $request->user()->id);
}])->simplePaginate(PaginatorHelper::resolvePerPage('per_page', 20, 50));
return MessageResource::collection($list);
}
/**
* 确认消息
*
* @param Request $request
* @return void
*/
public function read($id, Request $request)
{
$message = Message::userMessages($request->user())->findOrFail($id);
if (MessageReadLog::where('message_id', $message->id)->exists()) {
throw new BizException('该消息已确认,无需重复操作');
}
MessageReadLog::create([
'user_id' => $request->user()->id,
'message_id' => $message->id,
]);
return response()->noContent();
}
/**
* 批量已读
* 只有系统消息才能批量已读
*
* @param Request $request
* @return void
*/
public function batchRead(Request $request)
{
$ids = Message::with('logs')->where('user_id', 0)->whereDoesntHave('logs', function ($q) use ($request) {
return $q->where('user_id', '=', $request->user()->id);
})->pluck('id')->toArray();
if (count($ids) > 0) {
try {
DB::beginTransaction();
MessageReadLog::insert(array_map(function ($value) use ($request) {
return [
'user_id' => $request->user()->id,
'message_id' => $value,
'created_at' => now(),
'updated_at' => now(),
];
}, $ids));
DB::commit();
} catch (Throwable $th) {
DB::rollBack();
report($th);
throw new BizException('操作失败,请稍后再试');
}
}
return response()->noContent();
}
/**
* 待读条数
*
* @param Request $request
* @return void
*/
public function waitReadNum(Request $request)
{
// $num = 0;
$num = Message::userMessages($request->user())->with('logs')
->whereDoesntHave('logs', function ($q) use ($request) {
return $q->where('user_id', '=', $request->user()->id);
})->count();
return response()->json([
'num' => $num,
]);
}
}