Skip to content

Commit ca7fc6a

Browse files
committed
Migrate search endpoint to a specific handling class
elifesciences/issues#9169
1 parent f762522 commit ca7fc6a

File tree

2 files changed

+269
-264
lines changed

2 files changed

+269
-264
lines changed

src/bootstrap.php

Lines changed: 0 additions & 264 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)