03f8caf3e9
後端 - 新增 6 個 Notification class(預約建立/確認/拒絕/取消/完成、收到評價),database + mail 雙 channel - 新增 NotificationController(list / unread-count / markRead / markAllRead / destroy) - 整合通知觸發至 MemberBookingController、ProviderBookingController、CompleteFinishedBookings、ReviewController - 新增 notifications / jobs / failed_jobs migration - Docker Compose 加入 queue-worker、mailpit service - DivingOffer 補上 provider() 關聯 前端 - 新增 notificationStore(Polling 30s/60s 自適應 + Page Visibility API) - 新增 NotificationBell(未讀 Badge)、NotificationDrawer(側邊通知中心) - main.js:auth store init 前置於 router.use(),修正 beforeEach guard 時序問題 - notificationAxios:依路徑動態選擇 member/coach token - NotificationDrawer:改用 new URL().pathname 提取 action_url 路徑 OpenSpec - 歸檔 notification-system change - 同步 notification-core / notification-email / notification-triggers specs 至主規格 - 更新 booking-lifecycle / review-lifecycle spec(補充通知觸發 requirement) Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
54 lines
1.8 KiB
PHP
54 lines
1.8 KiB
PHP
<?php
|
|
|
|
namespace App\Notifications;
|
|
|
|
use App\Models\Booking;
|
|
use Illuminate\Bus\Queueable;
|
|
use Illuminate\Contracts\Queue\ShouldQueue;
|
|
use Illuminate\Notifications\Messages\MailMessage;
|
|
use Illuminate\Notifications\Notification;
|
|
|
|
class BookingRejectedNotification extends Notification implements ShouldQueue
|
|
{
|
|
use Queueable;
|
|
|
|
public int $tries = 3;
|
|
|
|
public function __construct(public readonly Booking $booking) {}
|
|
|
|
public function via(object $notifiable): array
|
|
{
|
|
return ['database', 'mail'];
|
|
}
|
|
|
|
public function toArray(object $notifiable): array
|
|
{
|
|
$offer = $this->booking->schedule->divingOffer;
|
|
$date = $this->booking->schedule->scheduled_date->toDateString();
|
|
|
|
return [
|
|
'type' => 'booking_rejected',
|
|
'title' => '預約申請未通過',
|
|
'body' => "你的《{$offer->title}》預約申請(時段:{$date})未通過,請選擇其他時段",
|
|
'action_url' => config('app.frontend_url') . '/my-bookings',
|
|
'related_id' => $this->booking->id,
|
|
'related_type' => 'booking',
|
|
];
|
|
}
|
|
|
|
public function toMail(object $notifiable): MailMessage
|
|
{
|
|
$offer = $this->booking->schedule->divingOffer;
|
|
$date = $this->booking->schedule->scheduled_date->toDateString();
|
|
$url = config('app.frontend_url') . '/courses';
|
|
|
|
return (new MailMessage)
|
|
->subject('你的預約申請未通過 — CFDivePlatform')
|
|
->greeting('通知')
|
|
->line("很抱歉,你的《{$offer->title}》預約申請(時段:{$date})未通過審核。")
|
|
->action('瀏覽其他課程', $url)
|
|
->line('如有疑問,請聯繫課程教練。')
|
|
->salutation('CFDivePlatform 團隊');
|
|
}
|
|
}
|