diff --git a/docs/LICENSE b/docs/LICENSE index 91c2b92..b754207 100644 --- a/docs/LICENSE +++ b/docs/LICENSE @@ -1,11 +1,11 @@ -University of Illinois/NCSA Open Source License Copyright (c) 2020 Atomos821. +University of Illinois/NCSA Open Source License Copyright (c) 2022 Atomos821. All rights reserved. Developed by: Atomos821 for SPT-AKI -https://www.offline-tarkov.com/ +https://www.sp-tarkov.com/ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/items/api/app/Data/ItemsCollection.php b/items/api/app/Data/ItemsCollection.php index 88ab98a..3545419 100644 --- a/items/api/app/Data/ItemsCollection.php +++ b/items/api/app/Data/ItemsCollection.php @@ -3,56 +3,44 @@ namespace App\Data; use App\Exceptions\ItemNotFoundException; -use Exception; use Illuminate\Support\Collection; -use Illuminate\Support\Facades\File; +use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Http; use Illuminate\Support\Str; use App\Config\GiteaConfig; +use Illuminate\Support\Facades\Log; class ItemsCollection { - protected array $items; - protected array $locales; + protected Collection $items; + protected Collection $locales; - private string $items_file_key = 'items.json'; - private string $locales_file_key = 'locales.json'; + private string $items_cache_key = 'items'; + private string $locales_cache_key = 'locales'; - /** - * @throws Exception - */ public function __construct() { - if (!File::exists(storage_path($this->items_file_key))) { + if (!Cache::has($this->items_cache_key)) { $this->refreshItemsCache(); } else { - $content = file_get_contents(storage_path($this->items_file_key)); - $this->items = json_decode($content, true); + $this->items = Cache::get($this->items_cache_key); } - if (!File::exists(storage_path($this->locales_file_key ))) { + if (!Cache::has($this->locales_cache_key)) { $this->refreshLocalesCache(); } else { - $content = file_get_contents(storage_path($this->locales_file_key )); - $this->locales = json_decode($content, true); + $this->locales = Cache::get($this->locales_cache_key); } } - /** - * @return void - * @throws Exception - */ public function refreshLocalesCache(): void { - $time_limit = ini_get('max_execution_time'); - $memory_limit = ini_get('memory_limit'); - set_time_limit(180); - ini_set('memory_limit', '256M'); - $this->locales = []; + $this->locales = collect(); $rawLocalesGlobalBaseUrl = GiteaConfig::RAW_LOCALES_GLOBAL_BASE_URL; // Getting all locales in project/assets/database/locales/global from the Server development branch repository - $localesList = Http::withOptions(['verify' => false])->get(GiteaConfig::LOCALES_GLOBAL_URL)->json(); + + $localesList = collect(Http::withOptions(['verify' => false])->get(GiteaConfig::LOCALES_GLOBAL_URL)->json()); foreach ($localesList as $item) { // Extract the json name for the locale preg_match('/([a-z]{2}(-[a-z]{2})?).json/', $item['name'], $currentLocaleName, PREG_OFFSET_CAPTURE); @@ -62,53 +50,35 @@ class ItemsCollection $trimmedCurrentLocaleName = trim($currentLocaleName[1][0]); $currentLocaleJson = Http::withOptions(['verify' => false]) - ->get("$rawLocalesGlobalBaseUrl/$trimmedCurrentLocaleName.json")->json(); - $templateLocale = $currentLocaleJson['templates']; - $customizationLocale = $currentLocaleJson['customization']; - $this->locales[$trimmedCurrentLocaleName] = array_merge($templateLocale, $customizationLocale); + ->get("${rawLocalesGlobalBaseUrl}/${trimmedCurrentLocaleName}.json")->json(); + $templateLocale = collect($currentLocaleJson['templates']); + $customizationLocale = collect($currentLocaleJson['customization']); + $this->locales = $this->locales->merge([$trimmedCurrentLocaleName => $templateLocale->concat($customizationLocale)]); } - if (!$handle = fopen(storage_path($this->locales_file_key ), 'w')) { - throw new Exception('Cannot open the file'); - } - fwrite($handle, json_encode($this->locales)); - fclose($handle); - set_time_limit($time_limit); - ini_set('memory_limit', $memory_limit); + Cache::put($this->locales_cache_key, $this->locales); } /** * @return void - * @throws Exception */ public function refreshItemsCache(): void { - $time_limit = ini_get('max_execution_time'); - $memory_limit = ini_get('memory_limit'); - set_time_limit(180); - ini_set('memory_limit', '256M'); - $items = Http::withOptions(['verify' => false])->get(GiteaConfig::RAW_ITEMS_URL)->json(); - $customization = Http::withOptions(['verify' => false])->get(GiteaConfig::RAW_CUSTOMIZATION_URL)->json(); - $this->items = array_merge($items, $customization); - if (!$handle = fopen(storage_path($this->items_file_key ), 'w')) { - throw new Exception('Cannot open the file'); - } - fwrite($handle, json_encode($this->items)); - fclose($handle); - set_time_limit($time_limit); - ini_set('memory_limit', $memory_limit); + $this->items = collect(Http::withOptions(['verify' => false])->get(GiteaConfig::RAW_ITEMS_URL)->json()); + $this->items = $this->items->merge(collect(Http::withOptions(['verify' => false]) + ->get(GiteaConfig::RAW_CUSTOMIZATION_URL)->json())); + Cache::put($this->items_cache_key, $this->items); } /** - * @return array + * @return Collection */ - public function getLocales(): array + public function getLocales(): Collection { - return array_keys($this->locales); + return $this->locales->keys(); } /** * @return void - * @throws Exception */ public function refreshAllCache(): void { @@ -137,8 +107,7 @@ class ItemsCollection */ public function findItem(string $query, string $locale): Collection { - $items = collect($this->items); - return $items->filter(function ($val, $key) use ($query, $locale) { + return $this->items->filter(function ($val, $key) use ($query, $locale) { return $this->contains($val['_id'], $query) || $this->contains($val['_name'], $query) || $this->contains($val['_parent'], $query) @@ -150,7 +119,7 @@ class ItemsCollection 'item' => [ '_id' => $item['_id'], '_name' => $item['_name'], - ], + ], 'locale' => $this->locales[$locale][$item['_id']] ?? '' ]; })->values(); @@ -164,21 +133,20 @@ class ItemsCollection */ public function getItemById(string $id, string $locale): array { - $item = $this->items[$id] ?? throw new ItemNotFoundException('Item not found'); + $item = $this->items[$id] ?? throw new ItemNotFoundException('Item not found'); return [ 'item' => $item, 'locale' => $this->locales[$locale][$id] ?? '' ]; } - public function getHierarchy(string $id, string $locale = 'en'): Collection - { + public function getHierarchy(string $id, string $locale = 'en'): Collection { // Return 404 if the item does not exist - $itemData = $this->items[$id] ?? throw new ItemNotFoundException('Item not found'); + $itemData = $this->items[$id] ?? throw new ItemNotFoundException('Item not found'); // Initialize the hierarchy with the current item $item = [ - 'item' => [ + 'item'=> [ '_id' => $itemData['_id'], '_name' => $itemData['_name'], '_parent' => $itemData['_parent'] @@ -190,9 +158,9 @@ class ItemsCollection // Check the whole hierarchy and merge into the return variable while (!empty($item['item']['_parent'] ?? '')) { $itemtId = $item['item']['_parent']; - $itemData = $this->items[$itemtId] ?? null; + $itemData = $this->items[$itemtId] ?? null; $item = [ - 'item' => [ + 'item'=> [ '_id' => $itemData['_id'], '_name' => $itemData['_name'], '_parent' => $itemData['_parent'] @@ -204,4 +172,46 @@ class ItemsCollection return $hierarchy; } -} + + public function getItemLocale(string $locale, string $itemID): array { + return $this->locales[$locale][$itemID] ?? []; + } + + /** + * @param string $locale the chosen local. Default to 'en' + * @return array + * @throws ItemNotFoundException + */ + public function getAllItemsName(string $locale): Collection + { + return $this->items->map(function ($item) use ($locale) { + return [ + 'item' => [ + '_id' => $item['_id'], + ], + 'locale' => collect($this->getItemLocale($locale, $item['_id']))->only(['Name', 'ShortName']) + ]; + })->filter(function ($item) { + return json_encode($item['locale']) != '[]'; + })->values(); + } + + /** + * @param string $id the item ID to look for + * @param string $locale the chosen local. Default to 'en' + * @return array + * @throws ItemNotFoundException + */ + public function getItemNameById(string $id, string $locale): array + { + $itemLocale = $this->locales[$locale][$id] ?? ''; + + if ($itemLocale == '') { + return $itemLocale; + } + + return [ + 'locale' => collect($itemLocale)->only(['Name', 'ShortName']) + ]; + } +} \ No newline at end of file diff --git a/items/api/app/Http/Controllers/ItemController.php b/items/api/app/Http/Controllers/ItemController.php index 37c53d8..c55c32f 100644 --- a/items/api/app/Http/Controllers/ItemController.php +++ b/items/api/app/Http/Controllers/ItemController.php @@ -61,6 +61,49 @@ class ItemController extends Controller } + // $router->get('item/list', 'ItemController@getAllItems'); + // $router->get('item/nameByID', 'ItemController@getItemNameByID'); + + /** + * @param Request $request + * @return JsonResponse + */ + public function getAllItemsName(Request $request): JsonResponse + { + try { + return response()->json( + $this->itemsCollection->getAllItemsName($request->query('locale', 'en')) + ); + } catch (Throwable $exception) { + Log::error($exception->getMessage()); + Log::error($exception->getTraceAsString()); + return response()->json([ + 'error' => 'Error during items collection.', + ], Response::HTTP_INTERNAL_SERVER_ERROR); + } + } + + /** + * @param Request $request + * @return JsonResponse + */ + public function getItemNameByID(Request $request): JsonResponse + { + try { + return response()->json( + $this->itemsCollection->getItemNameById( + $request->query('id', ''), $request->query('locale', 'en') + ) + ); + } catch (Throwable $exception) { + Log::error($exception->getMessage()); + Log::error($exception->getTraceAsString()); + return response()->json([ + 'error' => 'Item not found.', + ], Response::HTTP_NOT_FOUND); + } + } + /** * @param Request $request The request * @return JsonResponse Either {"error":"item not found"} or an object containing @@ -116,4 +159,4 @@ class ItemController extends Controller ], Response::HTTP_INTERNAL_SERVER_ERROR); } } -} +} \ No newline at end of file diff --git a/items/api/routes/web.php b/items/api/routes/web.php index 2a8e141..2091295 100644 --- a/items/api/routes/web.php +++ b/items/api/routes/web.php @@ -26,6 +26,8 @@ $router->group(['prefix' => 'api'], function () use ($router) { $router->get('refresh', 'ItemController@refreshAllCache'); $router->post('search', 'ItemController@search'); $router->get('item/hierarchy', 'ItemController@getHierarchy'); + $router->get('item/names', 'ItemController@getAllItemsName'); + $router->get('item/nameByID', 'ItemController@getItemNameByID'); $router->get('item', 'ItemController@getItem'); }); diff --git a/www/LICENSE b/www/LICENSE index 91c2b92..b754207 100644 --- a/www/LICENSE +++ b/www/LICENSE @@ -1,11 +1,11 @@ -University of Illinois/NCSA Open Source License Copyright (c) 2020 Atomos821. +University of Illinois/NCSA Open Source License Copyright (c) 2022 Atomos821. All rights reserved. Developed by: Atomos821 for SPT-AKI -https://www.offline-tarkov.com/ +https://www.sp-tarkov.com/ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal