Enhanced error messages for missing channel configuration fields in NotificationGroupController. Updated Discord and Slack webhook input handling to use distinct field names, improved form validation and required field logic in the edit group view, and added user guidance for webhook URLs.
211 lines
5.7 KiB
PHP
211 lines
5.7 KiB
PHP
<?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) {
|
|
$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}";
|
|
$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':
|
|
$webhookUrl = $data['discord_webhook_url'] ?? '';
|
|
if (empty($webhookUrl)) return null;
|
|
return ['webhook_url' => $webhookUrl];
|
|
|
|
case 'slack':
|
|
$webhookUrl = $data['slack_webhook_url'] ?? '';
|
|
if (empty($webhookUrl)) return null;
|
|
return ['webhook_url' => $webhookUrl];
|
|
|
|
default:
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
|