Files
domnitor/app/Models/NotificationGroup.php
Hosteroid 0d4a38aae8 Refactor admin/user isolation logic and model methods
Moved admin/user isolation checks and related methods from Domain and NotificationGroup models to User model for better separation of concerns. Replaced direct database queries in controllers and services with new model methods. Added methods for assigning unassigned domains/groups, searching domains, and clearing old notification logs. Updated views for improved UI consistency.
2025-10-20 17:25:02 +03:00

100 lines
2.8 KiB
PHP

<?php
namespace App\Models;
use Core\Model;
class NotificationGroup extends Model
{
protected static string $table = 'notification_groups';
/**
* Get User model instance
*/
private function getUserModel(): \App\Models\User
{
return new \App\Models\User();
}
/**
* Get all groups with channel count
*/
public function getAllWithChannelCount(?int $userId = null): array
{
$sql = "SELECT ng.*,
COUNT(DISTINCT nc.id) as channel_count,
COUNT(DISTINCT d.id) as domain_count
FROM notification_groups ng
LEFT JOIN notification_channels nc ON ng.id = nc.notification_group_id
LEFT JOIN domains d ON ng.id = d.notification_group_id";
if ($userId && !$this->getUserModel()->isAdmin($userId)) {
$sql .= " WHERE ng.user_id = ?";
$stmt = $this->db->prepare($sql);
$stmt->execute([$userId]);
} else {
$sql .= " GROUP BY ng.id ORDER BY ng.name ASC";
$stmt = $this->db->query($sql);
}
return $stmt->fetchAll();
}
/**
* Get group with channels and domains
*/
public function getWithDetails(int $id, ?int $userId = null): ?array
{
$group = $this->find($id);
if (!$group) {
return null;
}
// Check if user has access to this group
if ($userId && !$this->getUserModel()->isAdmin($userId) && $group['user_id'] != $userId) {
return null;
}
// Get channels
$channelModel = new NotificationChannel();
$group['channels'] = $channelModel->getByGroupId($id);
// Get domains (filtered by user if needed)
$domainModel = new Domain();
if ($userId && !$this->getUserModel()->isAdmin($userId)) {
$group['domains'] = $domainModel->where('notification_group_id', $id, $userId);
} else {
$group['domains'] = $domainModel->where('notification_group_id', $id);
}
return $group;
}
/**
* Delete group and handle relationships
*/
public function deleteWithRelations(int $id): bool
{
// The database CASCADE will handle channels
// But we need to set domains to NULL
$sql = "UPDATE domains SET notification_group_id = NULL WHERE notification_group_id = ?";
$stmt = $this->db->prepare($sql);
$stmt->execute([$id]);
return $this->delete($id);
}
/**
* Assign all notification groups without user_id to a specific user
*/
public function assignUnassignedGroupsToUser(int $userId): int
{
$stmt = $this->db->prepare("UPDATE notification_groups SET user_id = ? WHERE user_id IS NULL");
$stmt->execute([$userId]);
return $stmt->rowCount();
}
}