diff --git a/items/api/app/Data/ItemsCollection.php b/items/api/app/Data/ItemsCollection.php index 4080495..88ab98a 100644 --- a/items/api/app/Data/ItemsCollection.php +++ b/items/api/app/Data/ItemsCollection.php @@ -3,43 +3,56 @@ namespace App\Data; use App\Exceptions\ItemNotFoundException; +use Exception; use Illuminate\Support\Collection; -use Illuminate\Support\Facades\Cache; +use Illuminate\Support\Facades\File; use Illuminate\Support\Facades\Http; use Illuminate\Support\Str; use App\Config\GiteaConfig; class ItemsCollection { - protected Collection $items; - protected Collection $locales; + protected array $items; + protected array $locales; - private string $items_cache_key = 'items'; - private string $locales_cache_key = 'locales'; + private string $items_file_key = 'items.json'; + private string $locales_file_key = 'locales.json'; + /** + * @throws Exception + */ public function __construct() { - if (!Cache::has($this->items_cache_key)) { + if (!File::exists(storage_path($this->items_file_key))) { $this->refreshItemsCache(); } else { - $this->items = Cache::get($this->items_cache_key); + $content = file_get_contents(storage_path($this->items_file_key)); + $this->items = json_decode($content, true); } - if (!Cache::has($this->locales_cache_key)) { + if (!File::exists(storage_path($this->locales_file_key ))) { $this->refreshLocalesCache(); } else { - $this->locales = Cache::get($this->locales_cache_key); + $content = file_get_contents(storage_path($this->locales_file_key )); + $this->locales = json_decode($content, true); } } + /** + * @return void + * @throws Exception + */ public function refreshLocalesCache(): void { - $this->locales = collect(); + $time_limit = ini_get('max_execution_time'); + $memory_limit = ini_get('memory_limit'); + set_time_limit(180); + ini_set('memory_limit', '256M'); + $this->locales = []; $rawLocalesGlobalBaseUrl = GiteaConfig::RAW_LOCALES_GLOBAL_BASE_URL; // Getting all locales in project/assets/database/locales/global from the Server development branch repository - - $localesList = collect(Http::withOptions(['verify' => false])->get(GiteaConfig::LOCALES_GLOBAL_URL)->json()); + $localesList = 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); @@ -49,35 +62,53 @@ class ItemsCollection $trimmedCurrentLocaleName = trim($currentLocaleName[1][0]); $currentLocaleJson = Http::withOptions(['verify' => false]) - ->get("${rawLocalesGlobalBaseUrl}/${trimmedCurrentLocaleName}.json")->json(); - $templateLocale = collect($currentLocaleJson['templates']); - $customizationLocale = collect($currentLocaleJson['customization']); - $this->locales = $this->locales->merge([$trimmedCurrentLocaleName => $templateLocale->concat($customizationLocale)]); + ->get("$rawLocalesGlobalBaseUrl/$trimmedCurrentLocaleName.json")->json(); + $templateLocale = $currentLocaleJson['templates']; + $customizationLocale = $currentLocaleJson['customization']; + $this->locales[$trimmedCurrentLocaleName] = array_merge($templateLocale, $customizationLocale); } - Cache::put($this->locales_cache_key, $this->locales); + 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); } /** * @return void + * @throws Exception */ public function refreshItemsCache(): void { - $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); + $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); } /** - * @return Collection + * @return array */ - public function getLocales(): Collection + public function getLocales(): array { - return $this->locales->keys(); + return array_keys($this->locales); } /** * @return void + * @throws Exception */ public function refreshAllCache(): void { @@ -106,7 +137,8 @@ class ItemsCollection */ public function findItem(string $query, string $locale): Collection { - return $this->items->filter(function ($val, $key) use ($query, $locale) { + $items = collect($this->items); + return $items->filter(function ($val, $key) use ($query, $locale) { return $this->contains($val['_id'], $query) || $this->contains($val['_name'], $query) || $this->contains($val['_parent'], $query) @@ -118,7 +150,7 @@ class ItemsCollection 'item' => [ '_id' => $item['_id'], '_name' => $item['_name'], - ], + ], 'locale' => $this->locales[$locale][$item['_id']] ?? '' ]; })->values(); @@ -132,25 +164,21 @@ class ItemsCollection */ public function getItemById(string $id, string $locale): array { - $item = $this->items[$id] ?? null; - if ($item == null) 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] ?? ''; - - if ($itemData == ''){ - 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'] @@ -162,9 +190,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']