Skip to content

Commit 2f2dd4b

Browse files
authored
Merge pull request #31 from nbonfils/fix-inconsistent-fetch
Fix inconsistent fetch of works
2 parents 410cd61 + 2a743bc commit 2f2dd4b

File tree

2 files changed

+34
-16
lines changed

2 files changed

+34
-16
lines changed

src/index.html

+2-8
Original file line numberDiff line numberDiff line change
@@ -75,14 +75,8 @@ <h1 class="center" >Bibliograph 2</h1>
7575
<template x-if="tab === 'url'">
7676
<form @submit.prevent="
7777
loading('corpus', 'Fetching corpus from OpenAlex API');
78-
works = await fetchWorksFromUrl(apiUrl, maxWorks);
79-
done();
80-
loading('filters', 'Processing corpus data');
81-
setTimeout(() => {
82-
data = processWorks(works);
83-
filters = getFilters(data);
84-
done();
85-
}, 10);" >
78+
({count, works} = await fetchWorksFromUrl(apiUrl, maxWorks));
79+
done();" >
8680
<textarea id="apiurl"
8781
class="card w-100"
8882
placeholder="Paste the OpenAlex API URL here..."

src/lib/fetch.js

+32-8
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,28 @@ const toQueryParams = (params) => {
1919
return queryParams;
2020
};
2121

22+
const fetchWorksCount = async (filter) => {
23+
let count = 0;
24+
try {
25+
const response = await fetch(
26+
"https://api.openalex.org/works?" + new URLSearchParams({
27+
filter,
28+
select: "id",
29+
mailto: `****@****.com`,
30+
"per-page": 1,
31+
page: 1,
32+
}).toString());
33+
if (!response.ok) {
34+
throw new Error("Network response was not 200 OK");
35+
}
36+
const data = await response.json();
37+
count = data.meta.count;
38+
} catch (e) {
39+
console.error(`Error while fetching works count:\n\t${e}`);
40+
}
41+
return count;
42+
};
43+
2244
export const fetchWorks = async (params, maxWorks) => {
2345
const qp = toQueryParams(params);
2446
let works = [];
@@ -27,7 +49,6 @@ export const fetchWorks = async (params, maxWorks) => {
2749
if (qp.title || qp.titleabs ||
2850
qp.titleabsfull || qp.concepts) {
2951
const filters = [];
30-
const numReq = Math.ceil(maxWorks / perPage);
3152

3253
if (qp.fromYear) {
3354
filters.push(`from_publication_date:${qp.fromYear}-01-01`);
@@ -50,6 +71,9 @@ export const fetchWorks = async (params, maxWorks) => {
5071
filters.push(`concepts.id:${qp.concepts}`);
5172
}
5273

74+
count = await fetchWorksCount(filters.join(","));
75+
const numReq = Math.ceil(Math.min(count, maxWorks) / perPage);
76+
5377
works = await Promise.all([...Array(numReq).keys()].map(async (i) => {
5478
let data = {};
5579
try {
@@ -63,10 +87,9 @@ export const fetchWorks = async (params, maxWorks) => {
6387
page: i+1,
6488
}).toString());
6589
if (!response.ok) {
66-
throw new Error("Network response was not OK");
90+
throw new Error("Network response was not 200 OK");
6791
}
6892
data = await response.json();
69-
count = data.meta.count;
7093
} catch (e) {
7194
console.error(`Error while fetching works:\n\t${e}`);
7295
}
@@ -85,26 +108,27 @@ export const checkApiUrl = (url) => {
85108

86109
export const fetchWorksFromUrl = async (url, maxWorks) => {
87110
let works = [];
88-
const numReq = Math.ceil(maxWorks / perPage);
89111

90112
const urlObj = new URL(url);
91113
const filter = urlObj.searchParams.get("filter");
92-
const sort = urlObj.searchParams.get("sort");
114+
115+
const count = await fetchWorksCount(filter);
116+
const numReq = Math.ceil(Math.min(count, maxWorks) / perPage);
93117

94118
works = await Promise.all([...Array(numReq).keys()].map(async (i) => {
95119
let data = {};
96120
try {
97121
const response = await fetch(
98122
"https://api.openalex.org/works?" + new URLSearchParams({
99123
filter,
100-
sort,
124+
sort: 'cited_by_count:desc',
101125
select: "id,title,publication_year,primary_location,authorships,concepts,locations,grants,referenced_works,cited_by_count",
102126
mailto: `****@****.com`,
103127
"per-page": perPage,
104128
page: i+1,
105129
}).toString());
106130
if (!response.ok) {
107-
throw new Error("Network response was not OK");
131+
throw new Error("Network response was not 200 OK");
108132
}
109133
data = await response.json();
110134
} catch (e) {
@@ -114,7 +138,7 @@ export const fetchWorksFromUrl = async (url, maxWorks) => {
114138
}));
115139

116140
works = works.flat().slice(0, maxWorks).filter(work => work);
117-
return works;
141+
return {count, works};
118142
};
119143

120144
export const fetchRefsLabels = async (openalexIds, maxRefs = 500) => {

0 commit comments

Comments
 (0)