2017-11-23 18:09:36 -05:00
< ? php
//DIR Because of include problems
2018-01-18 16:57:12 -05:00
require_once ( __DIR__ . " /incident.php " );
require_once ( __DIR__ . " /service.php " );
require_once ( __DIR__ . " /user.php " );
require_once ( __DIR__ . " /token.php " );
2017-11-23 18:09:36 -05:00
/**
* Facade class
*/
class Constellation
{
2018-01-07 14:39:10 -05:00
/**
* Renders incidents matching specified constraints .
* @ param Boolean $future - specifies whether to render old or upcoming incidents
* @ param int $offset - specifies offset - used for pagination
* @ param int $limit - limits the number of incidents rendered
* @ param Boolean $admin - specifies whether to render admin controls
*/
2017-11-23 18:09:36 -05:00
public function render_incidents ( $future = false , $offset = 0 , $limit = 5 , $admin = 0 ){
if ( $offset < 0 )
{
$offset = 0 ;
}
2018-04-14 06:37:01 -04:00
$limit = ( isset ( $_GET [ 'limit' ]) ? $_GET [ 'limit' ] : 5 );
$offset = ( isset ( $_GET [ 'offset' ]) ? $_GET [ 'offset' ] : 0 );
$timestamp = ( isset ( $_GET [ 'timestamp' ])) ? $_GET [ 'timestamp' ] : time ();
$incidents = $this -> get_incidents ( $future , $offset , $limit , $timestamp );
2018-01-02 13:37:15 -05:00
$ajax = isset ( $_GET [ 'ajax' ]);
2018-04-14 06:37:01 -04:00
if ( $future && count ( $incidents [ " incidents " ]) && ! $ajax )
2017-11-23 18:09:36 -05:00
{
2017-12-30 18:41:58 -05:00
echo " <h3> " . _ ( " Planned maintenance " ) . " </h3> " ;
2017-11-23 18:09:36 -05:00
}
2018-04-14 06:37:01 -04:00
else if ( count ( $incidents [ " incidents " ]) &&! $ajax )
2017-11-23 18:09:36 -05:00
{
if ( $offset )
{
2018-04-14 06:37:01 -04:00
echo '<noscript><div class="centered"><a href="' . WEB_URL . '/?offset=' . ( $offset - $limit ) . '×tamp=' . $timestamp . '" class="btn btn-default">' . _ ( " Back " ) . '</a></div></noscript>' ;
2017-11-23 18:09:36 -05:00
}
2017-12-30 18:41:58 -05:00
echo " <h3> " . _ ( " Past incidents " ) . " </h3> " ;
2017-11-23 18:09:36 -05:00
}
else if ( ! $future &&! $ajax )
{
2017-12-30 18:41:58 -05:00
echo " <h3> " . _ ( " No incidents " ) . " </h3> " ;
2017-11-23 18:09:36 -05:00
}
2018-04-14 06:37:01 -04:00
$show = ! $future && $incidents [ " more " ];
2017-11-23 18:09:36 -05:00
$offset += $limit ;
2018-04-14 06:37:01 -04:00
if ( count ( $incidents [ " incidents " ])){
foreach ( $incidents [ 'incidents' ] as $incident ) {
2017-11-23 18:09:36 -05:00
$incident -> render ( $admin );
}
2018-04-14 06:37:01 -04:00
2017-11-23 18:09:36 -05:00
if ( $show )
{
2018-03-09 18:07:40 -05:00
echo '<div class="centered"><a href="' . WEB_URL . '/?offset=' . ( $offset ) . '×tamp=' . $timestamp . '" id="loadmore" class="btn btn-default">' . _ ( " Load more " ) . '</a></div>' ;
2017-11-23 18:09:36 -05:00
}
}
}
2018-01-07 14:39:10 -05:00
/**
* Renders service status - in admin page it returns array so it can be processed further .
* @ param boolean $admin
* @ return array of services
*/
2018-04-13 15:31:03 -04:00
public function render_status ( $admin = false , $heading = true ){
2017-11-23 18:09:36 -05:00
global $mysqli ;
$query = $mysqli -> query ( " SELECT id, name FROM services " );
$array = array ();
if ( $query -> num_rows ){
$timestamp = time ();
while ( $result = $query -> fetch_assoc ())
{
$id = $result [ 'id' ];
$sql = $mysqli -> prepare ( " SELECT type FROM services_status INNER JOIN status ON services_status.status_id = status.id WHERE service_id = ? AND `time` <= ? AND (`end_time` >= ? OR `end_time`=0) ORDER BY `time` DESC LIMIT 1 " );
$sql -> bind_param ( " iii " , $id , $timestamp , $timestamp );
$sql -> execute ();
$tmp = $sql -> get_result ();
if ( $tmp -> num_rows )
{
$array [] = new Service ( $result [ 'id' ], $result [ 'name' ], $tmp -> fetch_assoc ()[ 'type' ]);
}
else {
$array [] = new Service ( $result [ 'id' ], $result [ 'name' ]);
}
}
2018-04-13 15:31:03 -04:00
if ( $heading )
{
echo Service :: current_status ( $array );
}
2017-11-23 18:09:36 -05:00
}
else {
2017-12-30 18:41:58 -05:00
$array [] = new Service ( 0 , _ ( " No services " ), - 1 );
2017-11-23 18:09:36 -05:00
}
if ( ! $admin )
{
echo '<div id="status-container" class="clearfix">' ;
foreach ( $array as $service ){
$service -> render ();
}
echo '</div>' ;
}
else {
return $array ;
}
}
2018-04-14 06:37:01 -04:00
function get_incidents ( $future = false , $offset = 0 , $limit = 5 , $timestamp = 0 ){
global $mysqli ;
if ( $timestamp == 0 )
{
$timestamp = time ();
}
2018-04-20 11:39:34 -04:00
$operator = ( $future ) ? " >= " : " <= " ;
2018-04-14 06:37:01 -04:00
$limit ++ ;
2018-11-21 05:24:39 -05:00
$sql = $mysqli -> prepare ( " SELECT users.id, status.type, status.title, status.text, status.time, status.end_time, users.username, status.id as status_id FROM status INNER JOIN users ON user_id=users.id WHERE `time` $operator ? AND `end_time` $operator ? OR (`time`<=? AND `end_time` $operator ? ) ORDER BY `time` DESC LIMIT ? OFFSET ? " );
2018-04-14 06:37:01 -04:00
$sql -> bind_param ( " iiiiii " , $timestamp , $timestamp , $timestamp , $timestamp , $limit , $offset );
$sql -> execute ();
$query = $sql -> get_result ();
$array = [];
$limit -- ;
$more = false ;
if ( $query -> num_rows > $limit ){
$more = true ;
}
if ( $query -> num_rows ){
while (( $result = $query -> fetch_assoc ()) && $limit -- > 0 )
{
2018-11-21 04:50:21 -05:00
// Add service id and service names to an array in the Incident class
$stmt_service = $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_service -> bind_param ( " i " , $result [ 'status_id' ]);
$stmt_service -> execute ();
$query_service = $stmt_service -> get_result ();
while ( $result_service = $query_service -> fetch_assoc ()) {
$result [ 'service_id' ][] = $result_service [ 'id' ];
$result [ 'service_name' ][] = $result_service [ 'name' ];
}
2018-04-14 06:37:01 -04:00
$array [] = new Incident ( $result );
}
}
return [
" more " => $more ,
" incidents " => $array
];
}
2017-11-23 18:09:36 -05:00
}
$constellation = new Constellation ();