@@ -19,6 +19,28 @@ const toQueryParams = (params) => {
19
19
return queryParams ;
20
20
} ;
21
21
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
+
22
44
export const fetchWorks = async ( params , maxWorks ) => {
23
45
const qp = toQueryParams ( params ) ;
24
46
let works = [ ] ;
@@ -27,7 +49,6 @@ export const fetchWorks = async (params, maxWorks) => {
27
49
if ( qp . title || qp . titleabs ||
28
50
qp . titleabsfull || qp . concepts ) {
29
51
const filters = [ ] ;
30
- const numReq = Math . ceil ( maxWorks / perPage ) ;
31
52
32
53
if ( qp . fromYear ) {
33
54
filters . push ( `from_publication_date:${ qp . fromYear } -01-01` ) ;
@@ -50,6 +71,9 @@ export const fetchWorks = async (params, maxWorks) => {
50
71
filters . push ( `concepts.id:${ qp . concepts } ` ) ;
51
72
}
52
73
74
+ count = await fetchWorksCount ( filters . join ( "," ) ) ;
75
+ const numReq = Math . ceil ( Math . min ( count , maxWorks ) / perPage ) ;
76
+
53
77
works = await Promise . all ( [ ...Array ( numReq ) . keys ( ) ] . map ( async ( i ) => {
54
78
let data = { } ;
55
79
try {
@@ -63,10 +87,9 @@ export const fetchWorks = async (params, maxWorks) => {
63
87
page : i + 1 ,
64
88
} ) . toString ( ) ) ;
65
89
if ( ! response . ok ) {
66
- throw new Error ( "Network response was not OK" ) ;
90
+ throw new Error ( "Network response was not 200 OK" ) ;
67
91
}
68
92
data = await response . json ( ) ;
69
- count = data . meta . count ;
70
93
} catch ( e ) {
71
94
console . error ( `Error while fetching works:\n\t${ e } ` ) ;
72
95
}
@@ -85,26 +108,27 @@ export const checkApiUrl = (url) => {
85
108
86
109
export const fetchWorksFromUrl = async ( url , maxWorks ) => {
87
110
let works = [ ] ;
88
- const numReq = Math . ceil ( maxWorks / perPage ) ;
89
111
90
112
const urlObj = new URL ( url ) ;
91
113
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 ) ;
93
117
94
118
works = await Promise . all ( [ ...Array ( numReq ) . keys ( ) ] . map ( async ( i ) => {
95
119
let data = { } ;
96
120
try {
97
121
const response = await fetch (
98
122
"https://api.openalex.org/works?" + new URLSearchParams ( {
99
123
filter,
100
- sort,
124
+ sort : 'cited_by_count:desc' ,
101
125
select : "id,title,publication_year,primary_location,authorships,concepts,locations,grants,referenced_works,cited_by_count" ,
102
126
mailto : `****@****.com` ,
103
127
"per-page" : perPage ,
104
128
page : i + 1 ,
105
129
} ) . toString ( ) ) ;
106
130
if ( ! response . ok ) {
107
- throw new Error ( "Network response was not OK" ) ;
131
+ throw new Error ( "Network response was not 200 OK" ) ;
108
132
}
109
133
data = await response . json ( ) ;
110
134
} catch ( e ) {
@@ -114,7 +138,7 @@ export const fetchWorksFromUrl = async (url, maxWorks) => {
114
138
} ) ) ;
115
139
116
140
works = works . flat ( ) . slice ( 0 , maxWorks ) . filter ( work => work ) ;
117
- return works ;
141
+ return { count , works} ;
118
142
} ;
119
143
120
144
export const fetchRefsLabels = async ( openalexIds , maxRefs = 500 ) => {
0 commit comments