get-wikipedia-article
Version:
Fetch Wikipedia article resources (e.g. title, body, links...).
68 lines (55 loc) • 1.73 kB
text/typescript
import {
queriesType,
wikipediaLanguageType as languageType,
} from 'fullfiller-common/src/types';
/**
* Join Wikipedia API base URL and `queries`.
* @param queries Object to be converted to query string.
* @returns URL to make API call.
*/
export function generateRequestURL(
language: languageType,
queries: queriesType
): string {
const baseAPI = `https://${language}.wikipedia.org/w/api.php?&format=json&origin=*&`;
const queryString = Object.entries(queries)
.map(([key, value]) =>
value === undefined ? key : `${key}=${value.toString()}`
)
.join('&');
const requestURL = baseAPI + queryString;
return requestURL;
}
type response = {
query: {
pages: {
[key: string]: Record<string, unknown>;
};
};
continue?: {
[key: string]: string;
};
};
/**
* @summary Fetch response from Wikipedia API.
* @param queries Object containing query string parameters.
* @returns Object containing json.query.pages[pageID] and json.continue (if it exists) contents.
*/
export async function fetchResource(
language: languageType,
queries: queriesType
): Promise<Record<string, unknown>> {
const url = generateRequestURL(language, queries);
const json = (await (await fetch(url)).json()) as response;
// API's response isn't returned in its entirety by this function.
// That's because the main part of the response is nested 3 layers deep.
// As shown in the `response` interface.
const { pages } = json.query;
const pagesID = Object.keys(pages)[0];
const resp = {
...pages[pagesID],
// some resources responses (e.g. links) include `continue` when there's more to fetch
...(json.continue && json.continue),
};
return resp;
}