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-11-21 10:50:21 +01:00
private $service_id ;
private $service_name ;
2017-11-24 00:09:36 +01:00
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-11-21 10:50:21 +01:00
$this -> service_id = $data [ 'service_id' ];
$this -> service_name = $data [ 'service_name' ];
2017-11-24 00:09:36 +01:00
}
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-06-07 11:20:53 +02:00
$query = $mysqli -> query ( " SELECT * FROM services_subscriber WHERE serviceIDFK= " . $service );
while ( $subscriber = $query -> fetch_assoc ()){
2018-06-07 11:29:28 +02:00
$subscriberQuery = $mysqli -> query ( " SELECT * FROM subscribers WHERE subscriberID= " . $subscriber [ 'subscriberIDFK' ]);
2018-06-07 11:20:53 +02:00
while ( $subscriberData = $subscriberQuery -> fetch_assoc ()){
$telegramID = $subscriberData [ 'telegramID' ];
$firstname = $subscriberData [ 'firstname' ];
$lastname = $subscriberData [ 'lastname' ];
$tg_message = urlencode ( 'Hi ' . $firstname . chr ( 10 ) . 'There is a status update on a service that you have subscribed. <a href="' . WEB_URL . '">View online</a>' );
$response = json_decode ( file_get_contents ( " https://api.telegram.org/bot " . TG_BOT_API_TOKEN . " /sendMessage?chat_id= " . $telegramID . " &parse_mode=HTML&text= " . $tg_message ));
}
2017-11-24 00:09:36 +01:00
}
2018-06-07 11:29:28 +02:00
header ( " Location: " . WEB_URL . " /admin " );
2017-11-24 00:09:36 +01:00
}
}
2018-06-07 11:29:28 +02: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-21 10:50:21 +01:00
global $classes , $user ;
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
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-21 10:50:21 +01:00
< div class = " panel-footer clearfix " >
2018-11-19 09:19:23 +01:00
< small >
2018-11-21 10:50:21 +01:00
< ? php echo _ ( " Impacted service(s): " );
foreach ( $this -> service_name as $key => $value ) {
2018-11-19 09:19:23 +01:00
echo '<span class="label label-default">' . $value . '</span> ' ;
}
2018-11-21 10:50:21 +01:00
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
}