summaryrefslogblamecommitdiffstats
path: root/modules-available/locationinfo/api.inc.php
blob: 1615b8ec3f3a37a516c9a88453a0ac4de32bae4b (plain) (tree)
1
2
3
4
5
6
7
8
9

     

                   


                               

                           
 
                                                         
                                       
                                                           
                                                
                                                                 


                                         
                                                     
                                                
                                                           
                                                
                                            


                                                          
                                             
                                                           
                                                
                                         
                                             


                                                           
                                             
                                                           
                                                
                                         


         





                                                                

                               

                                                              
                                                        

                                                            


                               





                                          

                                   




                                                                                                
 
                                                         
 
                                                                       

                                                                           
                         
                 
         
 
                              

 
                                   






                                                                   

                                              
 
                                       
                            
 

                                                    
                                                                                                                                                                                                                              
 

                                                
 
                                                       
 

                                                         
 
                                       
 
                                  
 
                                 
                                                                     
 


                                                                                                                               
                         









                                                                                   
                                        

                                                                 
                         
                                                                           
 


                                                                             

         

                                                                                
 
 
                                     

                                      





                                                

                                
                            









                                                                                                     
                                                                     




                                                                                         
         
 
                              





                                                   

                                                                                                                                                
                                       














                                                                                       





                                                                


                                                                                                         


                                                
                                                        













                                                                                       
                                             






                                                     





                                                                                 

                                               
                                  
                                                                                                                                                      
                              
                                                              



                                                

                                                                                                                                                                    



                                                                            
                                                            



                 




                                                             


                                                                                                         














                                            




                                        


                                                                                                                                                 









                                                                                                                                                            
                                                     





                                                                                                                 
                                                                  


         





                                                 

                             












                                                                
                                                              
                                            
                                                              
                                       
                                                              












                                                





                                              

                             
















                                                                                                                                                 






                                                                           

                                                  



                                                                                                                                                           
                                                               


















                                                                               





                                                   

                             


                              
                                                    
                                                                                                                                                                                                                         








                                                                                                  
                                                                       











                                                                                                                                                                                                                                  




                                                                                                 
                                          


                                                                           
                                                                                                                                                                             
                        
                                                                                                                                     













                                                                                  
<?php

HandleParameters();

/**
 * Handles the API paramenters.
 */
function HandleParameters()
{

	$getAction = Request::get('action', 0, 'string');
	if ($getAction == "roominfo") {
		$roomIDs = Request::get('id', 0, 'string');
		$array = filterIdList($roomIDs);
		$getCoords = Request::get('coords', 0, 'string');
		if (empty($getCoords)) {
			$getCoords = '0';
		}
		echo getRoomInfo($array, $getCoords);
	} elseif ($getAction == "openingtime") {
		$roomIDs = Request::get('id', 0, 'string');
		$array = filterIdList($roomIDs);
		echo getOpeningTime($array);
	} elseif ($getAction == "config") {
		$getRoomID = Request::get('id', 0, 'int');
		getConfig($getRoomID);
	} elseif ($getAction == "pcstates") {
		$roomIDs = Request::get('id', 0, 'string');
		$array = filterIdList($roomIDs);
		echo getPcStates($array);
	} elseif ($getAction == "roomtree") {
		$roomIDs = Request::get('id', 0, 'string');
		$array = filterIdList($roomIDs);
		echo getRoomTree($array);
	} elseif ($getAction == "calendar") {
		$roomIDs = Request::get('id', 0, 'string');
		$array = filterIdList($roomIDs);
		echo getCalendar($array);
	}
}

/**
 * Filters the id list. Removes Double / non-int / hidden rooms.
 *
 * @param $roomids Array of the room ids.
 * @return array The filtered array of the room ids.
 */
function filterIdList($roomids)
{
	$idList = explode(',', $roomids);
	$filteredIdList = array_filter($idList, 'is_numeric');
	$filteredIdList = array_unique($filteredIdList);
	$filteredIdList = filterHiddenRoom($filteredIdList);

	return $filteredIdList;
}

/**
 * Filters the hidden rooms from an array.
 *
 * @param $idArray Id list
 * @return array Filtered id list
 */
function filterHiddenRoom($idArray)
{
	$filteredArray = array();
	if (!empty($idArray)) {
		$query = "SELECT locationid, hidden FROM `location_info` WHERE locationid IN (";
		$query .= implode(",", $idArray);
		$query .= ")";

		$dbquery = Database::simpleQuery($query);

		while ($dbresult = $dbquery->fetch(PDO::FETCH_ASSOC)) {
			if ($dbresult['hidden'] == false) {
				$filteredArray[] = $dbresult['locationid'];
			}
		}
	}

	return $filteredArray;
}

// ########## <Roominfo> ##########
/**
 * Gets the room info of the given rooms.
 *
 * @param $idList Array list of ids.
 * @param bool $coords Defines if coords should be included or not.
 * @return string Roominfo JSON
 */
function getRoomInfo($idList, $coords = false)
{

	$coordinates = (string)$coords;
	$dbresult = array();

	if (!empty($idList)) {
		// Build SQL Query for multiple ids.
		$query = "SELECT m.locationid, machineuuid, position, logintime, lastseen, lastboot FROM `machine` AS m LEFT JOIN location_info AS l ON l.locationid = m.locationid WHERE l.hidden = 0 AND m.locationid IN (";

		$query .= implode(",", $idList);
		$query .= ")";

		$query .= " ORDER BY m.locationid ASC";

		// Execute query.
		$dbquery = Database::simpleQuery($query);

		$currentlocationid = 0;

		$pclist = array();

		// Fetch db data.
		while ($dbdata = $dbquery->fetch(PDO::FETCH_ASSOC)) {

			// Set the id if the locationid changed.
			if (!isset($dbresult[$dbdata['locationid']])) {
				$dbresult[$dbdata['locationid']] = array('id' => $dbdata['locationid'], 'computer' => array());
			}

			// Compact the pc data in one array.
			$pc['id'] = $dbdata['machineuuid'];
			if ($coordinates == '1' || $coordinates == 'true') {
				$position = json_decode($dbdata['position'], true);
				$pc['x'] = $position['gridCol'];
				$pc['y'] = $position['gridRow'];

				if (isset($position['overlays'])) {
					$pc['overlay'] = $position['overlays'];
				} else {
					$pc['overlay'] = array();
				}
			}
			$pc['pcState'] = LocationInfo::getPcState($dbdata);

			// Add the array to the computer list.
			$dbresult[$dbdata['locationid']]['computer'][] = $pc;
		}
	}

	// The array keys are only used for the isset -> Return only the values.
	return json_encode(array_values($dbresult), true);
}

// ########## </Roominfo> ###########

// ########## <Openingtime> ##########
/**
 * Gets the Opening time of the given locations.
 *
 * @param $idList Array list of locations
 * @return string Opening times JSON
 */
function getOpeningTime($idList)
{
	$dbresult = array();

	if (!empty($idList)) {
		// Build SQL Query for multiple ids.
		$query = "SELECT locationid, openingtime FROM `location_info` WHERE locationid IN (";
		$query .= implode(",", $idList);
		$query .= ")";

		// Execute query.
		$dbquery = Database::simpleQuery($query);
		$handledIds = array();
		while ($dbdata = $dbquery->fetch(PDO::FETCH_ASSOC)) {
			$data['id'] = $dbdata['locationid'];
			$data['openingtime'] = json_decode($dbdata['openingtime'], true);
			$handledIds[] = $data['id'];
			$dbresult[] = $data;
		}
	}

	$finalArray = array();
	$idList = array_diff($idList, $handledIds);
	foreach ($idList as $id) {
		$data['id'] = $id;
		$data['openingtime'] = array();
		$dbresult[] = $data;
	}

	// Go through the db entrys [id] = id; [openingtime] = e.g. [{"days":["Saturday","Sunday"],"openingtime":"12:32","closingtime":"14:35"}]
	foreach ($dbresult as $entry) {
		$tmp = array();
		// Get the parents time if there is no openingtime defined.
		if (count($entry['openingtime']) == 0) {
			//$tmp = getOpeningTimesFromParent($entry['id']);
			$tmp['id'] = $entry['id'];
			$tmp['openingtime'] = getOpeningTimesFromParent($entry['id']);
		} else {
			$tmp['id'] = $entry['id'];
			$tmp['openingtime'] = formatOpeningtime($entry['openingtime']);
		}
		$finalArray[] = $tmp;
	}
	return json_encode($finalArray, true);
}

/**
 * Format the openingtime in the frontend needed format.
 *
 * @param $openingtime The opening time in the db saved format.
 * @return mixed The opening time in the frontend needed format.
 */
function formatOpeningtime($openingtime)
{
	$weekarray = array("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday");
	foreach ($weekarray as $d) {
		$array = array();
		foreach ($openingtime as $opt) {
			foreach ($opt['days'] as $val) {
				if ($val == $d) {
					$arr = array();

					$openTime = explode(':', $opt['openingtime']);
					$arr['HourOpen'] = $openTime[0];
					$arr['MinutesOpen'] = $openTime[1];

					$closeTime = explode(':', $opt['closingtime']);
					$arr['HourClose'] = $closeTime[0];
					$arr['MinutesClose'] = $closeTime[1];

					$array[] = $arr;
				}
			}
			if (!empty($array)) {
				$result[$d] = $array;
			}
		}
	}
	return $result;
}

/**
 * Recursively gets the opening time from the parent location.
 *
 * @param $locationID Id of the location you want to get the parent opening time.
 * @return array|mixed The opening time from the parent location.
 */
function getOpeningTimesFromParent($locationID)
{
	// Get parent location id.
	$dbquery = Database::queryFirst("SELECT parentlocationid FROM `location` WHERE locationid = :locationID", array('locationID' => $locationID));
	$parentlocationid = 0;
	$parentlocationid = (int)$dbquery['parentlocationid'];

	if ($parentlocationid == 0) {
		return createBasicClosingTime();
	} else {
		$dbquery = Database::queryFirst("SELECT openingtime FROM `location_info` WHERE locationid = :locationID", array('locationID' => $parentlocationid));
		$dbresult = json_decode($dbquery['openingtime'], true);

		if (count($dbresult) == 0) {
			return getOpeningTimesFromParent($parentlocationid);
		} else {
			return formatOpeningtime($dbresult);
		}
	}
}

/**
 * Creates the basic opening time where everything is closed.
 *
 * @return array Basic opening time.
 */
function createBasicClosingTime()
{
	$weekarray = array("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday");
	$array = array();
	foreach ($weekarray as $d) {
		$a = array();
		$arr['HourOpen'] = '00';
		$arr['MinutesOpen'] = '00';

		$arr['HourClose'] = '23';
		$arr['MinutesClose'] = '59';
		$a[] = $arr;
		$array[$d] = $a;
	}
	return $array;
}

// ########## </Openingtime> ##########
/**
 * Gets the config of the location.
 *
 * @param $locationID ID of the location
 */
function getConfig($locationID)
{
	$dbresult = Database::queryFirst("SELECT l.locationname, li.config, li.serverroomid, s.servertype, s.serverurl FROM `location_info` AS li
		RIGHT JOIN `location` AS l ON l.locationid=li.locationid
		LEFT JOIN `setting_location_info` AS s ON s.serverid=li.serverid
		WHERE l.locationid=:locationID", array('locationID' => $locationID));
	$config = array();

	$config = json_decode($dbresult['config'], true);
	$config['room'] = $dbresult['locationname'];
	$date = getdate();
	$config['time'] = $date['year'] . "-" . $date['mon'] . "-" . $date['mday'] . " " . $date['hours'] . ":" . $date['minutes'] . ":" . $date['seconds'];

	if ($dbresult['servertype'] === "Frontend") {
		$config['calendarqueryurl'] = $dbresult['serverurl'] . "/" . $dbresult['serverroomid'] . ".json";
	}

	if (empty($config)) {
		echo json_encode(array());
	} else {
		echo json_encode($config, JSON_UNESCAPED_SLASHES);
	}
}

/**
 * Gets the pc states of the given locations.
 *
 * @param $idList Array list of the location ids.
 * @return string PC state JSON
 */
function getPcStates($idList)
{
	$pcStates = array();

	$roominfoList = json_decode(getRoomInfo($idList), true);
	foreach ($roominfoList as $roomInfo) {
		$result['id'] = $roomInfo['id'];
		$idle = 0;
		$occupied = 0;
		$off = 0;
		$broken = 0;

		foreach ($roomInfo['computer'] as $computer) {
			if ($computer['pcState'] == 0) {
				$idle++;
			} elseif ($computer['pcState'] == 1) {
				$occupied++;
			} elseif ($computer['pcState'] == 2) {
				$off++;
			} elseif ($computer['pcState'] == 3) {
				$broken++;
			}
		}

		$result['idle'] = $idle;
		$result['occupied'] = $occupied;
		$result['off'] = $off;
		$result['broken'] = $broken;
		$pcStates[] = $result;
	}
	return json_encode($pcStates);
}

/**
 * Gets the room tree of the given locations.
 *
 * @param $idList Array list of the locations.
 * @return string Room tree JSON.
 */
function getRoomTree($idList)
{
	$roomTree = array();
	$filteredIdList = array();
	foreach ($idList as $id) {
		$dbresult = Database::queryFirst("SELECT locationname FROM `location` WHERE locationid=:locationID", array('locationID' => $id));

		if (!in_array($id, $filteredIdList)) {
			$a['id'] = $id;
			$a['name'] = $dbresult['locationname'];
			$filteredIdList[] = $id;
			$a['childs'] = getChildsRecursive($id, $filteredIdList);
			$roomTree[] = $a;
		}
	}

	return json_encode($roomTree);
}

/**
 * Recursively gets the Childs of a location.
 *
 * @param $id Location id you want all childs from.
 * @param $filteredIdList Pointer to the filtered list to avoid double ids.
 * @return array List with all the Childs.
 */
function getChildsRecursive($id, &$filteredIdList)
{
	$dbquery = Database::simpleQuery("SELECT locationid, locationname FROM `location` WHERE parentlocationid=:locationID", array('locationID' => $id));
	$array = array();
	$dbarray = array();

	while ($dbresult = $dbquery->fetch(PDO::FETCH_ASSOC)) {
		$dbarray[] = $dbresult;
	}
	foreach ($dbarray as $db) {
		$i = $db['locationid'];

		if (!in_array($i, $filteredIdList)) {
			$a['id'] = $i;
			$a['name'] = $db['locationname'];
			$filteredIdList[] = $i;
			$a['childs'] = getChildsRecursive($i, $filteredIdList);
			$array[] = $a;
		}

	}

	return $array;
}

// ########## <Calendar> ###########
/**
 * Gets the calendar of the given ids.
 *
 * @param $idList Array list with the location ids.
 * @return string Calendar JSON.
 */
function getCalendar($idList)
{
	$serverList = array();

	if (!empty($idList)) {
		// Build SQL query for multiple ids.
		$query = "SELECT locationid, l.serverid AS serverid, serverurl, servertype, credentials FROM `location_info` AS l LEFT JOIN setting_location_info AS s ON s.serverid = l.serverid WHERE locationid IN (";

		$query .= implode(",", $idList);

		$query .= ") AND l.serverid = s.serverid ORDER BY servertype ASC, locationid ASC";

		$dbquery = Database::simpleQuery($query);

		$first = true;
		$lastservertype = "";
		while ($dbresult = $dbquery->fetch(PDO::FETCH_ASSOC)) {
			if (!isset($serverList[$dbresult['serverid']])) {
				$serverList[$dbresult['serverid']] = array('credentials' => json_decode($dbresult['credentials'], true), 'url' => $dbresult['serverurl'], 'type' => $dbresult['servertype'], 'idlist' => array());
			}
			$serverList[$dbresult['serverid']]['idlist'][] = $dbresult['locationid'];
		}
	}

	$resultarray = array();
	foreach ($serverList as $serverid => $server) {
		$serverInstance = CourseBackend::getInstance($server['type']);
		$setCred = $serverInstance->setCredentials($server['credentials'], $server['url'], $serverid);

		$calendarFromBackend = array();
		if ($setCred) {
			$calendarFromBackend = $serverInstance->fetchSchedule($server['idlist']);
		}

		$formattedArray = array();
		if ($calendarFromBackend === false || $setCred === false) {
			$error['timestamp'] = time();
			$error['error'] = $serverInstance->getError();
			Database::exec("UPDATE `setting_location_info` SET error=:error WHERE serverid=:id", array('id' => $serverid, 'error' => json_encode($error, true)));
		} else {
			Database::exec("UPDATE `setting_location_info` SET error=NULL WHERE serverid=:id", array('id' => $serverid));
		}
		if (is_array($calendarFromBackend)) {
			foreach ($calendarFromBackend as $key => $value) {
				$y['id'] = $key;
				$y['calendar'] = $value;
				$formattedArray[] = $y;
			}
			$resultarray = array_merge($resultarray, $formattedArray);
		}
	}
	return json_encode($resultarray, true);
}

// ########## </Calendar> ##########