mirror of
https://git.ianrenton.com/ian/spothole.git
synced 2026-08-08 19:41:41 +00:00
Merge branch '95-send-spots-to-xota' into 2.0-pre
# Conflicts: # README.md # core/config.py # server/handlers/api/addspot.py # server/handlers/api/lookups.py # server/handlers/api/options.py # server/webserver.py # spothole.py # static/apidocs/openapi.yml
This commit is contained in:
+111
-41
@@ -16,13 +16,22 @@ info:
|
||||
## Changelog
|
||||
|
||||
### 2.0
|
||||
|
||||
|
||||
* POST `/spot` now supports upstream submission to the spotting services associated with various SIGs.
|
||||
* **Breaking change:** The "add spot" API has changed to enable this: instead of just posting the spot object itself as the JSON content of the POST, this has moved into a `spot` object within the structure. A new `handling` object alongside it contains the `submit_upstream`, `upstream_provider`, `upstream_credentials`, and `captcha_token` fields which control the server handling of the spot.
|
||||
* POST `/spot` now supports Google reCaptcha and (if the site owner has set it up) now requires `captcha_token` in order to successfully submit. (This is used to lock down the submit function and prevent submission via Spothole by bots or third-party clients.)
|
||||
* GET `/options` now returns `spot_submit_providers`, a map of SIG names to the names of providers that support upstream spot submission for that SIG. (This allows clients to present the user with options of where a new spot can be sent to.)
|
||||
* **Breaking change:** A user's QRZ.com and HamQTH credentials are now supplied as request headers (`X-QRZ-Username`, `X-QRZ-Password`, `X-QRZ-Session-Key`, `X-HamQTH-Username`, `X-HamQTH-Password`, `X-HamQTH-Session-ID`) rather than query parameters, to keep credentials out of server logs.
|
||||
* Added `sig_ref_data_providers`, `static_data_providers` and `callsign_data_providers` to `/status` response
|
||||
* Added `callsign_data_providers` to `/options` response
|
||||
* BREAKING: Removed `cleanup` from `/status` response
|
||||
* BREAKING: in the `/options` response, renamed `spot_sources` and `alert_sources` to `spot_providers` and
|
||||
* **Breaking change:** Removed `cleanup` from `/status` response
|
||||
* **Breaking change:** in the `/options` response, renamed `spot_sources` and `alert_sources` to `spot_providers` and
|
||||
`alert_providers`
|
||||
|
||||
### 1.5
|
||||
|
||||
No API changes.
|
||||
|
||||
### 1.4
|
||||
|
||||
* Spots can now include a "propagation_mode" field, and the `/options` call enumerates the options that can have.
|
||||
@@ -52,9 +61,10 @@ info:
|
||||
license:
|
||||
name: The Unlicense
|
||||
url: https://unlicense.org/#the-unlicense
|
||||
version: v2.0
|
||||
version: 2.0
|
||||
|
||||
servers:
|
||||
- url: https://spothole.app/api/v1
|
||||
- url: https://spothole.app/api/v2
|
||||
|
||||
tags:
|
||||
- name: Spots
|
||||
@@ -335,7 +345,8 @@ paths:
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
type: string
|
||||
example: "Failed"
|
||||
|
||||
|
||||
/lookup/sigref:
|
||||
@@ -363,7 +374,8 @@ paths:
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
type: string
|
||||
example: "Failed"
|
||||
|
||||
|
||||
|
||||
@@ -389,7 +401,8 @@ paths:
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
type: string
|
||||
example: "Failed"
|
||||
|
||||
|
||||
/spot:
|
||||
@@ -398,50 +411,53 @@ paths:
|
||||
- Spots
|
||||
summary: Add a spot
|
||||
description: >
|
||||
Supply a new spot object, which will be added to the system. Currently, this will not be
|
||||
reported up the chain to a cluster, POTA, SOTA etc. This may be introduced in a future version.
|
||||
cURL example: `curl --request POST --header "Content-Type: application/json" --data
|
||||
'{"dx_call":"M0TRT","time":1760019539, "freq":14200000, "comment":"Test spot please ignore",
|
||||
"de_call":"M0TRT"}' https://spothole.app/api/v1/spot`
|
||||
Supply a JSON object containing a `spot` sub-object (the spot data) and an optional `handling` sub-object
|
||||
containing server-side instructions such as upstream submission). Check `spot_submit_providers` in the
|
||||
`/options` response to see which SIGs and providers support upstream submission. cURL example:
|
||||
`curl --request POST --header \"Content-Type: application/json\" --data '{\"spot\":{\"dx_call\":\"M0TRT\",\"time\":1760019539,\"freq\":14200000,\"comment\":\"Test spot please ignore\",\"de_call\":\"M0TRT\"}}' https://spothole.app/api/v2/spot`"
|
||||
operationId: spot
|
||||
requestBody:
|
||||
description: The JSON spot object
|
||||
description: Object containing a "spot" sub-object with the spot data, and an optional "handling" sub-object with server-side instructions of what to do with it.
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Spot'
|
||||
$ref: '#/components/schemas/SpotSubmission'
|
||||
responses:
|
||||
'200':
|
||||
'201':
|
||||
description: Success
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/OkResponse'
|
||||
type: string
|
||||
example: "OK"
|
||||
'415':
|
||||
description: Incorrect Content-Type
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
type: string
|
||||
example: "Failed"
|
||||
'422':
|
||||
description: Validation error
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
type: string
|
||||
example: "Failed"
|
||||
'500':
|
||||
description: Internal server error
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/ErrorResponse'
|
||||
type: string
|
||||
example: "Failed"
|
||||
|
||||
components:
|
||||
parameters:
|
||||
QrzUsername:
|
||||
name: qrz_username
|
||||
in: query
|
||||
name: X-QRZ-Username
|
||||
in: header
|
||||
description: >
|
||||
QRZ.com username for online callsign lookup, which will enrich the returned spots and alerts
|
||||
with extra data. Requires a QRZ.com XML Subscriber (paid) account. Supply together with
|
||||
@@ -449,14 +465,14 @@ components:
|
||||
schema:
|
||||
type: string
|
||||
QrzPassword:
|
||||
name: qrz_password
|
||||
in: query
|
||||
name: X-QRZ-Password
|
||||
in: header
|
||||
description: QRZ.com password. Supply together with `qrz_username`.
|
||||
schema:
|
||||
type: string
|
||||
QrzSessionKey:
|
||||
name: qrz_session_key
|
||||
in: query
|
||||
name: X-QRZ-Session-Key
|
||||
in: header
|
||||
description: >
|
||||
A pre-obtained QRZ.com XML session key, as an alternative to supplying `qrz_username` and
|
||||
`qrz_password`. See https://www.qrz.com/docs/xml/current_spec.html for details on how to
|
||||
@@ -464,22 +480,22 @@ components:
|
||||
schema:
|
||||
type: string
|
||||
HamqthUsername:
|
||||
name: hamqth_username
|
||||
in: query
|
||||
name: X-HamQTH-Username
|
||||
in: header
|
||||
description: >
|
||||
HamQTH username for online callsign lookup, which will enrich the returned spots and alerts
|
||||
with extra data. Supply together with `hamqth_password`, or supply `hamqth_session_id` instead.
|
||||
schema:
|
||||
type: string
|
||||
HamqthPassword:
|
||||
name: hamqth_password
|
||||
in: query
|
||||
name: X-HamQTH-Password
|
||||
in: header
|
||||
description: HamQTH password. Supply together with `hamqth_username`.
|
||||
schema:
|
||||
type: string
|
||||
HamqthSessionId:
|
||||
name: hamqth_session_id
|
||||
in: query
|
||||
name: X-HamQTH-Session-ID
|
||||
in: header
|
||||
description: >
|
||||
A pre-obtained HamQTH session ID, as an alternative to supplying `hamqth_username` and
|
||||
`hamqth_password`. See https://www.hamqth.com/developers.php for details on how to retrieve
|
||||
@@ -1190,6 +1206,54 @@ components:
|
||||
$ref: "#/components/schemas/PropagationMode"
|
||||
|
||||
|
||||
SpotSubmission:
|
||||
description: >
|
||||
Request body for POST /spot. Contains a "spot" sub-object with the spot data, and an optional
|
||||
"handling" sub-object with server-side instructions consumed by Spothole.
|
||||
type: object
|
||||
required:
|
||||
- spot
|
||||
properties:
|
||||
spot:
|
||||
$ref: '#/components/schemas/Spot'
|
||||
handling:
|
||||
type: object
|
||||
description: >
|
||||
Optional server-side instructions for how to process this spot submission.
|
||||
properties:
|
||||
submit_upstream:
|
||||
type: boolean
|
||||
description: >
|
||||
If true, forward the spot to an external upstream provider (e.g. POTA, SOTA) rather
|
||||
than only adding it to this Spothole server. Requires `sig`, at least one `sig_refs`
|
||||
entry, and `upstream_provider` to be set. Check `spot_submit_providers` in the
|
||||
/options response to see which SIGs and providers support this.
|
||||
default: false
|
||||
upstream_provider:
|
||||
type: string
|
||||
description: >
|
||||
Name of the upstream provider to submit the spot to, e.g. "POTA" or "SOTA". Must
|
||||
match one of the provider names returned in `spot_submit_providers` for the chosen SIG.
|
||||
example: POTA
|
||||
upstream_credentials:
|
||||
type: object
|
||||
description: >
|
||||
Provider-specific credentials required to authenticate the upstream submission.
|
||||
The required keys depend on the provider. Credentials are used only for the upstream
|
||||
call and are never stored by Spothole.
|
||||
additionalProperties:
|
||||
type: string
|
||||
example:
|
||||
user_id: "12345"
|
||||
api_key: "abc123"
|
||||
captcha_token:
|
||||
type: string
|
||||
description: >
|
||||
A Google reCAPTCHA v2 response token. Required when submitting upstream if the
|
||||
server has reCAPTCHA configured. Obtain the token by completing the reCAPTCHA
|
||||
widget rendered on the Add Spot page.
|
||||
example: "03AFY_a8Xq..."
|
||||
|
||||
SpotStream:
|
||||
type: object
|
||||
description: A server-sent event containing a spot
|
||||
@@ -1810,14 +1874,6 @@ components:
|
||||
items:
|
||||
$ref: '#/components/schemas/Alert'
|
||||
|
||||
OkResponse:
|
||||
type: string
|
||||
example: "OK"
|
||||
|
||||
ErrorResponse:
|
||||
type: string
|
||||
example: "Failed"
|
||||
|
||||
DxStats:
|
||||
type: object
|
||||
description: Spot counts keyed by DE continent
|
||||
@@ -1971,7 +2027,7 @@ components:
|
||||
type: integer
|
||||
description: >
|
||||
The maximum age, in seconds, of any spot before it will be deleted by the system. When
|
||||
querying the /api/v1/spots endpoint and providing a "max_age" or "since" parameter, there
|
||||
querying the /api/v2/spots endpoint and providing a "max_age" or "since" parameter, there
|
||||
is no point providing a number larger than this, because the system drops all spots older
|
||||
than this.
|
||||
example: 3600
|
||||
@@ -1981,6 +2037,20 @@ components:
|
||||
Whether the POST /spot call, to add spots to the server directly via its API, is permitted
|
||||
on this server.
|
||||
example: true
|
||||
spot_submit_providers:
|
||||
type: object
|
||||
description: >
|
||||
A map of SIG name to a list of provider names that support upstream spot submission for that SIG.
|
||||
If a SIG appears as a key here, the POST /spot endpoint accepts `submit_upstream: true` for
|
||||
spots with that SIG, and will forward the spot to one of the listed providers. Omitted if no
|
||||
providers support upstream submission.
|
||||
additionalProperties:
|
||||
type: array
|
||||
items:
|
||||
type: string
|
||||
example:
|
||||
POTA: [ POTA ]
|
||||
SOTA: [ SOTA, GMA, ParksNPeaks ]
|
||||
|
||||
CallsignData:
|
||||
type: object
|
||||
|
||||
Reference in New Issue
Block a user