2017-11-24 00:09:36 +01:00
< ? php
/**
* Class for creating and rendering an incident
*/
2018-04-13 21:31:03 +02:00
class Incident implements JsonSerializable
2017-11-24 00:09:36 +01:00
{
private $id ;
private $date ;
private $end_date ;
2018-04-13 22:38:10 +02:00
private $timestamp ;
private $end_timestamp ;
2017-11-24 00:09:36 +01:00
private $text ;
private $type ;
private $title ;
private $username ;
2018-01-07 20:39:10 +01:00
/**
* Constructs service from its data.
* @param array $data incident data
*/
2017-11-24 00:09:36 +01:00
function __construct ( $data )
{
2018-01-07 20:39:10 +01:00
//TODO: Maybe get data from id?
2017-11-24 00:09:36 +01:00
$this -> id = $data [ 'status_id' ];
2018-04-13 22:38:10 +02:00
$this -> timestamp = $data [ 'time' ];
$this -> end_timestamp = $data [ 'end_time' ];
2017-11-24 00:09:36 +01:00
$this -> date = new DateTime ( " @ " . $data [ 'time' ]);
$this -> date = $this -> date -> format ( 'Y-m-d H:i:sP' );
if ( $data [ 'end_time' ] > 0 ){
$this -> end_date = new DateTime ( " @ " . $data [ 'end_time' ]);
$this -> end_date = $this -> end_date -> format ( 'Y-m-d H:i:sP' );
}
$this -> type = $data [ 'type' ];
$this -> title = $data [ 'title' ];
$this -> text = $data [ 'text' ];
$this -> username = $data [ 'username' ];
}
2018-01-07 20:39:10 +01:00
/**
* Deletes incident by ID.
* @param int ID
*/
2017-11-24 00:09:36 +01:00
public static function delete ( $id ){
2018-01-13 00:16:38 +01:00
global $mysqli , $message , $user ;
if ( $user -> get_rank () > 1 )
{
$stmt = $mysqli -> prepare ( " SELECT count(*) as count FROM status WHERE id= ? AND user_id = ? " );
$stmt -> bind_param ( " ii " , $id , $_SESSION [ 'user' ]);
$stmt -> execute ();
$query = $stmt -> get_result ();
if ( ! $query -> fetch_assoc ()[ 'count' ])
{
$message = _ ( " You don't have permission to do that! " );
return ;
}
}
2017-11-24 00:09:36 +01:00
$stmt = $mysqli -> prepare ( " DELETE FROM services_status WHERE status_id = ? " );
$stmt -> bind_param ( " i " , $id );
$stmt -> execute ();
$query = $stmt -> get_result ();
$stmt = $mysqli -> prepare ( " DELETE FROM status WHERE id= ? " );
$stmt -> bind_param ( " i " , $id );
$stmt -> execute ();
$query = $stmt -> get_result ();
2018-01-12 21:35:31 +01:00
header ( " Location: " . WEB_URL . " /admin " );
2017-11-24 00:09:36 +01:00
}
2018-01-07 20:39:10 +01:00
/**
* Processes submitted form and adds incident unless problem is encountered,
2018-01-18 22:59:34 +01:00
* calling this is possible only for admin or higher rank. Also checks requirements
2018-01-07 20:39:10 +01:00
* for char limits.
* @return void
*/
2017-11-24 00:09:36 +01:00
public static function add ()
{
global $mysqli , $message ;
$user_id = $_SESSION [ 'user' ];
$type = $_POST [ 'type' ];
$title = $_POST [ 'title' ];
$text = $_POST [ 'text' ];
if ( strlen ( $title ) == 0 )
{
2017-12-31 00:41:58 +01:00
$message = _ ( " Please enter title " );
2017-11-24 00:09:36 +01:00
return ;
} else if ( strlen ( $title ) > 50 ){
2017-12-31 00:41:58 +01:00
$message = _ ( " Title too long! Character limit is 50 " );
2017-11-24 00:09:36 +01:00
return ;
}
if ( strlen ( $title ) == 0 )
{
2017-12-31 00:41:58 +01:00
$message = _ ( " Please enter text " );
2017-11-24 00:09:36 +01:00
return ;
}
if ( $type == 2 && ( ! strlen ( trim ( $_POST [ 'time' ])) || ! strlen ( trim ( $_POST [ 'end_time' ]))))
{
2017-12-31 00:41:58 +01:00
$message = _ ( " Please set start and end time! Use ISO 8601 format. " );
2017-11-24 00:09:36 +01:00
return ;
}
if ( empty ( $_POST [ 'services' ])){
2017-12-31 00:41:58 +01:00
$message = _ ( " Please select at least one service " );
2017-11-24 00:09:36 +01:00
}
else
{
if ( ! is_array ( $_POST [ 'services' ]))
{
$services = array ( $_POST [ 'services' ]);
}
else
{
$services = $_POST [ 'services' ];
}
2018-08-23 20:37:45 +02:00
if ( ! empty ( $_POST [ 'time' ]) && $type == 2 ){
$input_time = ( ! empty ( $_POST [ 'time_js' ]) ? $_POST [ 'time_js' ] : $_POST [ 'time' ]);
$input_end_time = ( ! empty ( $_POST [ 'end_time_js' ]) ? $_POST [ 'end_time_js' ] : $_POST [ 'end_time' ]);
2018-04-13 23:41:05 +02:00
$time = strtotime ( $input_time );
$end_time = strtotime ( $input_end_time );
2017-11-24 00:09:36 +01:00
if ( ! $time )
{
2017-12-31 00:41:58 +01:00
$message = _ ( " Start date format is not recognized. Please use ISO 8601 format. " );
2017-11-24 00:09:36 +01:00
return ;
}
if ( ! $end_time )
{
2017-12-31 00:41:58 +01:00
$message = _ ( " End date format is not recognized. Please use ISO 8601 format. " );
2017-11-24 00:09:36 +01:00
return ;
}
2018-08-23 20:37:45 +02:00
if ( $time >= $end_time )
{
$message = _ ( " End time is either the same or earlier than start time! " );
return ;
}
2017-11-24 00:09:36 +01:00
} else {
$time = time ();
$end_time = '' ;
}
2017-11-29 15:01:16 +01:00
$stmt = $mysqli -> prepare ( " INSERT INTO status VALUES (NULL,?, ?, ?, ?, ?, ?) " );
2017-11-24 00:09:36 +01:00
$stmt -> bind_param ( " issiii " , $type , $title , $text , $time , $end_time , $user_id );
$stmt -> execute ();
$query = $stmt -> get_result ();
$status_id = $mysqli -> insert_id ;
foreach ( $services as $service ) {
2017-11-29 15:01:16 +01:00
$stmt = $mysqli -> prepare ( " INSERT INTO services_status VALUES (NULL,?, ?) " );
2017-11-24 00:09:36 +01:00
$stmt -> bind_param ( " ii " , $service , $status_id );
$stmt -> execute ();
$query = $stmt -> get_result ();
}
2018-01-12 21:35:31 +01:00
header ( " Location: " . WEB_URL . " /admin " );
2017-11-24 00:09:36 +01:00
}
}
2018-01-07 20:39:10 +01:00
/**
* Renders incident
* @param Boolean $admin - decides whether admin controls should be rendered
* @return void
*/
2017-11-24 00:09:36 +01:00
public function render ( $admin = 0 ){
global $icons ;
2018-11-19 09:19:23 +01:00
global $classes , $user , $mysqli ;
2017-11-24 00:09:36 +01:00
$admin = $admin && (( $user -> get_rank () <= 1 ) || ( $user -> get_username () == $this -> username ));
2018-11-19 09:19:23 +01:00
// Create id->service_name array
$stmt = $mysqli -> prepare ( " SELECT services.id,services.name FROM services INNER JOIN services_status ON services.id = services_status.service_id WHERE services_status.status_id = ? " );
$stmt -> bind_param ( " i " , $this -> id );
$stmt -> execute ();
$query = $stmt -> get_result ();
$array = array ();
if ( $query -> num_rows ){
$timestamp = time ();
while ( $result = $query -> fetch_assoc ()) {
$array [ $result [ 'id' ]] = $result [ 'name' ];
}
}
2017-11-24 00:09:36 +01:00
?>
<article class="panel panel-<?php echo $classes[$this->type];?>">
<div class="panel-heading icon">
<i class="<?php echo $icons[$this->type];?>"></i>
</div>
<div class="panel-heading clearfix">
<h2 class="panel-title"><?php echo $this->title; ?></h2>
<?php if ($admin){
2018-01-12 22:38:19 +01:00
echo '<a href="'.WEB_URL.'/admin/?delete='.$this->id.'" class="pull-right delete"><i class="fa fa-trash"></i></a>';
2017-11-24 00:09:36 +01:00
}?>
<time class="pull-right timeago" datetime="<?php echo $this->date; ?>"><?php echo $this->date; ?></time>
</div>
<div class="panel-body">
<?php echo $this->text; ?>
</div>
2018-11-19 09:19:23 +01:00
<div class="panel-footer panel-info clearfix">
<small>
<?php
echo _("Impacted service(s): ");
foreach ( $array as $key => $value ) {
echo '<span class="label label-default">'.$value . '</span> ';
}
?>
</small>
</div>
2017-12-12 14:17:10 +01:00
<div class="panel-footer clearfix">
2017-12-31 00:41:58 +01:00
<small><?php echo _("Posted by");?>: <?php echo $this->username;
2017-11-24 00:09:36 +01:00
if (isset($this->end_date)){?>
2018-01-13 00:57:13 +01:00
<span class="pull-right"><?php echo strtotime($this->end_date)>time()?_("Ending"):_("Ended");?>: <time class="pull-right timeago" datetime="<?php echo $this->end_date; ?>"><?php echo $this->end_date; ?></time></span>
2018-01-12 21:35:31 +01:00
<?php } ?>
2017-11-24 00:09:36 +01:00
</small>
</div>
</article>
<?php
}
2018-04-13 21:31:03 +02:00
public function jsonSerialize() {
return [
"id" => $this->id,
2018-04-13 22:38:10 +02:00
"date" => $this->timestamp,
"end_date" => $this->end_timestamp,
2018-04-13 21:31:03 +02:00
"text" => $this->text,
"type" => $this->type,
"title" => $this->title,
"username" => $this->username
];
}
2017-11-24 00:09:36 +01:00
}