2020-08-31 22:37:22 +08:00
< ? php
2020-10-19 20:50:11 +08:00
$message = '' ;
$data = array ();
//
// INITIALIZE AND CHECK SANITY
//
if ( ! canEdit ( 'Events' ) ) $message = 'Insufficient permissions for user ' . $user [ 'Username' ];
if ( empty ( $_REQUEST [ 'task' ]) ) {
$message = 'Must specify a task' ;
} else {
$task = $_REQUEST [ 'task' ];
}
2020-08-31 22:37:22 +08:00
if ( empty ( $_REQUEST [ 'eids' ]) ) {
2020-10-19 20:50:11 +08:00
if ( isset ( $_REQUEST [ 'task' ]) && $_REQUEST [ 'task' ] != " query " ) $message = 'No event id(s) supplied' ;
} else {
$eids = $_REQUEST [ 'eids' ];
}
if ( $message ) {
ajaxError ( $message );
return ;
}
2020-10-24 05:55:43 +08:00
$filter = isset ( $_REQUEST [ 'filter' ]) ? ZM\Filter :: parse ( $_REQUEST [ 'filter' ]) : new ZM\Filter ();
if ( $user [ 'MonitorIds' ] ) {
$filter = $filter -> addTerm ( array ( 'cnj' => 'and' , 'attr' => 'MonitorId' , 'op' => 'IN' , 'val' => $user [ 'MonitorIds' ]));
}
2020-10-19 20:50:11 +08:00
// Search contains a user entered string to search on
$search = isset ( $_REQUEST [ 'search' ]) ? $_REQUEST [ 'search' ] : '' ;
// Advanced search contains an array of "column name" => "search text" pairs
// Bootstrap table sends json_ecoded array, which we must decode
2020-10-24 04:44:50 +08:00
$advsearch = isset ( $_REQUEST [ 'advsearch' ]) ? json_decode ( $_REQUEST [ 'advsearch' ], JSON_OBJECT_AS_ARRAY ) : array ();
2020-10-19 20:50:11 +08:00
// Sort specifies the name of the column to sort on
2020-10-20 01:25:13 +08:00
$sort = 'StartTime' ;
2020-10-19 20:50:11 +08:00
if ( isset ( $_REQUEST [ 'sort' ]) ) {
2020-10-23 02:27:47 +08:00
$sort = $_REQUEST [ 'sort' ];
2020-08-31 22:37:22 +08:00
}
2020-10-19 20:50:11 +08:00
// Offset specifies the starting row to return, used for pagination
$offset = 0 ;
if ( isset ( $_REQUEST [ 'offset' ]) ) {
if ( ( ! is_int ( $_REQUEST [ 'offset' ]) and ! ctype_digit ( $_REQUEST [ 'offset' ]) ) ) {
ZM\Error ( 'Invalid value for offset: ' . $_REQUEST [ 'offset' ]);
} else {
$offset = $_REQUEST [ 'offset' ];
}
}
// Order specifies the sort direction, either asc or desc
$order = ( isset ( $_REQUEST [ 'order' ]) and ( strtolower ( $_REQUEST [ 'order' ]) == 'asc' )) ? 'ASC' : 'DESC' ;
// Limit specifies the number of rows to return
$limit = 100 ;
if ( isset ( $_REQUEST [ 'limit' ]) ) {
if ( ( ! is_int ( $_REQUEST [ 'limit' ]) and ! ctype_digit ( $_REQUEST [ 'limit' ]) ) ) {
ZM\Error ( 'Invalid value for limit: ' . $_REQUEST [ 'limit' ]);
} else {
$limit = $_REQUEST [ 'limit' ];
}
}
//
// MAIN LOOP
//
switch ( $task ) {
case 'archive' :
case 'unarchive' :
foreach ( $eids as $eid ) archiveRequest ( $task , $eid );
break ;
case 'delete' :
foreach ( $eids as $eid ) $data [] = deleteRequest ( $eid );
break ;
case 'query' :
2020-10-24 05:55:43 +08:00
$data = queryRequest ( $filter , $search , $advsearch , $sort , $offset , $order , $limit );
2020-10-19 20:50:11 +08:00
break ;
default :
ZM\Fatal ( " Unrecognised task ' $task ' " );
} // end switch task
ajaxResponse ( $data );
2020-08-31 22:37:22 +08:00
2020-10-19 20:50:11 +08:00
//
// FUNCTION DEFINITIONS
//
function archiveRequest ( $task , $eid ) {
$archiveVal = ( $task == 'archive' ) ? 1 : 0 ;
dbQuery (
'UPDATE Events SET Archived = ? WHERE Id = ?' ,
array ( $archiveVal , $eid )
);
}
function deleteRequest ( $eid ) {
2020-08-31 22:37:22 +08:00
$message = array ();
2020-10-19 20:50:11 +08:00
$event = new ZM\Event ( $eid );
if ( ! $event -> Id () ) {
$message [] = array ( $eid => 'Event not found.' );
} else if ( $event -> Archived () ) {
$message [] = array ( $eid => 'Event is archived, cannot delete it.' );
} else {
$event -> delete ();
}
return $message ;
}
2020-10-24 05:55:43 +08:00
function queryRequest ( $filter , $search , $advsearch , $sort , $offset , $order , $limit ) {
2020-10-26 21:58:47 +08:00
$data = array (
'total' => 0 ,
'totalNotFiltered' => 0 ,
'rows' => array (),
'updated' => preg_match ( '/%/' , DATE_FMT_CONSOLE_LONG ) ? strftime ( DATE_FMT_CONSOLE_LONG ) : date ( DATE_FMT_CONSOLE_LONG )
);
$failed = ! $filter -> test_pre_sql_conditions ();
if ( $failed ) {
ZM\Debug ( 'Pre conditions failed, not doing sql' );
return $data ;
}
2020-10-19 20:50:11 +08:00
// Put server pagination code here
// The table we want our data from
$table = 'Events' ;
2020-08-31 22:37:22 +08:00
2020-10-23 23:21:32 +08:00
// The names of the dB columns in the events table we are interested in
2020-10-20 21:10:43 +08:00
$columns = array ( 'Id' , 'MonitorId' , 'StorageId' , 'Name' , 'Cause' , 'StartTime' , 'EndTime' , 'Length' , 'Frames' , 'AlarmFrames' , 'TotScore' , 'AvgScore' , 'MaxScore' , 'Archived' , 'Emailed' , 'Notes' , 'DiskSpace' );
2020-10-19 20:50:11 +08:00
2020-10-23 02:27:47 +08:00
// The names of columns shown in the event view that are NOT dB columns in the database
2020-10-19 20:50:11 +08:00
$col_alt = array ( 'Monitor' , 'Storage' );
2020-10-23 02:27:47 +08:00
if ( ! in_array ( $sort , array_merge ( $columns , $col_alt )) ) {
2020-10-27 01:06:05 +08:00
ZM\Error ( 'Invalid sort field: ' . $sort );
$sort = 'Id' ;
2020-10-23 02:27:47 +08:00
}
2020-10-19 20:50:11 +08:00
$data = array ();
$query = array ();
$query [ 'values' ] = array ();
$likes = array ();
2020-10-24 05:55:43 +08:00
$where = ( $filter -> sql () ? '(' . $filter -> sql () . ')' : '' );
2020-10-19 20:50:11 +08:00
// There are two search bars in the log view, normal and advanced
// Making an exuctive decision to ignore the normal search, when advanced search is in use
// Alternatively we could try to do both
if ( count ( $advsearch ) ) {
foreach ( $advsearch as $col => $text ) {
2020-10-27 01:06:05 +08:00
if ( in_array ( $col , $columns ) ) {
array_push ( $likes , 'E.' . $col . ' LIKE ?' );
array_push ( $query [ 'values' ], $text );
} else if ( in_array ( $col , $col_alt ) ) {
array_push ( $likes , 'M.' . $col . ' LIKE ?' );
array_push ( $query [ 'values' ], $text );
} else {
2020-10-19 20:50:11 +08:00
ZM\Error ( " ' $col ' is not a sortable column name " );
continue ;
2020-08-31 22:37:22 +08:00
}
2020-10-27 01:06:05 +08:00
} # end foreach col in advsearch
2020-10-19 20:50:11 +08:00
$wherevalues = $query [ 'values' ];
2020-10-27 01:06:05 +08:00
$where .= ( $where != '' ) ? ' AND (' . implode ( ' OR ' , $likes ) . ')' : implode ( ' OR ' , $likes );
2020-10-19 20:50:11 +08:00
} else if ( $search != '' ) {
2020-08-31 22:37:22 +08:00
2020-10-19 20:50:11 +08:00
$search = '%' . $search . '%' ;
foreach ( $columns as $col ) {
2020-10-27 01:06:05 +08:00
array_push ( $likes , 'E.' . $col . ' LIKE ?' );
2020-10-19 20:50:11 +08:00
array_push ( $query [ 'values' ], $search );
}
$wherevalues = $query [ 'values' ];
2020-10-27 01:06:05 +08:00
$where .= ( $where != '' ) ? ' AND (' . implode ( ' OR ' , $likes ) . ')' : implode ( ' OR ' , $likes );
2020-10-24 05:55:43 +08:00
}
if ( $where )
$where = ' WHERE ' . $where ;
2020-10-19 20:50:11 +08:00
2020-10-26 22:03:12 +08:00
$sort = $sort == 'Monitor' ? 'M.Name' : 'E.' . $sort ;
2020-10-25 23:28:22 +08:00
$col_str = 'E.*, M.Name AS Monitor' ;
2020-10-25 23:40:29 +08:00
$query [ 'sql' ] = 'SELECT ' . $col_str . ' FROM `' . $table . '` AS E INNER JOIN Monitors AS M ON E.MonitorId = M.Id' . $where . ' ORDER BY ' . $sort . ' ' . $order . ' LIMIT ?, ?' ;
2020-10-19 20:50:11 +08:00
array_push ( $query [ 'values' ], $offset , $limit );
2020-10-27 01:07:18 +08:00
//ZM\Debug('Calling the following sql query: ' .$query['sql']);
2020-10-19 20:50:11 +08:00
$storage_areas = ZM\Storage :: find ();
$StorageById = array ();
foreach ( $storage_areas as $S ) {
$StorageById [ $S -> Id ()] = $S ;
}
$rows = array ();
foreach ( dbFetchAll ( $query [ 'sql' ], NULL , $query [ 'values' ]) as $row ) {
2020-10-24 05:55:43 +08:00
$event = new ZM\Event ( $row );
2020-10-26 21:58:47 +08:00
if ( ! $filter -> test_post_sql_conditions ( $event ) ) {
$event -> remove_from_cache ();
continue ;
}
2020-10-21 01:59:30 +08:00
$scale = intval ( 5 * 100 * ZM_WEB_LIST_THUMB_WIDTH / $event -> Width ());
2020-10-21 01:13:12 +08:00
$imgSrc = $event -> getThumbnailSrc ( array (), '&' );
$streamSrc = $event -> getStreamSrc ( array (
2020-10-29 21:39:48 +08:00
'mode' => 'jpeg' , 'scale' => $scale , 'maxfps' => ZM_WEB_VIDEO_MAXFPS , 'replay' => 'single' , 'rate' => '400' ), '&' );
2020-10-21 01:13:12 +08:00
2020-10-19 20:50:11 +08:00
// Modify the row data as needed
2020-10-21 01:13:12 +08:00
$row [ 'imgHtml' ] = '<img id="thumbnail' . $event -> Id () . '" src="' . $imgSrc . '" alt="' . validHtmlStr ( 'Event ' . $event -> Id ()) . '" style="width:' . validInt ( $event -> ThumbnailWidth ()) . 'px;height:' . validInt ( $event -> ThumbnailHeight ()) . 'px;" stream_src="' . $streamSrc . '" still_src="' . $imgSrc . '"/>' ;
2020-10-20 03:18:21 +08:00
$row [ 'Name' ] = validHtmlStr ( $row [ 'Name' ]);
$row [ 'Archived' ] = $row [ 'Archived' ] ? translate ( 'Yes' ) : translate ( 'No' );
$row [ 'Emailed' ] = $row [ 'Emailed' ] ? translate ( 'Yes' ) : translate ( 'No' );
$row [ 'Cause' ] = validHtmlStr ( $row [ 'Cause' ]);
2020-10-19 20:50:11 +08:00
$row [ 'StartTime' ] = strftime ( STRF_FMT_DATETIME_SHORTER , strtotime ( $row [ 'StartTime' ]));
2020-10-26 22:33:11 +08:00
$row [ 'EndTime' ] = strftime ( STRF_FMT_DATETIME_SHORTER , strtotime ( $row [ 'EndTime' ]));
2020-10-20 01:25:13 +08:00
$row [ 'Length' ] = gmdate ( 'H:i:s' , $row [ 'Length' ] );
$row [ 'Storage' ] = ( $row [ 'StorageId' ] and isset ( $StorageById [ $row [ 'StorageId' ]]) ) ? $StorageById [ $row [ 'StorageId' ]] -> Name () : 'Default' ;
2020-10-30 03:08:14 +08:00
$row [ 'Notes' ] = nl2br ( htmlspecialchars ( $row [ 'Notes' ]));
2020-10-24 20:50:59 +08:00
$row [ 'DiskSpace' ] = human_filesize ( $event -> DiskSpace ());
2020-10-19 20:50:11 +08:00
$rows [] = $row ;
}
$data [ 'rows' ] = $rows ;
2020-11-01 00:26:29 +08:00
# totalNotFiltered must equal total, except when either search bar has been used
$data [ 'totalNotFiltered' ] = dbFetchOne ( 'SELECT count(*) AS Total FROM ' . $table . ' AS E' . ( $filter -> sql () ? ' WHERE ' . $filter -> sql () : '' ), 'Total' );
if ( $search != '' || count ( $advsearch ) ) {
$data [ 'total' ] = dbFetchOne ( 'SELECT count(*) AS Total FROM ' . $table . ' AS E' . $where , 'Total' , $wherevalues );
} else {
$data [ 'total' ] = $data [ 'totalNotFiltered' ];
}
2020-11-03 04:33:40 +08:00
2020-10-19 20:50:11 +08:00
return $data ;
}
2020-08-31 22:37:22 +08:00
?>