2025-10-08 14:23:07 +03:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace App\Controllers;
|
|
|
|
|
|
|
|
|
|
use Core\Controller;
|
|
|
|
|
use App\Models\NotificationGroup;
|
|
|
|
|
use App\Models\NotificationChannel;
|
|
|
|
|
|
|
|
|
|
class NotificationGroupController extends Controller
|
|
|
|
|
{
|
|
|
|
|
private NotificationGroup $groupModel;
|
|
|
|
|
private NotificationChannel $channelModel;
|
|
|
|
|
|
|
|
|
|
public function __construct()
|
|
|
|
|
{
|
|
|
|
|
$this->groupModel = new NotificationGroup();
|
|
|
|
|
$this->channelModel = new NotificationChannel();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function index()
|
|
|
|
|
{
|
|
|
|
|
$groups = $this->groupModel->getAllWithChannelCount();
|
|
|
|
|
|
|
|
|
|
$this->view('groups/index', [
|
|
|
|
|
'groups' => $groups,
|
|
|
|
|
'title' => 'Notification Groups'
|
|
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function create()
|
|
|
|
|
{
|
|
|
|
|
$this->view('groups/create', [
|
|
|
|
|
'title' => 'Create Notification Group'
|
|
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function store()
|
|
|
|
|
{
|
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
|
|
|
|
|
$this->redirect('/groups/create');
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$name = trim($_POST['name'] ?? '');
|
|
|
|
|
$description = trim($_POST['description'] ?? '');
|
|
|
|
|
|
|
|
|
|
if (empty($name)) {
|
|
|
|
|
$_SESSION['error'] = 'Group name is required';
|
|
|
|
|
$this->redirect('/groups/create');
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$id = $this->groupModel->create([
|
|
|
|
|
'name' => $name,
|
|
|
|
|
'description' => $description
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
$_SESSION['success'] = "Group '$name' created successfully";
|
|
|
|
|
$this->redirect("/groups/edit?id=$id");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function edit()
|
|
|
|
|
{
|
|
|
|
|
$id = $_GET['id'] ?? 0;
|
|
|
|
|
$group = $this->groupModel->getWithDetails($id);
|
|
|
|
|
|
|
|
|
|
if (!$group) {
|
|
|
|
|
$_SESSION['error'] = 'Group not found';
|
|
|
|
|
$this->redirect('/groups');
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$this->view('groups/edit', [
|
|
|
|
|
'group' => $group,
|
|
|
|
|
'title' => 'Edit Group: ' . $group['name']
|
|
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function update()
|
|
|
|
|
{
|
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
|
|
|
|
|
$this->redirect('/groups');
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$id = (int)$_POST['id'];
|
|
|
|
|
$name = trim($_POST['name'] ?? '');
|
|
|
|
|
$description = trim($_POST['description'] ?? '');
|
|
|
|
|
|
|
|
|
|
if (empty($name)) {
|
|
|
|
|
$_SESSION['error'] = 'Group name is required';
|
|
|
|
|
$this->redirect("/groups/edit?id=$id");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$this->groupModel->update($id, [
|
|
|
|
|
'name' => $name,
|
|
|
|
|
'description' => $description
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
$_SESSION['success'] = 'Group updated successfully';
|
|
|
|
|
$this->redirect("/groups/edit?id=$id");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function delete()
|
|
|
|
|
{
|
|
|
|
|
$id = $_GET['id'] ?? 0;
|
|
|
|
|
$group = $this->groupModel->find($id);
|
|
|
|
|
|
|
|
|
|
if (!$group) {
|
|
|
|
|
$_SESSION['error'] = 'Group not found';
|
|
|
|
|
$this->redirect('/groups');
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$this->groupModel->deleteWithRelations($id);
|
|
|
|
|
$_SESSION['success'] = 'Group deleted successfully';
|
|
|
|
|
$this->redirect('/groups');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function addChannel()
|
|
|
|
|
{
|
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
|
|
|
|
|
$this->redirect('/groups');
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$groupId = (int)$_POST['group_id'];
|
|
|
|
|
$channelType = $_POST['channel_type'] ?? '';
|
|
|
|
|
|
|
|
|
|
$config = $this->buildChannelConfig($channelType, $_POST);
|
|
|
|
|
|
|
|
|
|
if (!$config) {
|
2025-10-09 16:38:52 +03:00
|
|
|
$missingField = '';
|
|
|
|
|
switch ($channelType) {
|
|
|
|
|
case 'email':
|
|
|
|
|
$missingField = 'email address';
|
|
|
|
|
break;
|
|
|
|
|
case 'telegram':
|
|
|
|
|
$missingField = empty($_POST['bot_token']) ? 'bot token' : 'chat ID';
|
|
|
|
|
break;
|
|
|
|
|
case 'discord':
|
|
|
|
|
case 'slack':
|
|
|
|
|
$missingField = 'webhook URL';
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$_SESSION['error'] = "Invalid channel configuration: Missing {$missingField}";
|
2025-10-08 14:23:07 +03:00
|
|
|
$this->redirect("/groups/edit?id=$groupId");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$this->channelModel->createChannel($groupId, $channelType, $config);
|
|
|
|
|
|
|
|
|
|
$_SESSION['success'] = 'Channel added successfully';
|
|
|
|
|
$this->redirect("/groups/edit?id=$groupId");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function deleteChannel()
|
|
|
|
|
{
|
|
|
|
|
$id = $_GET['id'] ?? 0;
|
|
|
|
|
$groupId = $_GET['group_id'] ?? 0;
|
|
|
|
|
|
|
|
|
|
$this->channelModel->delete($id);
|
|
|
|
|
|
|
|
|
|
$_SESSION['success'] = 'Channel deleted successfully';
|
|
|
|
|
$this->redirect("/groups/edit?id=$groupId");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function toggleChannel()
|
|
|
|
|
{
|
|
|
|
|
$id = $_GET['id'] ?? 0;
|
|
|
|
|
$groupId = $_GET['group_id'] ?? 0;
|
|
|
|
|
|
|
|
|
|
$this->channelModel->toggleActive($id);
|
|
|
|
|
|
|
|
|
|
$_SESSION['success'] = 'Channel status updated';
|
|
|
|
|
$this->redirect("/groups/edit?id=$groupId");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private function buildChannelConfig(string $type, array $data): ?array
|
|
|
|
|
{
|
|
|
|
|
switch ($type) {
|
|
|
|
|
case 'email':
|
|
|
|
|
if (empty($data['email'])) return null;
|
|
|
|
|
return ['email' => $data['email']];
|
|
|
|
|
|
|
|
|
|
case 'telegram':
|
|
|
|
|
if (empty($data['bot_token']) || empty($data['chat_id'])) return null;
|
|
|
|
|
return [
|
|
|
|
|
'bot_token' => $data['bot_token'],
|
|
|
|
|
'chat_id' => $data['chat_id']
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
case 'discord':
|
2025-10-09 16:38:52 +03:00
|
|
|
$webhookUrl = $data['discord_webhook_url'] ?? '';
|
|
|
|
|
if (empty($webhookUrl)) return null;
|
|
|
|
|
return ['webhook_url' => $webhookUrl];
|
2025-10-08 14:23:07 +03:00
|
|
|
|
|
|
|
|
case 'slack':
|
2025-10-09 16:38:52 +03:00
|
|
|
$webhookUrl = $data['slack_webhook_url'] ?? '';
|
|
|
|
|
if (empty($webhookUrl)) return null;
|
|
|
|
|
return ['webhook_url' => $webhookUrl];
|
2025-10-08 14:23:07 +03:00
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|