|
@@ -0,0 +1,94 @@
|
|
|
+<?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);
|
|
|
+ }
|
|
|
+}
|