127 lines
4.8 KiB
PHP
127 lines
4.8 KiB
PHP
<?php
|
|
require_once __DIR__ . '/common.php';
|
|
|
|
|
|
/**
|
|
* Handles power outage requests for the new schema.
|
|
* @param resource $dbconn The database connection.
|
|
* @param array $input_data The decoded JSON input data.
|
|
*/
|
|
function handle_new_power_request($dbconn, $input_data) {
|
|
$poly = $input_data['poly'] ?? null;
|
|
$start = $input_data['start'] ?? null;
|
|
$end = $input_data['end'] ?? null;
|
|
|
|
if (!$poly || !$start || !$end) {
|
|
send_error(400, 'Missing required fields: poly, start, and end are required for power requests.');
|
|
}
|
|
|
|
$query = "
|
|
SELECT
|
|
SUM(p.outagen) as total_outages,
|
|
COUNT(p.id) as outage_events,
|
|
SUM(p.peakoutage) as peak_outages
|
|
FROM newpower p
|
|
WHERE ST_Within(p.geom, ST_GeomFromText($1, 4326))
|
|
AND p.start_time >= $2
|
|
AND p.start_time <= $3
|
|
";
|
|
|
|
try {
|
|
$result = pg_query_params($dbconn, $query, [$poly, $start, $end]);
|
|
if ($result === false) {
|
|
throw new Exception('Database query failed: ' . pg_last_error($dbconn));
|
|
}
|
|
$data = pg_fetch_assoc($result);
|
|
pg_free_result($result);
|
|
|
|
header('Content-Type: application/json');
|
|
echo json_encode($data ?: new stdClass()); // Return empty JSON object if no results
|
|
|
|
} catch (Exception $e) {
|
|
send_error(500, 'An error occurred while processing the power request.', $e->getMessage());
|
|
}
|
|
}
|
|
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
$input_data = null;
|
|
$request_type = null;
|
|
$contentType = trim(strtolower($_SERVER['HTTP_CONTENT_TYPE'] ?? $_SERVER['CONTENT_TYPE'] ?? ''));
|
|
|
|
if (strpos($contentType, 'application/json') === 0) {
|
|
$raw_post_data = file_get_contents('php://input');
|
|
|
|
if ($raw_post_data === false || $raw_post_data === '') {
|
|
send_error(400, 'Received empty request body or could not read input.', "Error: Could not read php://input or it was empty.");
|
|
}
|
|
|
|
$input_data = json_decode($raw_post_data, true);
|
|
|
|
if (json_last_error() !== JSON_ERROR_NONE) {
|
|
send_error(400, 'Invalid JSON payload received.', 'JSON Decode Error: ' . json_last_error_msg() . " | Raw data snippet: " . substr($raw_post_data, 0, 100));
|
|
} elseif (!is_array($input_data)) {
|
|
send_error(400, 'Invalid JSON payload: Expected a JSON object.', "JSON Decode Warning: Result is not an array. Data: " . print_r($input_data, true));
|
|
} else {
|
|
$request_type = $input_data['request_type'] ?? null;
|
|
}
|
|
} else {
|
|
send_error(415, 'Unsupported Media Type. This endpoint requires application/json.', "Unsupported Media Type Received: " . $contentType);
|
|
}
|
|
|
|
if ($request_type === null) {
|
|
if (is_array($input_data) && !isset($input_data['request_type'])) {
|
|
send_error(400, 'Missing "request_type" field within the request payload.');
|
|
} else {
|
|
send_error(400, 'Missing required parameter: request_type (or processing error).');
|
|
}
|
|
}
|
|
|
|
$dbconn = getDBConnection();
|
|
|
|
switch ($request_type) {
|
|
// Retaining legacy endpoints from stormdata.php but pointing to new handlers if needed
|
|
// For now, only implementing the 'power' endpoint for the new schema
|
|
case 'power':
|
|
handle_new_power_request($dbconn, $input_data);
|
|
break;
|
|
// The 'powernopoly' case from the original file can be implemented here if needed.
|
|
// It would be similar to handle_new_power_request but without the ST_Within clause.
|
|
|
|
/*
|
|
// Legacy endpoints can be added here if they need to be migrated.
|
|
case 'ohgo':
|
|
// handle_ohgo_request($dbconn, $input_data);
|
|
send_error(501, 'The "ohgo" request type is not yet implemented for newstormdata.');
|
|
break;
|
|
case 'ohgonopoly':
|
|
// handle_ohgo_request_no_poly($dbconn, $input_data);
|
|
send_error(501, 'The "ohgonopoly" request type is not yet implemented for newstormdata.');
|
|
break;
|
|
case 'wupoly':
|
|
// handle_wu_request_poly($dbconn, $input_data);
|
|
send_error(501, 'The "wupoly" request type is not yet implemented for newstormdata.');
|
|
break;
|
|
case 'campoly':
|
|
// handle_cam_request($dbconn, $input_data);
|
|
send_error(501, 'The "campoly" request type is not yet implemented for newstormdata.');
|
|
break;
|
|
*/
|
|
default:
|
|
send_error(400, 'Invalid request_type specified: ' . htmlspecialchars($request_type));
|
|
break;
|
|
}
|
|
|
|
pg_close($dbconn);
|
|
|
|
} else {
|
|
http_response_code(405);
|
|
header('Allow: POST');
|
|
header('Content-Type: application/json; charset=utf-8');
|
|
echo json_encode(['error' => 'Invalid request method. Only POST is allowed.']);
|
|
exit;
|
|
}
|
|
?>
|
|
|
|
|