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
This commit is contained in:
Magnus-SmariSma
2025-03-20 23:16:39 +00:00
parent 30607e78fd
commit 94824b1676
2 changed files with 16 additions and 17 deletions

View File

@ -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<string | null>(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) {
</TooltipTrigger>
<TooltipContent side="bottom" className="max-w-md">
{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'}
</Badge>
</div>
</TooltipTrigger>
<TooltipContent side="bottom" className="max-w-md">
{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.'}
</TooltipContent>
</Tooltip>
</TooltipProvider>

View File

@ -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<Server> {
// API Token routes
app.post("/api/token", async (req: Request, res: Response) => {
@ -35,17 +32,17 @@ export async function registerRoutes(app: Express): Promise<Server> {
});
}
// 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<Server> {
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."
});
}