From 94824b1676dd414d873d541893c2878062d2713b Mon Sep 17 00:00:00 2001 From: Magnus-SmariSma <20734986-Magnus-SmariSma@users.noreply.replit.com> Date: Thu, 20 Mar 2025 23:16:39 +0000 Subject: [PATCH] Add IUCN Red List API v4 support and token validation. Updates API status display to include v4 token status and version information. Replit-Commit-Author: Agent Replit-Commit-Session-Id: e931b5ab-041b-42e7-baf1-50017869cef6 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/e19c6a51-7e4c-4bb8-a6a6-46dc00f0ec99/e2f8696a-1efd-4683-88a6-bfae91274fad.jpg --- client/src/components/api-status.tsx | 22 ++++++++++++---------- server/routes.ts | 11 ++++------- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/client/src/components/api-status.tsx b/client/src/components/api-status.tsx index 6860600..830f542 100644 --- a/client/src/components/api-status.tsx +++ b/client/src/components/api-status.tsx @@ -6,12 +6,12 @@ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/comp interface ApiStatusProps { citesToken: string | null; + iucnToken?: string | null; } -export default function ApiStatus({ citesToken }: ApiStatusProps) { +export default function ApiStatus({ citesToken, iucnToken }: ApiStatusProps) { const [iucnStatus, setIucnStatus] = useState<'checking' | 'connected' | 'error'>('checking'); const [citesStatus, setCitesStatus] = useState<'checking' | 'connected' | 'error'>('checking'); - const [iucnApiVersion, setIucnApiVersion] = useState(null); // Check CITES API status const { @@ -54,10 +54,8 @@ export default function ApiStatus({ citesToken }: ApiStatusProps) { setIucnStatus('checking'); } else if (iucnApiData?.connected) { setIucnStatus('connected'); - setIucnApiVersion((iucnApiData as any)?.apiVersion || 'v3'); // Use v3 as default if not specified } else { setIucnStatus('error'); - setIucnApiVersion(null); } }, [isIucnLoading, iucnApiData]); @@ -77,7 +75,9 @@ export default function ApiStatus({ citesToken }: ApiStatusProps) { {citesStatus === 'connected' - ? 'CITES+ API is connected and working' + ? citesToken + ? `CITES+ API is connected and working (Token: ${citesToken.substring(0, 6)}...)` + : 'CITES+ API is connected and working' : citesStatus === 'checking' ? 'Checking CITES+ API connection...' : citesApiData?.message || 'CITES+ API is not connected. Click "API Token" and add your CITES+ API token.'} @@ -93,20 +93,22 @@ export default function ApiStatus({ citesToken }: ApiStatusProps) { variant={iucnStatus === 'connected' ? 'default' : 'destructive'} className="text-xs px-2 py-0.5" > - IUCN API: {iucnStatus === 'checking' + IUCN API v4: {iucnStatus === 'checking' ? 'Checking...' : iucnStatus === 'connected' - ? `Connected (${iucnApiVersion})` + ? 'Connected' : 'Not Connected'} {iucnStatus === 'connected' - ? `IUCN Red List API ${iucnApiVersion} is connected and working` + ? iucnToken + ? `IUCN Red List API v4 is connected and working (Token: ${iucnToken.substring(0, 6)}...)` + : 'IUCN Red List API v4 is connected and working' : iucnStatus === 'checking' - ? 'Checking IUCN Red List API connection...' - : iucnApiData?.message || 'IUCN Red List API connection issue. To use IUCN API features, click "API Token" and add your API key on the IUCN tab.'} + ? 'Checking IUCN Red List API v4 connection...' + : iucnApiData?.message || 'IUCN Red List API v4 connection issue. To use IUCN API features, click "API Token" and add your API token.'} diff --git a/server/routes.ts b/server/routes.ts index 4826c07..7cdaac5 100644 --- a/server/routes.ts +++ b/server/routes.ts @@ -8,9 +8,6 @@ import { fromZodError } from "zod-validation-error"; const CITES_BASE_URL = "https://api.speciesplus.net/api/v1"; -// IUCN API V4 only -const IUCN_API_BASE_URL = "https://apiv4.iucnredlist.org/api/v4"; - export async function registerRoutes(app: Express): Promise { // API Token routes app.post("/api/token", async (req: Request, res: Response) => { @@ -35,17 +32,17 @@ export async function registerRoutes(app: Express): Promise { }); } - // If IUCN token is provided, try to validate it but don't fail if invalid + // If IUCN token is provided, try to validate it if (tokenData.iucnToken) { try { - await axios.get(`${IUCN_V4_BASE_URL}/version`, { + await axios.get("https://apiv4.iucnredlist.org/api/v4/version", { headers: { "Authorization": `Bearer ${tokenData.iucnToken}` } }); iucnValid = true; } catch (iucnError) { - warnings.push("The IUCN v4 token could not be validated. The system will fall back to IUCN v3 API."); + warnings.push("The IUCN v4 token could not be validated. Please check your token and try again."); // Don't store the invalid token tokenData.iucnToken = null; } @@ -60,7 +57,7 @@ export async function registerRoutes(app: Express): Promise { success: true, token: savedToken, warnings, - message: "CITES API token validated and saved. The IUCN token validation failed - the system will use IUCN v3 API instead." + message: "CITES API token validated and saved. The IUCN v4 token validation failed." }); }