FreeSTAR-Status-Engine/classes/service.php

266 lines
8.0 KiB
PHP

<?php
/**
* Class for managing services
*/
class Service implements JsonSerializable
{
private $id;
private $name;
private $description;
private $group_name;
private $status;
/**
* Constructs service from its data.
* @param int $id service ID
* @param String $name service name
* @param String $descriotion service description for tooltip
* @param int $status current service status
*/
function __construct($id, $name, $description = null, $group_name = '', $status = 3)
{
//TODO: Maybe get data from ID?
$this->id = $id;
$this->name = $name;
$this->description = $description;
$this->group_name = $group_name;
$this->status = $status;
}
/**
* Returns status of this service
* @return int status
*/
public function get_status()
{
return $this->status;
}
/**
* Returns id of this service
* @return int id
*/
public function get_id()
{
return $this->id;
}
/**
* Returns name of this service
* @return String name
*/
public function get_name()
{
return $this->name;
}
/**
* Returns description of this service
* @return String description
*/
public function get_description()
{
return $this->description;
}
/**
* Processes submitted form and adds service unless problem is encountered,
* calling this is possible only for admin or higher rank. Also checks requirements
* for char limits.
* @return void
*/
public static function add()
{
global $user, $message;
if (strlen($_POST['service']) > 50) {
$message = _("Service name is too long! Character limit is 50");
return;
} else if (strlen(trim($_POST['service'])) == 0) {
$message = _("Please enter name!");
return;
}
if ($user->get_rank() <= 1) {
global $mysqli;
$name = htmlspecialchars($_POST['service']);
$description = htmlspecialchars($_POST['description']);
$group_id = $_POST['group_id'];
$stmt = $mysqli->prepare("INSERT INTO services ( name, description, group_id ) VALUES ( ?, ?, ? )");
$stmt->bind_param("ssi", $name, $description, $group_id);
$stmt->execute();
$stmt->get_result();
header("Location: " . WEB_URL . "/admin/?do=settings");
} else {
$message = _("You don't have the permission to do that!");
}
}
/**
* Processes submitted form and adds service unless problem is encountered,
* calling this is possible only for admin or higher rank. Also checks requirements
* for char limits.
* @return void
*/
public static function edit()
{
global $user, $message;
if (strlen($_POST['service']) > 50) {
$message = _("Service name is too long! Character limit is 50");
return;
} else if (strlen(trim($_POST['service'])) == 0) {
$message = _("Please enter name!");
return;
}
if ($user->get_rank() <= 1) {
global $mysqli;
$service_id = $_POST["id"];
$name = htmlspecialchars($_POST['service']);
$description = htmlspecialchars($_POST["description"]);
$group_id = $_POST["group_id"];
$stmt = $mysqli->prepare("UPDATE services SET name=?, description=?, group_id=? WHERE id = ?");
$stmt->bind_param("ssii", $name, $description, $group_id, $service_id);
$stmt->execute();
$stmt->get_result();
header("Location: " . WEB_URL . "/admin/?do=settings");
} else {
$message = _("You don't have the permission to do that!");
}
}
/**
* Deletes this service - first checks if user has permission to do that.
* @return void
*/
public static function delete()
{
global $user, $message;
if ($user->get_rank() <= 1) {
global $mysqli;
$id = $_GET['delete'];
$stmt = $mysqli->prepare("SELECT status_id as status, (SELECT count(*) FROM services_status as s WHERE s.status_id=status) as count FROM services_status WHERE service_id = ? GROUP BY status");
$stmt->bind_param("i", $id);
$stmt->execute();
$query = $stmt->get_result();
while ($res = $query->fetch_assoc()) {
if ($res['count'] == 1) {
Incident::delete($res['status']);
}
}
$stmt = $mysqli->prepare("DELETE FROM services WHERE id = ?");
$stmt->bind_param("i", $id);
$stmt->execute();
$query = $stmt->get_result();
$stmt = $mysqli->prepare("DELETE FROM services_status WHERE service_id = ?");
$stmt->bind_param("i", $id);
$stmt->execute();
$query = $stmt->get_result();
header("Location: " . WEB_URL . "/admin/?do=settings");
} else {
$message = _("You don't have the permission to do that!");
}
}
/**
* Renders current status for services from passed array of services.
* @param Service[] $array array of services
* @return void
*/
public static function current_status($array)
{
global $all, $some, $classes;
$statuses = array(0, 0, 0, 0);
$worst = 5;
foreach ($array as $service) {
if ($service->status < $worst) {
$worst = $service->get_status();
}
$statuses[$service->get_status()]++;
}
echo '<div id="status-big" class="alert-' . $classes[$worst] . '">';
if ($statuses[$worst] == count($array)) {
echo $all[$worst];
} else {
echo $some[$worst];
}
echo '</div>';
}
/**
* Renders this service.
* @param $boolGroup set to true if the groups name is to be rendered
* @return void
*/
public function render()
{
global $statuses;
global $classes;
static $arrCompletedGroups = array();
//static $boolClosed;
static $boolOpened;
// Check if previous ul has been opened, and if a empty/new group is being
// render_header, close the UL first.
if ($boolOpened) {
if (empty($this->group_name) || !in_array($this->group_name, $arrCompletedGroups)) {
echo '</ul>';
$boolOpened = false;
}
}
// If no group exist or group is new, start a new UL
if (!empty($this->group_name) && !in_array($this->group_name, $arrCompletedGroups)) {
echo '<ul class="list-group components mt-3">';
//echo '<ul class="platforms list-group mb-2">';
// Render the group status if it exists
echo '<li class="list-group-item list-group-item-' . $classes[$this->status] . ' group-name"><span><i class="fas fa-folder-open"></i></span>&nbsp;' . $this->group_name . '<div class="status text-' . $classes[$this->status] . ' float-end">' . _($statuses[$this->status]) . '</div></li>';
//echo '<li class="cist-group-item d-flex flex-row justify-content-between platform list-group-item-action py-0 expanded" role="button">' . $this->group_name .'<div class="status '. $classes[$this->status] .'"'. _($statuses[$this->status]).'</div></li>';
$arrCompletedGroups[] = $this->group_name;
$boolOpened = true;
}
if (empty($this->group_name)) {
echo '<ul class="list-group components">';
// echo '<ul class="platforms list-group mb-2">';
$boolFinish = true;
}
// Render the service status
echo '<div>';
echo '<li class="list-group-item sub-component"><strong>' . $this->name . '</strong>';
//echo '<li class="list-group-item d-flex flex-columns justify-content-between><span>+</span><h3 class="py-2 my-0 flex-fill expanded">' . $this->name . '</h3>';
if (!empty($this->description)) {
echo '<a class="desc-tool-tip" data-toggle="tooltip" data-placement="top" title="' . $this->description . '"> <span><i class="fas fa-question"></i></span></a>';
}
if ($this->status != -1) { ?><div class="float-end text-<?php echo $classes[$this->status]; ?>"><?php echo _($statuses[$this->status]); ?></div>
<?php
}
echo '</li>';
if (isset($boolFinish) && $boolFinish) {
echo '</ul>';
}
echo '</div>';
}
public function jsonSerialize()
{
global $statuses;
return [
"id" => $this->id,
"name" => $this->name,
"description" => $this->description,
"status" => $this->status,
"status_string" => $statuses[$this->status]
];
}
}