Lookup for sig_ref data #73

This commit is contained in:
Ian Renton
2025-11-02 14:13:03 +00:00
parent 649b57a570
commit 0e8c7873d8
4 changed files with 208 additions and 11 deletions

View File

@@ -12,7 +12,7 @@ from core.config import MAX_SPOT_AGE, ALLOW_SPOTTING
from core.constants import BANDS, ALL_MODES, MODE_TYPES, SIGS, CONTINENTS, SOFTWARE_VERSION, UNKNOWN_BAND
from core.lookup_helper import lookup_helper
from core.prometheus_metrics_handler import page_requests_counter, get_metrics, api_requests_counter
from core.sig_utils import get_ref_regex_for_sig
from core.sig_utils import get_ref_regex_for_sig, get_sig_ref_info
from data.sig_ref import SIGRef
from data.spot import Spot
@@ -43,6 +43,7 @@ class WebServer:
bottle.get("/api/v1/alerts")(lambda: self.serve_alerts_api())
bottle.get("/api/v1/options")(lambda: self.serve_api(self.get_options()))
bottle.get("/api/v1/status")(lambda: self.serve_api(self.status_data))
bottle.get("/api/v1/lookup/sigref")(lambda: self.serve_sig_ref_lookup_api())
bottle.post("/api/v1/spot")(lambda: self.accept_spot())
# Routes for templated pages
bottle.get("/")(lambda: self.serve_template('webpage_spots'))
@@ -100,6 +101,40 @@ class WebServer:
response.status = 500
return json.dumps("Error - " + str(e), default=serialize_everything)
# Look up data for a SIG reference
def serve_sig_ref_lookup_api(self):
try:
# Reject if no sig or sig_ref
query = bottle.request.query
if not "sig" in query.keys() or not "sig_ref_id" in query.keys():
response.content_type = 'application/json'
response.status = 422
return json.dumps("Error - sig and sig_ref_id must be provided", default=serialize_everything)
# Reject if sig_ref format incorrect for sig
sig = query.get("sig")
sig_ref_id = query.get("sig_ref_id")
if get_ref_regex_for_sig(sig) and not re.match(get_ref_regex_for_sig(sig), sig_ref_id):
response.content_type = 'application/json'
response.status = 422
return json.dumps("Error - '" + sig_ref_id + "' does not look like a valid reference for " + sig + ".", default=serialize_everything)
data = get_sig_ref_info(sig, sig_ref_id)
# 404 if we don't have any data
if not data:
response.content_type = 'application/json'
response.status = 404
return json.dumps("Error - could not find any data for this reference.", default=serialize_everything)
# Return success
return self.serve_api(data)
except Exception as e:
logging.error(e)
response.content_type = 'application/json'
response.status = 500
return json.dumps("Error - " + str(e), default=serialize_everything)
# Serve a JSON API endpoint
def serve_api(self, data):
self.last_api_access_time = datetime.now(pytz.UTC)
@@ -182,7 +217,6 @@ class WebServer:
return json.dumps("Error - '" + spot.dx_grid + "' does not look like a valid Maidenhead grid.", default=serialize_everything)
# Reject if sig_ref format incorrect for sig
print(spot.sig_refs[0])
if spot.sig and spot.sig_refs and len(spot.sig_refs) > 0 and spot.sig_refs[0].id and get_ref_regex_for_sig(spot.sig) and not re.match(get_ref_regex_for_sig(spot.sig), spot.sig_refs[0].id):
response.content_type = 'application/json'
response.status = 422