Add API endpoint for retrieving recent QSO data from public logbooks

这个提交包含在:
Peter Goodhall 2025-07-30 22:31:38 +01:00 提交者 GitHub
当前提交 a71eac35ee
找不到此签名对应的密钥
GPG 密钥 ID: B5690EEEBB952194

查看文件

@ -814,4 +814,129 @@ class API extends CI_Controller {
$latlng = $this->qra->qra2latlong($qra);
return $latlng;
}
/**
* API endpoint to get recent QSOs from a public logbook
*
* @api GET /api/recent_qsos/{public_slug}/{limit}
*
* @param string public_slug Required. Public slug identifier for the logbook
* @param int limit Optional. Number of QSOs to return (default: 10, max: 50)
*
* @return json Returns JSON array with recent QSO data or error message
*
* @throws 404 Not Found - Logbook not found or empty logbook
* @throws 400 Bad Request - Invalid limit parameter
*
* @example
* Request: GET /api/recent_qsos/my-public-logbook/5
*
* Response:
* {
* "qsos": [
* {
* "date": "2024-01-15",
* "time": "14:30",
* "callsign": "W1AW",
* "mode": "SSB",
* "band": "20M",
* "rst_sent": "59",
* "rst_rcvd": "59"
* }
* ],
* "count": 1,
* "logbook_slug": "my-public-logbook"
* }
*/
function recent_qsos($public_slug = null, $limit = 10) {
header('Content-type: application/json');
if($public_slug == null) {
http_response_code(400);
echo json_encode(['status' => 'failed', 'reason' => 'missing public_slug parameter']);
return;
}
// Validate and sanitize limit parameter
$limit = intval($limit);
if ($limit <= 0) {
$limit = 10; // default
}
if ($limit > 50) {
$limit = 50; // maximum
}
$this->load->model('logbooks_model');
$this->load->model('logbook_model');
if($this->logbooks_model->public_slug_exists($public_slug)) {
$logbook_id = $this->logbooks_model->public_slug_exists_logbook_id($public_slug);
if($logbook_id != false) {
// Get associated station locations for mysql queries
$logbooks_locations_array = $this->logbooks_model->list_logbook_relationships($logbook_id);
if (!$logbooks_locations_array) {
http_response_code(404);
echo json_encode(['status' => 'failed', 'reason' => 'Empty Logbook']);
return;
}
// Get recent QSOs using existing method
$recent_qsos_query = $this->logbook_model->get_last_qsos($limit, $logbooks_locations_array);
if ($recent_qsos_query == null) {
http_response_code(404);
echo json_encode(['status' => 'failed', 'reason' => 'No QSOs found']);
return;
}
// Format the data for JSON response
$qsos = array();
foreach ($recent_qsos_query->result() as $row) {
$qso = array(
'date' => date('Y-m-d', strtotime($row->COL_TIME_ON)),
'time' => date('H:i', strtotime($row->COL_TIME_ON)),
'callsign' => strtoupper($row->COL_CALL),
'mode' => $row->COL_SUBMODE ? $row->COL_SUBMODE : $row->COL_MODE,
'band' => $row->COL_SAT_NAME ? $row->COL_SAT_NAME : $row->COL_BAND,
'rst_sent' => $row->COL_RST_SENT,
'rst_rcvd' => $row->COL_RST_RCVD
);
// Add optional fields if they exist
if ($row->COL_STX_STRING) {
$qso['stx_string'] = $row->COL_STX_STRING;
}
if ($row->COL_SRX_STRING) {
$qso['srx_string'] = $row->COL_SRX_STRING;
}
if ($row->COL_GRIDSQUARE) {
$qso['gridsquare'] = $row->COL_GRIDSQUARE;
}
if ($row->COL_QTH) {
$qso['qth'] = $row->COL_QTH;
}
if ($row->COL_NAME) {
$qso['name'] = $row->COL_NAME;
}
$qsos[] = $qso;
}
http_response_code(200);
echo json_encode([
'qsos' => $qsos,
'count' => count($qsos),
'logbook_slug' => $public_slug
], JSON_PRETTY_PRINT);
} else {
http_response_code(404);
echo json_encode(['status' => 'failed', 'reason' => $public_slug.' has no associated station locations']);
}
} else {
http_response_code(404);
echo json_encode(['status' => 'failed', 'reason' => 'logbook not found']);
}
}
}