feat: Add notification services for Email, Telegram, and WhatsApp
- Implement EmailNotifier for sending batch and test notifications via email. - Implement TelegramNotifier for sending batch and test notifications via Telegram. - Implement WahaNotifier for sending batch and test notifications via WhatsApp using WAHA API. - Create migration for client_categories table and update clients table to include category_id. - Create migration for notification_settings table to manage notification configurations. - Add ClientCategorySeeder to populate default client categories. - Create manifest.json for PWA support. - Implement service worker (sw.js) for caching static assets and offline support. - Add edit event view for modifying scheduled events. - Create search results view for displaying search queries. - Develop notification settings view for configuring notification channels and triggers.
This commit is contained in:
43
app/Services/Notifications/EmailNotifier.php
Normal file
43
app/Services/Notifications/EmailNotifier.php
Normal file
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Services\Notifications;
|
||||
|
||||
use App\Models\NotificationSetting;
|
||||
use Illuminate\Support\Facades\Mail;
|
||||
|
||||
class EmailNotifier
|
||||
{
|
||||
public function sendBatch(NotificationSetting $setting, array $messages): void
|
||||
{
|
||||
$toEmail = $setting->config['to_email'] ?? null;
|
||||
|
||||
if (! $toEmail) {
|
||||
throw new \RuntimeException('Email to_email address is required.');
|
||||
}
|
||||
|
||||
$combined = implode("\n\n---\n\n", $messages);
|
||||
|
||||
Mail::raw($combined, function ($mail) use ($toEmail, $setting): void {
|
||||
$mail->to($toEmail)
|
||||
->subject("🐱 KOL Manager — {$setting->name} Notifications");
|
||||
});
|
||||
}
|
||||
|
||||
public function sendTest(NotificationSetting $setting): void
|
||||
{
|
||||
$toEmail = $setting->config['to_email'] ?? null;
|
||||
|
||||
if (! $toEmail) {
|
||||
throw new \RuntimeException('Email to_email address is required.');
|
||||
}
|
||||
|
||||
Mail::raw(
|
||||
"🐱 KOL Manager — Test Notification\n\nYour Email channel is configured correctly! 🎉",
|
||||
function ($mail) use ($toEmail): void {
|
||||
$mail->to($toEmail)->subject('🐱 KOL Manager — Test Notification');
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
50
app/Services/Notifications/TelegramNotifier.php
Normal file
50
app/Services/Notifications/TelegramNotifier.php
Normal file
@@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Services\Notifications;
|
||||
|
||||
use App\Models\NotificationSetting;
|
||||
use Illuminate\Support\Facades\Http;
|
||||
|
||||
class TelegramNotifier
|
||||
{
|
||||
public function sendBatch(NotificationSetting $setting, array $messages): void
|
||||
{
|
||||
foreach ($messages as $message) {
|
||||
$this->send($setting, $message);
|
||||
}
|
||||
}
|
||||
|
||||
public function sendTest(NotificationSetting $setting): void
|
||||
{
|
||||
$this->send(
|
||||
$setting,
|
||||
"🐱 *KOL Manager — Test Notification*\n\nYour Telegram channel is configured correctly! 🎉"
|
||||
);
|
||||
}
|
||||
|
||||
private function send(NotificationSetting $setting, string $text): void
|
||||
{
|
||||
$config = $setting->config ?? [];
|
||||
$botToken = $config['bot_token'] ?? null;
|
||||
$chatId = $config['chat_id'] ?? null;
|
||||
|
||||
if (! $botToken || ! $chatId) {
|
||||
throw new \RuntimeException('Telegram bot_token and chat_id are required.');
|
||||
}
|
||||
|
||||
$response = Http::timeout(10)->post(
|
||||
"https://api.telegram.org/bot{$botToken}/sendMessage",
|
||||
[
|
||||
'chat_id' => $chatId,
|
||||
'text' => $text,
|
||||
'parse_mode' => 'Markdown',
|
||||
]
|
||||
);
|
||||
|
||||
if (! $response->successful()) {
|
||||
throw new \RuntimeException('Telegram API error: ' . $response->body());
|
||||
}
|
||||
}
|
||||
}
|
||||
55
app/Services/Notifications/WahaNotifier.php
Normal file
55
app/Services/Notifications/WahaNotifier.php
Normal file
@@ -0,0 +1,55 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Services\Notifications;
|
||||
|
||||
use App\Models\NotificationSetting;
|
||||
use Illuminate\Support\Facades\Http;
|
||||
|
||||
/**
|
||||
* WAHA (WhatsApp HTTP API) — self-hosted WhatsApp bridge.
|
||||
* Docs: https://waha.devlike.pro/docs/how-to/send-messages/
|
||||
*/
|
||||
class WahaNotifier
|
||||
{
|
||||
public function sendBatch(NotificationSetting $setting, array $messages): void
|
||||
{
|
||||
foreach ($messages as $message) {
|
||||
$this->send($setting, $message);
|
||||
}
|
||||
}
|
||||
|
||||
public function sendTest(NotificationSetting $setting): void
|
||||
{
|
||||
$this->send(
|
||||
$setting,
|
||||
"🐱 *KOL Manager — Test Notification*\n\nYour WhatsApp channel is configured correctly! 🎉"
|
||||
);
|
||||
}
|
||||
|
||||
private function send(NotificationSetting $setting, string $text): void
|
||||
{
|
||||
$config = $setting->config ?? [];
|
||||
$url = rtrim($config['waha_url'] ?? '', '/');
|
||||
$session = $config['waha_session'] ?? 'default';
|
||||
$phone = $config['phone'] ?? null;
|
||||
|
||||
if (! $url || ! $phone) {
|
||||
throw new \RuntimeException('WAHA waha_url and phone are required.');
|
||||
}
|
||||
|
||||
// Normalise phone: strip non-digits, ensure no leading +
|
||||
$chatId = preg_replace('/[^0-9]/', '', $phone) . '@c.us';
|
||||
|
||||
$response = Http::timeout(15)->post("{$url}/api/sendText", [
|
||||
'session' => $session,
|
||||
'chatId' => $chatId,
|
||||
'text' => $text,
|
||||
]);
|
||||
|
||||
if (! $response->successful()) {
|
||||
throw new \RuntimeException('WAHA API error: ' . $response->body());
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user