generated from liutk/owl-admin-base
85 lines
2.3 KiB
PHP
85 lines
2.3 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Api;
|
|
|
|
use App\Filters\MessageFilter;
|
|
use App\Http\Resources\MessageResource;
|
|
use App\Models\Message;
|
|
use App\Models\MessageReadingLog;
|
|
use Illuminate\Http\Request;
|
|
use Throwable;
|
|
|
|
class MessageController extends Controller
|
|
{
|
|
public function index(Request $request)
|
|
{
|
|
/** @var \App\Models\Employee */
|
|
$user = $request->user();
|
|
|
|
/** @var \Illuminate\Contracts\Pagination\Paginator */
|
|
$paginator = Message::filter($request->input(), MessageFilter::class)
|
|
->ofEmployee($user)
|
|
->withCount([
|
|
'readingLogs' => fn ($query) => $query->where('employee_id', $user->id),
|
|
])
|
|
->latest('id')
|
|
->paginate($request->query('per_page', 20));
|
|
|
|
$list = collect($paginator->items())->map(function (Message $message) {
|
|
return array_merge(
|
|
MessageResource::make($message)->resolve(),
|
|
['is_read' => $message->reading_logs_count],
|
|
);
|
|
});
|
|
|
|
// 分页
|
|
return [
|
|
'data' => $list,
|
|
'meta' => [
|
|
'total' => $paginator->total(),
|
|
],
|
|
];
|
|
}
|
|
|
|
public function show($id, Request $request): MessageResource
|
|
{
|
|
/** @var \App\Models\Employee */
|
|
$user = $request->user();
|
|
|
|
$message = Message::ofEmployee($user)->findOrFail($id);
|
|
|
|
$message->readingLogs()->firstOrCreate([
|
|
'employee_id' => $user->id,
|
|
]);
|
|
|
|
return MessageResource::make($message);
|
|
}
|
|
|
|
public function readAll(Request $request)
|
|
{
|
|
/** @var \App\Models\Employee */
|
|
$user = $request->user();
|
|
|
|
$messages = Message::ofEmployee($user)
|
|
->whereDoesntHave('readingLogs', fn ($query) => $query->where('employee_id', $user->id))
|
|
->get();
|
|
|
|
try {
|
|
$datetime = date('Y-m-d H:i:s');
|
|
|
|
MessageReadingLog::insert(
|
|
$messages->map(fn (Message $message) => [
|
|
'message_id' => $message->id,
|
|
'employee_id' => $user->id,
|
|
'created_at' => $datetime,
|
|
'updated_at' => $datetime,
|
|
])->all()
|
|
);
|
|
} catch (Throwable $e) {
|
|
report($e);
|
|
}
|
|
|
|
return response()->noContent();
|
|
}
|
|
}
|