store-manage/app/Http/Controllers/Api/MessageController.php

86 lines
2.4 KiB
PHP

<?php
namespace App\Http\Controllers\Api;
use App\Filters\MessageFilter;
use App\Http\Controllers\Api\Controller;
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();
}
}