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 && $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) { $sql = "SELECT * FROM domains WHERE notification_group_id = ? AND user_id = ?"; $stmt = $this->db->prepare($sql); $stmt->execute([$id, $userId]); $group['domains'] = $stmt->fetchAll(); } 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(); } }