diff --git a/app/Config/GiteaConfig.php b/app/Config/GiteaConfig.php new file mode 100644 index 0000000..fc85f61 --- /dev/null +++ b/app/Config/GiteaConfig.php @@ -0,0 +1,9 @@ +items_cache_key)) { + $this->refreshItemsCache(); + } + else $this->items = Cache::get($this->items_cache_key); + + if (!Cache::has($this->locales_cache_key)) { + $this->refreshLocalesCache(); + } + else $this->locales = Cache::get($this->locales_cache_key); + } + + public function refreshLocalesCache(): void { - if (!Cache::has('items')) { - $file = storage_path('items.json'); - $this->items = collect(json_decode(file_get_contents($file), true)['data']); - Cache::put('items', $this->items); - } else { - $this->items = Cache::get('items'); - } - if (!Cache::has('locale')) { - $file = storage_path('locale.json'); - $this->locale = collect(json_decode(file_get_contents($file), true)['templates']); - Cache::put('locale', $this->locale); - } else { - $this->locale = Cache::get('locale'); + $this->locales = collect(); + $raw_locales_global_base_url = GiteaConfig::RAW_LOCALES_GLOBAL_BASE_URL; + + // Getting all locales in project/assets/database/locales/global from the Server development branch repository + $locales_list = collect(json_decode(file_get_contents(GiteaConfig::LOCALES_GLOBAL_URL), true)); + foreach($locales_list as $item) { + // Extract the json name for the locale + preg_match('/([a-z]{2}(-[a-z]{2})?).json/', $item['name'], $current_locale_name, PREG_OFFSET_CAPTURE); + + // If the name is not supported for any reason, dont add it to the locales + if (empty($current_locale_name) || !$current_locale_name[1][0]) continue; + + $trimmed_current_locale_name = trim($current_locale_name[1][0]); + $test = collect([$trimmed_current_locale_name => json_decode(file_get_contents("${raw_locales_global_base_url}/${trimmed_current_locale_name}.json"), true)['templates']]); + $this->locales = $this->locales->merge($test); } + Cache::set($this->locales_cache_key, $this->locales); + } + + public function refreshItemsCache(): void { + $this->items = collect(json_decode(file_get_contents(GiteaConfig::RAW_ITEMS_URL), true)); + Cache::put($this->items_cache_key, $this->items); + } + + public function refreshAllCache(): void { + $this->refreshItemsCache(); + $this->refreshLocalesCache(); } /** - * @param string $query + * @param string $query the content of the query eg. 'AK' + * @param string $locale the chosen local. Default to 'en' * @return Collection */ - public function findItem(string $query): Collection + public function findItem(string $query, string $locale = 'en'): Collection { - return $this->items->filter(function ($val, $key) use ($query) { + return $this->items->filter(function ($val, $key) use ($query, $locale) { $query = Str::lower($query); return Str::contains($val['_id'], $query) || Str::contains($val['_name'], $query) || Str::contains($val['_parent'], $query) - || (($this->locale[$key] ?? false) - && $this->locale[$key]['Name'] - && Str::contains(Str::lower($this->locale[$key]['Name']), $query) - && Str::contains(Str::lower($this->locale[$key]['ShortName']), $query)); - })->map(function ($item) { + || (($this->locales[$locale][$key] ?? false) + && $this->locales[$locale][$key]['Name'] + && Str::contains(Str::lower($this->locale[$locale][$key]['Name']), $query) + && Str::contains(Str::lower($this->locale[$locale][$key]['ShortName']), $query)); + })->map(function ($item) use ($locale) { return [ '_id' => $item['_id'], '_name' => $item['_name'], - 'locale' => $this->locale[$item['_id']] ?? '' + 'locale' => $this->locales[$locale][$item['_id']] ?? '' ]; })->values(); } /** - * @param string $id + * @param string $id the item ID to look for + * @param string $locale the chosen local. Default to 'en' * @return array * @throws ItemNotFoundException */ - public function getItemById(string $id): array + public function getItemById(string $id, string $locale = 'en'): array { $item = $this->items[$id] ?? throw new ItemNotFoundException('Item not found'); return [ 'item' => $item, - 'locale' => $this->locale[$id] ?? '' + 'locale' => $this->locales[$locale][$id] ?? '' ]; } } diff --git a/app/Http/Controllers/ItemController.php b/app/Http/Controllers/ItemController.php index 512c890..eef62e7 100644 --- a/app/Http/Controllers/ItemController.php +++ b/app/Http/Controllers/ItemController.php @@ -55,4 +55,21 @@ class ItemController extends Controller ], Response::HTTP_NOT_FOUND); } } + + /** + * @param string $id + * @return JsonResponse + */ + public function refreshItems(): JsonResponse + { + try { + return response()->json($this->itemsCollection->getItemById($id)); + } catch (Throwable $exception) { + Log::error($exception->getMessage()); + Log::error($exception->getTraceAsString()); + return response()->json([ + 'error' => 'Item not found.', + ], Response::HTTP_NOT_FOUND); + } + } } diff --git a/routes/web.php b/routes/web.php index f1444d9..7638465 100644 --- a/routes/web.php +++ b/routes/web.php @@ -17,5 +17,8 @@ $router->get('/', function () { return view('app'); }); +$router->get('/api/refresh', 'ItemController@refreshAllCache'); +$router->post('/api/{locale}/search', 'ItemController@search'); +$router->get('/api/item/{locale}/{id}', 'ItemController@getItem'); $router->post('/api/search', 'ItemController@search'); $router->get('/api/item/{id}', 'ItemController@getItem');