@@ -2114,270 +2114,6 @@ function (Accept $type, string $id) use ($app) {
21142114 'application/vnd.elife.reviewed-preprint+json;version=1 '
21152115));
21162116
2117- $ app ->get ('/search ' , function (Request $ request , Accept $ type ) use ($ app ) {
2118- $ page = $ request ->query ->get ('page ' , 1 );
2119- $ perPage = $ request ->query ->get ('per-page ' , 10 );
2120-
2121- $ for = strtolower (trim ($ request ->query ->get ('for ' )));
2122-
2123- $ useDate = $ request ->query ->get ('use-date ' , 'default ' );
2124- $ sort = $ request ->query ->get ('sort ' , 'relevance ' );
2125- $ subjects = (array ) $ request ->query ->get ('subject ' , []);
2126- $ types = (array ) $ request ->query ->get ('type ' , []);
2127-
2128- $ startDate = DateTimeImmutable::createFromFormat ('Y-m-d ' , $ requestStartDate = $ request ->query ->get ('start-date ' , '2000-01-01 ' ), new DateTimeZone ('Z ' ));
2129- $ endDate = DateTimeImmutable::createFromFormat ('Y-m-d ' , $ requestEndDate = $ request ->query ->get ('end-date ' , '2999-12-31 ' ), new DateTimeZone ('Z ' ));
2130-
2131- if (!$ startDate || $ startDate ->format ('Y-m-d ' ) !== $ requestStartDate ) {
2132- throw new BadRequestHttpException ('Invalid start date ' );
2133- } elseif (!$ endDate || $ endDate ->format ('Y-m-d ' ) !== $ requestEndDate ) {
2134- throw new BadRequestHttpException ('Invalid end date ' );
2135- }
2136-
2137- $ startDate = $ startDate ->setTime (0 , 0 , 0 );
2138- $ endDate = $ endDate ->setTime (23 , 59 , 59 );
2139-
2140- if ($ endDate < $ startDate ) {
2141- throw new BadRequestHttpException ('End date must be on or after start date ' );
2142- }
2143-
2144- $ results = [];
2145-
2146- foreach ($ app ['articles ' ] as $ result ) {
2147- $ latest = null ;
2148- foreach ($ result ['versions ' ] as $ articleVersion ) {
2149- if (isset ($ articleVersion ['version ' ]) && (!$ latest || $ latest ['version ' ] < $ articleVersion ['version ' ])) {
2150- $ latest = $ articleVersion ;
2151- }
2152- }
2153- if ($ type ->getParameter ('version ' ) === '2 ' && isset ($ app ['reviewed-preprints ' ][$ latest ['id ' ]])) {
2154- $ reviewedPreprint = $ app ['reviewed-preprints ' ][$ latest ['id ' ]];
2155- $ latest ['reviewedDate ' ] = $ reviewedPreprint ['reviewedDate ' ];
2156- if (!empty ($ reviewedPreprint ['curationLabels ' ])) {
2157- $ latest ['curationLabels ' ] = $ reviewedPreprint ['curationLabels ' ];
2158- }
2159- }
2160- $ result = $ latest ;
2161- $ result ['_search ' ] = strtolower (json_encode ($ latest ));
2162- $ result = ArticleSnippet::prepare ($ result );
2163-
2164- if ('published ' === $ useDate ) {
2165- $ result ['_sort_date ' ] = DateTimeImmutable::createFromFormat (DATE_ATOM , $ result ['published ' ]);
2166- } else {
2167- $ result ['_sort_date ' ] = DateTimeImmutable::createFromFormat (DATE_ATOM , $ result ['statusDate ' ] ?? date (DATE_ATOM ));
2168- }
2169-
2170- $ results [] = $ result ;
2171- }
2172-
2173- $ contentTypes = [
2174- 'blog-article ' ,
2175- 'collection ' ,
2176- 'labs-post ' ,
2177- 'interview ' ,
2178- 'podcast-episode ' ,
2179- ];
2180-
2181- if ($ type ->getParameter ('version ' ) === '2 ' ) {
2182- foreach ($ app ['reviewed-preprints ' ] as $ result ) {
2183- if (!isset ($ app ['articles ' ][$ result ['id ' ]])) {
2184- $ result ['_search ' ] = strtolower (json_encode ($ result ));
2185- unset($ result ['indexContent ' ]);
2186- $ result ['type ' ] = 'reviewed-preprint ' ;
2187- $ result ['_sort_date ' ] = DateTimeImmutable::createFromFormat (DATE_ATOM , $ result ['statusDate ' ]);
2188- $ results [] = $ result ;
2189- }
2190- }
2191- $ contentTypes [] = 'reviewed-preprint ' ;
2192- }
2193-
2194- foreach ($ app ['blog-articles ' ] as $ result ) {
2195- $ result ['_search ' ] = strtolower (json_encode ($ result ));
2196- unset($ result ['content ' ]);
2197- unset($ result ['image ' ]);
2198- $ result ['type ' ] = 'blog-article ' ;
2199- $ result ['_sort_date ' ] = DateTimeImmutable::createFromFormat (DATE_ATOM , $ result ['published ' ]);
2200- $ results [] = $ result ;
2201- }
2202-
2203- foreach ($ app ['collections ' ] as $ result ) {
2204- $ result ['_search ' ] = strtolower (json_encode ($ result ));
2205- unset($ result ['curators ' ]);
2206- unset($ result ['summary ' ]);
2207- unset($ result ['content ' ]);
2208- unset($ result ['relatedContent ' ]);
2209- unset($ result ['podcastEpisodes ' ]);
2210- unset($ result ['image ' ]['banner ' ]);
2211- unset($ result ['image ' ]['social ' ]);
2212- $ result ['type ' ] = 'collection ' ;
2213- if ('published ' === $ useDate ) {
2214- $ result ['_sort_date ' ] = DateTimeImmutable::createFromFormat (DATE_ATOM , $ result ['published ' ]);
2215- } else {
2216- $ result ['_sort_date ' ] = DateTimeImmutable::createFromFormat (DATE_ATOM , $ result ['updated ' ] ?? $ result ['published ' ]);
2217- }
2218- $ results [] = $ result ;
2219- }
2220-
2221- foreach ($ app ['labs ' ] as $ result ) {
2222- $ result ['_search ' ] = strtolower (json_encode ($ result ));
2223- unset($ result ['content ' ]);
2224- unset($ result ['image ' ]['banner ' ]);
2225- unset($ result ['image ' ]['social ' ]);
2226- $ result ['type ' ] = 'labs-post ' ;
2227- $ result ['_sort_date ' ] = DateTimeImmutable::createFromFormat (DATE_ATOM , $ result ['published ' ]);
2228- $ results [] = $ result ;
2229- }
2230-
2231- foreach ($ app ['interviews ' ] as $ result ) {
2232- $ result ['_search ' ] = strtolower (json_encode ($ result ));
2233- unset($ result ['interviewee ' ]['cv ' ]);
2234- unset($ result ['content ' ]);
2235- unset($ result ['image ' ]['social ' ]);
2236- if (empty ($ result ['image ' ])) {
2237- unset($ result ['image ' ]);
2238- }
2239- $ result ['type ' ] = 'interview ' ;
2240- $ result ['_sort_date ' ] = DateTimeImmutable::createFromFormat (DATE_ATOM , $ result ['published ' ]);
2241- $ results [] = $ result ;
2242- }
2243-
2244- foreach ($ app ['podcast-episodes ' ] as $ result ) {
2245- $ result ['_search ' ] = strtolower (json_encode ($ result ));
2246- unset($ result ['chapters ' ]);
2247- unset($ result ['image ' ]['banner ' ]);
2248- unset($ result ['image ' ]['social ' ]);
2249- $ result ['type ' ] = 'podcast-episode ' ;
2250- $ result ['_sort_date ' ] = DateTimeImmutable::createFromFormat (DATE_ATOM , $ result ['published ' ]);
2251- $ results [] = $ result ;
2252- }
2253-
2254- if ('' !== $ for ) {
2255- $ results = array_filter ($ results , function ($ result ) use ($ for ) {
2256- return false !== strpos ($ result ['_search ' ], $ for );
2257- });
2258- }
2259-
2260- array_walk ($ results , function (&$ result ) {
2261- unset($ result ['_search ' ]);
2262- });
2263-
2264- $ allSubjects = array_values ($ app ['subjects ' ]);
2265-
2266- array_walk ($ allSubjects , function (&$ subject ) use ($ results ) {
2267- $ subject = [
2268- 'id ' => $ subject ['id ' ],
2269- 'name ' => $ subject ['name ' ],
2270- 'results ' => count (array_filter ($ results , function ($ result ) use ($ subject ) {
2271- return in_array ($ subject ['id ' ], array_map (function (array $ subject ) {
2272- return $ subject ['id ' ];
2273- }, $ result ['subjects ' ] ?? []));
2274- })),
2275- ];
2276- });
2277-
2278- $ allTypeKeys = [
2279- 'correction ' ,
2280- 'editorial ' ,
2281- 'expression-concern ' ,
2282- 'feature ' ,
2283- 'insight ' ,
2284- 'research-advance ' ,
2285- 'research-article ' ,
2286- 'research-communication ' ,
2287- 'retraction ' ,
2288- 'registered-report ' ,
2289- 'replication-study ' ,
2290- 'review-article ' ,
2291- 'scientific-correspondence ' ,
2292- 'short-report ' ,
2293- 'tools-resources ' ,
2294- ];
2295-
2296- if ($ type ->getParameter ('version ' ) === '2 ' ) {
2297- $ allTypeKeys [] = 'reviewed-preprint ' ;
2298- }
2299- $ allTypes = [];
2300- foreach (
2301- $ allTypeKeys as $ articleType
2302- ) {
2303- $ allTypes [$ articleType ] = count (array_filter ($ results , function ($ result ) use ($ articleType ) {
2304- return $ articleType === $ result ['type ' ];
2305- }));
2306- }
2307-
2308- foreach ($ contentTypes as $ contentType ) {
2309- $ allTypes [$ contentType ] = count (array_filter ($ results , function ($ result ) use ($ contentType ) {
2310- return $ contentType === $ result ['type ' ];
2311- }));
2312- }
2313-
2314- if (false === empty ($ types )) {
2315- $ results = array_filter ($ results , function ($ result ) use ($ types ) {
2316- return in_array ($ result ['type ' ], $ types );
2317- });
2318- }
2319-
2320- if (false === empty ($ subjects )) {
2321- $ results = array_filter ($ results , function ($ result ) use ($ subjects ) {
2322- return count (array_intersect ($ subjects , array_map (function (array $ subject ) {
2323- return $ subject ['id ' ];
2324- }, $ result ['subjects ' ] ?? [])));
2325- });
2326- }
2327-
2328- $ results = array_filter ($ results , function ($ result ) use ($ startDate ) {
2329- return $ result ['_sort_date ' ] >= $ startDate ;
2330- });
2331-
2332- $ results = array_filter ($ results , function ($ result ) use ($ endDate ) {
2333- return $ result ['_sort_date ' ] <= $ endDate ;
2334- });
2335-
2336- $ content = [
2337- 'total ' => count ($ results ),
2338- 'items ' => [],
2339- 'subjects ' => $ allSubjects ,
2340- 'types ' => $ allTypes ,
2341- ];
2342-
2343- if ('date ' === $ sort ) {
2344- usort ($ results , function (array $ a , array $ b ) {
2345- return $ b ['_sort_date ' ] <=> $ a ['_sort_date ' ];
2346- });
2347- }
2348-
2349- if ('asc ' === $ request ->query ->get ('order ' , 'desc ' )) {
2350- $ results = array_reverse ($ results );
2351- }
2352-
2353- $ results = array_slice ($ results , ($ page * $ perPage ) - $ perPage , $ perPage );
2354-
2355- if (0 === count ($ results ) && $ page > 1 ) {
2356- throw new NotFoundHttpException ('No page ' .$ page );
2357- }
2358-
2359- $ content ['items ' ] = array_map (function (array $ result ) {
2360- unset($ result ['_sort_date ' ]);
2361-
2362- return $ result ;
2363- }, $ results );
2364-
2365- $ headers = ['Content-Type ' => $ type ->getNormalizedValue ()];
2366-
2367- if ($ type ->getParameter ('version ' ) < 2 ) {
2368- $ headers ['Warning ' ] = sprintf ('299 elifesciences.org "Deprecation: Support for version %d will be removed" ' , $ type ->getParameter ('version ' ));
2369- }
2370-
2371- return new Response (
2372- json_encode ($ content , JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES ),
2373- Response::HTTP_OK ,
2374- $ headers
2375- );
2376- })->before ($ app ['negotiate.accept ' ](
2377- 'application/vnd.elife.search+json; version=2 ' ,
2378- 'application/vnd.elife.search+json; version=1 '
2379- ));
2380-
23812117$ app ->get ('/subjects ' , function (Request $ request , Accept $ type ) use ($ app ) {
23822118 $ subjects = $ app ['subjects ' ];
23832119
0 commit comments