|
6 | 6 |
|
7 | 7 | use App\Api\Services\Base\AbstractApiController; |
8 | 8 | use App\Api\Services\Projects\ProjectsApiFacade; |
9 | | -use App\DB\Entity\Api\ResponseCache; |
10 | 9 | use App\DB\Entity\Project\Program; |
11 | 10 | use App\DB\Entity\Project\ProgramDownloads; |
12 | 11 | use App\Project\AddProjectRequest; |
@@ -112,22 +111,33 @@ public function projectsFeaturedGet(string $platform, string $max_version, int $ |
112 | 111 |
|
113 | 112 | /** |
114 | 113 | * @throws \JsonException |
115 | | - * @throws \DateMalformedStringException |
| 114 | + * @throws \Psr\Cache\InvalidArgumentException |
116 | 115 | */ |
117 | 116 | #[\Override] |
118 | 117 | public function projectsGet(string $category, string $accept_language, string $max_version, int $limit, int $offset, string $attributes, string $flavor, int &$responseCode, array &$responseHeaders): array |
119 | 118 | { |
120 | 119 | $locale = $this->facade->getResponseManager()->sanitizeLocale($accept_language); |
121 | | - |
122 | 120 | $cache_id = sprintf('projectsGet_%s_%s_%s_%s_%d_%d', $category, $locale, $flavor, $max_version, $limit, $offset); |
123 | | - if ('recent' !== $category) { |
124 | | - $cached_response = $this->facade->getResponseManager()->getCachedResponse($cache_id); |
125 | | - if ($cached_response instanceof ResponseCache) { |
126 | | - $responseCode = $cached_response->getResponseCode(); |
127 | | - $responseHeaders = $this->facade->getResponseManager()->extractResponseHeader($cached_response); |
128 | | - |
129 | | - return $this->facade->getResponseManager()->extractResponseObject($cached_response); |
130 | | - } |
| 121 | + |
| 122 | + // Don't cache 'recent' category as it changes frequently |
| 123 | + if ('recent' === $category) { |
| 124 | + $user = $this->facade->getAuthenticationManager()->getAuthenticatedUser(); |
| 125 | + $projects = $this->facade->getLoader()->getProjectsFromCategory($category, $max_version, $limit, $offset, $flavor, $user); |
| 126 | + |
| 127 | + $responseCode = Response::HTTP_OK; |
| 128 | + $response = $this->facade->getResponseManager()->createProjectsDataResponse($projects, $attributes); |
| 129 | + $this->facade->getResponseManager()->addResponseHashToHeaders($responseHeaders, $response); |
| 130 | + $this->facade->getResponseManager()->addContentLanguageToHeaders($responseHeaders); |
| 131 | + |
| 132 | + return $response; |
| 133 | + } |
| 134 | + |
| 135 | + $cached = $this->facade->getResponseManager()->getCachedResponse($cache_id); |
| 136 | + if (null !== $cached) { |
| 137 | + $responseCode = $cached['response_code']; |
| 138 | + $responseHeaders = $cached['response_headers']; |
| 139 | + |
| 140 | + return $cached['response']; |
131 | 141 | } |
132 | 142 |
|
133 | 143 | $user = $this->facade->getAuthenticationManager()->getAuthenticatedUser(); |
@@ -231,40 +241,46 @@ public function projectsSearchGet(string $query, string $max_version, int $limit |
231 | 241 |
|
232 | 242 | /** |
233 | 243 | * @throws \JsonException |
234 | | - * @throws \DateMalformedStringException |
| 244 | + * @throws \Psr\Cache\InvalidArgumentException |
235 | 245 | */ |
236 | 246 | #[\Override] |
237 | 247 | public function projectsCategoriesGet(string $max_version, string $flavor, string $accept_language, int &$responseCode, array &$responseHeaders): array |
238 | 248 | { |
239 | 249 | $limit = 20; |
240 | 250 | $offset = 0; |
241 | 251 | $locale = $this->facade->getResponseManager()->sanitizeLocale($accept_language); |
242 | | - |
243 | 252 | $cache_id = sprintf('projectsCategoriesGet_%s_%s_%s', $flavor, $locale, $max_version); |
244 | | - $cached_response = $this->facade->getResponseManager()->getCachedResponse($cache_id); |
245 | | - if ($cached_response instanceof ResponseCache) { |
246 | | - $responseCode = $cached_response->getResponseCode(); |
247 | | - $responseHeaders = $this->facade->getResponseManager()->extractResponseHeader($cached_response); |
248 | | - |
249 | | - return $this->facade->getResponseManager()->extractResponseObject($cached_response); |
250 | | - } |
251 | 253 |
|
252 | | - $response = []; |
253 | | - |
254 | | - $categories = ['recent', 'example', 'most_downloaded', 'random', 'scratch', 'trending']; |
255 | | - $user = $this->facade->getAuthenticationManager()->getAuthenticatedUser(); |
| 254 | + // Use getCachedOrCompute for cleaner code |
| 255 | + $cached = $this->facade->getResponseManager()->getCachedOrCompute( |
| 256 | + $cache_id, |
| 257 | + function () use ($max_version, $limit, $offset, $flavor, $accept_language) { |
| 258 | + $response = []; |
| 259 | + $categories = ['recent', 'example', 'most_downloaded', 'random', 'scratch', 'trending']; |
| 260 | + $user = $this->facade->getAuthenticationManager()->getAuthenticatedUser(); |
| 261 | + |
| 262 | + foreach ($categories as $category) { |
| 263 | + $projects = $this->facade->getLoader()->getProjectsFromCategory($category, $max_version, $limit, $offset, $flavor, $user); |
| 264 | + $response[] = $this->facade->getResponseManager()->createProjectCategoryResponse($projects, $category, $accept_language); |
| 265 | + } |
| 266 | + |
| 267 | + $responseHeaders = []; |
| 268 | + $this->facade->getResponseManager()->addResponseHashToHeaders($responseHeaders, $response); |
| 269 | + $this->facade->getResponseManager()->addContentLanguageToHeaders($responseHeaders); |
| 270 | + |
| 271 | + return [ |
| 272 | + 'response_code' => Response::HTTP_OK, |
| 273 | + 'response_headers' => $responseHeaders, |
| 274 | + 'response' => $response, |
| 275 | + ]; |
| 276 | + }, |
| 277 | + 3600 // 1 hour cache for categories |
| 278 | + ); |
256 | 279 |
|
257 | | - foreach ($categories as $category) { |
258 | | - $projects = $this->facade->getLoader()->getProjectsFromCategory($category, $max_version, $limit, $offset, $flavor, $user); |
259 | | - $response[] = $this->facade->getResponseManager()->createProjectCategoryResponse($projects, $category, $accept_language); |
260 | | - } |
| 280 | + $responseCode = $cached['response_code']; |
| 281 | + $responseHeaders = $cached['response_headers']; |
261 | 282 |
|
262 | | - $responseCode = Response::HTTP_OK; |
263 | | - $this->facade->getResponseManager()->addResponseHashToHeaders($responseHeaders, $response); |
264 | | - $this->facade->getResponseManager()->addContentLanguageToHeaders($responseHeaders); |
265 | | - $this->facade->getResponseManager()->cacheResponse($cache_id, $responseCode, $responseHeaders, $response); |
266 | | - |
267 | | - return $response; |
| 283 | + return $cached['response']; |
268 | 284 | } |
269 | 285 |
|
270 | 286 | #[\Override] |
|
0 commit comments