mirror of
https://github.com/koala73/worldmonitor.git
synced 2026-04-26 01:24:59 +02:00
* feat(panels): Disease Outbreaks, Shipping Stress, Social Velocity, nuclear test site monitoring - Add HealthService proto with ListDiseaseOutbreaks RPC (WHO + ProMED RSS) - Add GetShippingStress RPC to SupplyChainService (Yahoo Finance carrier ETFs) - Add GetSocialVelocity RPC to IntelligenceService (Reddit r/worldnews + r/geopolitics) - Enrich earthquake seed with Haversine nuclear test-site proximity scoring - Add 5 nuclear test sites to NUCLEAR_FACILITIES (Punggye-ri, Lop Nur, Novaya Zemlya, Nevada NTS, Semipalatinsk) - Add shipping stress + social velocity seed loops to ais-relay.cjs - Add seed-disease-outbreaks.mjs Railway cron script - Wire all new RPCs: edge functions, handlers, gateway cache tiers, health.js STANDALONE_KEYS/SEED_META * fix(relay): apply gold standard retry/TTL-extend pattern to shipping-stress and social-velocity seeders * fix(review): address all PR #2375 review findings - health.js: shippingStress maxStaleMin 30→45 (3x interval), socialVelocity 20→30 (3x interval) - health.js: remove shippingStress/diseaseOutbreaks/socialVelocity from ON_DEMAND_KEYS (relay/cron seeds, not on-demand) - cache-keys.ts: add shippingStress, diseaseOutbreaks, socialVelocity to BOOTSTRAP_CACHE_KEYS - ais-relay.cjs: stressScore formula 50→40 (neutral market = moderate, not elevated) - ais-relay.cjs: fetchedAt Date.now() (consistent with other seeders) - ais-relay.cjs: deduplicate cross-subreddit article URLs in social velocity loop - seed-disease-outbreaks.mjs: WHO URL → specific DON RSS endpoint (not dead general news feed) - seed-disease-outbreaks.mjs: validate() requires outbreaks.length >= 1 (reject empty array) - seed-disease-outbreaks.mjs: stable id using hash(link) not array index - seed-disease-outbreaks.mjs: RSS regexes use [\s\S]*? for CDATA multiline content - seed-earthquakes.mjs: Lop Nur coordinates corrected (41.39,89.03 not 41.75,88.35) - seed-earthquakes.mjs: sourceVersion bumped to usgs-4.5-day-nuclear-v1 - earthquake.proto: fields 8-11 marked optional (distinguish not-enriched from enriched=false/0) - buf generate: regenerate seismology service stubs * revert(cache-keys): don't add new keys to bootstrap without frontend consumers * fix(panels): address all P1/P2/P3 review findings for PR #2375 - proto: add INT64_ENCODING_NUMBER annotation + sebuf import to get_shipping_stress.proto (run make generate) - bootstrap: register shippingStress (fast), socialVelocity (fast), diseaseOutbreaks (slow) in api/bootstrap.js + cache-keys.ts - relay: update WIDGET_SYSTEM_PROMPT with new bootstrap keys and live RPCs for health/supply-chain/intelligence - seeder: remove broken ProMED feed URL (promedmail.org/feed/ returns HTML 404); add 500K size guard to fetchRssItems; replace private COUNTRY_CODE_MAP with shared geo-extract.mjs; remove permanently-empty location field; bump sourceVersion to who-don-rss-v2 - handlers: remove dead .catch from all 3 new RPC handlers; fix stressLevel fallback to low; fix fetchedAt fallback to 0 - services: add fetchShippingStress, disease-outbreaks.ts, social-velocity.ts with getHydratedData consumers
204 lines
8.7 KiB
YAML
204 lines
8.7 KiB
YAML
openapi: 3.1.0
|
||
info:
|
||
title: SeismologyService API
|
||
version: 1.0.0
|
||
paths:
|
||
/api/seismology/v1/list-earthquakes:
|
||
get:
|
||
tags:
|
||
- SeismologyService
|
||
summary: ListEarthquakes
|
||
description: ListEarthquakes retrieves recent earthquakes from the USGS GeoJSON feed.
|
||
operationId: ListEarthquakes
|
||
parameters:
|
||
- name: start
|
||
in: query
|
||
description: Start of time range (inclusive), Unix epoch milliseconds.
|
||
required: false
|
||
schema:
|
||
type: string
|
||
format: int64
|
||
- name: end
|
||
in: query
|
||
description: End of time range (inclusive), Unix epoch milliseconds.
|
||
required: false
|
||
schema:
|
||
type: string
|
||
format: int64
|
||
- name: page_size
|
||
in: query
|
||
description: Maximum items per page (1-100).
|
||
required: false
|
||
schema:
|
||
type: integer
|
||
format: int32
|
||
- name: cursor
|
||
in: query
|
||
description: Cursor for next page.
|
||
required: false
|
||
schema:
|
||
type: string
|
||
- name: min_magnitude
|
||
in: query
|
||
description: Minimum magnitude filter (e.g., 4.0 for significant quakes).
|
||
required: false
|
||
schema:
|
||
type: number
|
||
format: double
|
||
responses:
|
||
"200":
|
||
description: Successful response
|
||
content:
|
||
application/json:
|
||
schema:
|
||
$ref: '#/components/schemas/ListEarthquakesResponse'
|
||
"400":
|
||
description: Validation error
|
||
content:
|
||
application/json:
|
||
schema:
|
||
$ref: '#/components/schemas/ValidationError'
|
||
default:
|
||
description: Error response
|
||
content:
|
||
application/json:
|
||
schema:
|
||
$ref: '#/components/schemas/Error'
|
||
components:
|
||
schemas:
|
||
Error:
|
||
type: object
|
||
properties:
|
||
message:
|
||
type: string
|
||
description: Error message (e.g., 'user not found', 'database connection failed')
|
||
description: Error is returned when a handler encounters an error. It contains a simple error message that the developer can customize.
|
||
FieldViolation:
|
||
type: object
|
||
properties:
|
||
field:
|
||
type: string
|
||
description: The field path that failed validation (e.g., 'user.email' for nested fields). For header validation, this will be the header name (e.g., 'X-API-Key')
|
||
description:
|
||
type: string
|
||
description: Human-readable description of the validation violation (e.g., 'must be a valid email address', 'required field missing')
|
||
required:
|
||
- field
|
||
- description
|
||
description: FieldViolation describes a single validation error for a specific field.
|
||
ValidationError:
|
||
type: object
|
||
properties:
|
||
violations:
|
||
type: array
|
||
items:
|
||
$ref: '#/components/schemas/FieldViolation'
|
||
description: List of validation violations
|
||
required:
|
||
- violations
|
||
description: ValidationError is returned when request validation fails. It contains a list of field violations describing what went wrong.
|
||
ListEarthquakesRequest:
|
||
type: object
|
||
properties:
|
||
start:
|
||
type: integer
|
||
format: int64
|
||
description: 'Start of time range (inclusive), Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript'
|
||
end:
|
||
type: integer
|
||
format: int64
|
||
description: 'End of time range (inclusive), Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript'
|
||
pageSize:
|
||
type: integer
|
||
format: int32
|
||
description: Maximum items per page (1-100).
|
||
cursor:
|
||
type: string
|
||
description: Cursor for next page.
|
||
minMagnitude:
|
||
type: number
|
||
format: double
|
||
description: Minimum magnitude filter (e.g., 4.0 for significant quakes).
|
||
description: ListEarthquakesRequest specifies filters for retrieving earthquake data from USGS.
|
||
ListEarthquakesResponse:
|
||
type: object
|
||
properties:
|
||
earthquakes:
|
||
type: array
|
||
items:
|
||
$ref: '#/components/schemas/Earthquake'
|
||
pagination:
|
||
$ref: '#/components/schemas/PaginationResponse'
|
||
description: ListEarthquakesResponse contains the list of earthquakes matching the request filters.
|
||
Earthquake:
|
||
type: object
|
||
properties:
|
||
id:
|
||
type: string
|
||
maxLength: 100
|
||
minLength: 1
|
||
description: Unique USGS event identifier (e.g., "us7000abcd").
|
||
place:
|
||
type: string
|
||
description: Human-readable place description (e.g., "10 km SW of Anchorage, Alaska").
|
||
magnitude:
|
||
type: number
|
||
format: double
|
||
description: Earthquake magnitude on the Richter scale.
|
||
depthKm:
|
||
type: number
|
||
format: double
|
||
description: Depth in kilometers below the surface.
|
||
location:
|
||
$ref: '#/components/schemas/GeoCoordinates'
|
||
occurredAt:
|
||
type: integer
|
||
format: int64
|
||
description: 'Time the earthquake occurred, as Unix epoch milliseconds.. Warning: Values > 2^53 may lose precision in JavaScript'
|
||
sourceUrl:
|
||
type: string
|
||
description: URL to the USGS event detail page.
|
||
nearTestSite:
|
||
type: boolean
|
||
description: True when epicenter is within 100 km of a known nuclear test site.
|
||
testSiteName:
|
||
type: string
|
||
description: Name of the nearest test site (e.g. "Punggye-ri"), when near_test_site is true.
|
||
concernScore:
|
||
type: number
|
||
format: double
|
||
description: Composite concern score 0–100 based on magnitude, depth, and proximity.
|
||
concernLevel:
|
||
type: string
|
||
description: 'Human-readable concern level: "low" | "moderate" | "elevated" | "critical".'
|
||
required:
|
||
- id
|
||
description: Earthquake represents a seismic event from USGS GeoJSON feed.
|
||
GeoCoordinates:
|
||
type: object
|
||
properties:
|
||
latitude:
|
||
type: number
|
||
maximum: 90
|
||
minimum: -90
|
||
format: double
|
||
description: Latitude in decimal degrees (-90 to 90).
|
||
longitude:
|
||
type: number
|
||
maximum: 180
|
||
minimum: -180
|
||
format: double
|
||
description: Longitude in decimal degrees (-180 to 180).
|
||
description: GeoCoordinates represents a geographic location using WGS84 coordinates.
|
||
PaginationResponse:
|
||
type: object
|
||
properties:
|
||
nextCursor:
|
||
type: string
|
||
description: Cursor for fetching the next page. Empty string indicates no more pages.
|
||
totalCount:
|
||
type: integer
|
||
format: int32
|
||
description: Total count of items matching the query, if known. Zero if the total is unknown.
|
||
description: PaginationResponse contains pagination metadata returned alongside list results.
|