<?php namespace App\Http\Controllers\API; use App\Http\Controllers\Controller; use App\Http\Resources\API\NotificationResource; use App\Models\Enums\NotificationStatus; use App\Models\Notification; use App\Models\NotificationRecord; use Carbon\Carbon; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; class NotificationController extends Controller { /** * 用户通知列表 * * @param Request $request * @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection */ public function index(Request $request) { $notifications = Notification::query() ->filter($request->all()) ->join("notification_records", "notifications.id", "=", "notification_records.notification_id") ->where("notification_records.user_id", Auth::id()) ->selectRaw("notifications.*,notification_records.read_at") ->orderByDesc("created_at") ->paginate(); return NotificationResource::collection($notifications); } /** * 标记为已读 * * @param Request $request * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Response */ public function markAsRead(Request $request) { $ids = $request->get("ids"); if (! $ids) { return $this->badRequest("Data is empty"); } NotificationRecord::query() ->where("user_id", Auth::id()) ->whereIn("notification_id", $ids) ->whereNull("read_at") ->update([ 'read_at' => Carbon::now(), ]); return $this->noContent(); } /** * 未读消息 * * @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection */ public function unread() { $announcements = Notification::query() ->leftJoin("notification_records", "notifications.id", "=", "notification_records.notification_id") ->where("notification_records.user_id", Auth::id()) ->where("notifications.status", NotificationStatus::RELEASE) ->where("notifications.start_at", "<", Carbon::now()) ->where(fn($query) => $query->where("notifications.end_at", ">", Carbon::now())->orWhereNull("notifications.end_at")) ->whereNull("notification_records.id") ->selectRaw("notifications.id") ->get(); foreach ($announcements as $announcement) { NotificationRecord::query()->firstOrCreate([ 'notification_id' => $announcement->id, 'user_id' => Auth::id() ]); } $notifications = Notification::query() ->join("notification_records", "notifications.id", "=", "notification_records.notification_id") ->where("notification_records.user_id", Auth::id()) ->whereNull("notification_records.read_at") ->selectRaw("notifications.*,notification_records.read_at") ->orderByDesc("created_at") ->paginate(); return NotificationResource::collection($notifications); } }