Fix 404 error due to routes mapping #34
@ -3,43 +3,56 @@
|
|||||||
namespace App\Data;
|
namespace App\Data;
|
||||||
|
|
||||||
use App\Exceptions\ItemNotFoundException;
|
use App\Exceptions\ItemNotFoundException;
|
||||||
|
use Exception;
|
||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
use Illuminate\Support\Facades\Cache;
|
use Illuminate\Support\Facades\File;
|
||||||
use Illuminate\Support\Facades\Http;
|
use Illuminate\Support\Facades\Http;
|
||||||
use Illuminate\Support\Str;
|
use Illuminate\Support\Str;
|
||||||
use App\Config\GiteaConfig;
|
use App\Config\GiteaConfig;
|
||||||
|
|
||||||
class ItemsCollection
|
class ItemsCollection
|
||||||
{
|
{
|
||||||
protected Collection $items;
|
protected array $items;
|
||||||
protected Collection $locales;
|
protected array $locales;
|
||||||
|
|
||||||
private string $items_cache_key = 'items';
|
private string $items_file_key = 'items.json';
|
||||||
private string $locales_cache_key = 'locales';
|
private string $locales_file_key = 'locales.json';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
if (!Cache::has($this->items_cache_key)) {
|
if (!File::exists(storage_path($this->items_file_key))) {
|
||||||
$this->refreshItemsCache();
|
$this->refreshItemsCache();
|
||||||
} else {
|
} 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();
|
$this->refreshLocalesCache();
|
||||||
} else {
|
} 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
|
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;
|
$rawLocalesGlobalBaseUrl = GiteaConfig::RAW_LOCALES_GLOBAL_BASE_URL;
|
||||||
|
|
||||||
// Getting all locales in project/assets/database/locales/global from the Server development branch repository
|
// 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) {
|
foreach ($localesList as $item) {
|
||||||
// Extract the json name for the locale
|
// Extract the json name for the locale
|
||||||
preg_match('/([a-z]{2}(-[a-z]{2})?).json/', $item['name'], $currentLocaleName, PREG_OFFSET_CAPTURE);
|
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]);
|
$trimmedCurrentLocaleName = trim($currentLocaleName[1][0]);
|
||||||
$currentLocaleJson = Http::withOptions(['verify' => false])
|
$currentLocaleJson = Http::withOptions(['verify' => false])
|
||||||
->get("${rawLocalesGlobalBaseUrl}/${trimmedCurrentLocaleName}.json")->json();
|
->get("$rawLocalesGlobalBaseUrl/$trimmedCurrentLocaleName.json")->json();
|
||||||
$templateLocale = collect($currentLocaleJson['templates']);
|
$templateLocale = $currentLocaleJson['templates'];
|
||||||
$customizationLocale = collect($currentLocaleJson['customization']);
|
$customizationLocale = $currentLocaleJson['customization'];
|
||||||
$this->locales = $this->locales->merge([$trimmedCurrentLocaleName => $templateLocale->concat($customizationLocale)]);
|
$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
|
* @return void
|
||||||
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
public function refreshItemsCache(): void
|
public function refreshItemsCache(): void
|
||||||
{
|
{
|
||||||
$this->items = collect(Http::withOptions(['verify' => false])->get(GiteaConfig::RAW_ITEMS_URL)->json());
|
$time_limit = ini_get('max_execution_time');
|
||||||
$this->items = $this->items->merge(collect(Http::withOptions(['verify' => false])
|
$memory_limit = ini_get('memory_limit');
|
||||||
->get(GiteaConfig::RAW_CUSTOMIZATION_URL)->json()));
|
set_time_limit(180);
|
||||||
Cache::put($this->items_cache_key, $this->items);
|
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
|
* @return void
|
||||||
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
public function refreshAllCache(): void
|
public function refreshAllCache(): void
|
||||||
{
|
{
|
||||||
@ -106,7 +137,8 @@ class ItemsCollection
|
|||||||
*/
|
*/
|
||||||
public function findItem(string $query, string $locale): Collection
|
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)
|
return $this->contains($val['_id'], $query)
|
||||||
|| $this->contains($val['_name'], $query)
|
|| $this->contains($val['_name'], $query)
|
||||||
|| $this->contains($val['_parent'], $query)
|
|| $this->contains($val['_parent'], $query)
|
||||||
@ -132,25 +164,21 @@ class ItemsCollection
|
|||||||
*/
|
*/
|
||||||
public function getItemById(string $id, string $locale): array
|
public function getItemById(string $id, string $locale): array
|
||||||
{
|
{
|
||||||
$item = $this->items[$id] ?? null;
|
$item = $this->items[$id] ?? throw new ItemNotFoundException('Item not found');
|
||||||
if ($item == null) throw new ItemNotFoundException('Item not found');
|
|
||||||
return [
|
return [
|
||||||
'item' => $item,
|
'item' => $item,
|
||||||
'locale' => $this->locales[$locale][$id] ?? ''
|
'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
|
// Return 404 if the item does not exist
|
||||||
$itemData = $this->items[$id] ?? '';
|
$itemData = $this->items[$id] ?? throw new ItemNotFoundException('Item not found');
|
||||||
|
|
||||||
if ($itemData == ''){
|
|
||||||
throw new ItemNotFoundException('Item not found');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Initialize the hierarchy with the current item
|
// Initialize the hierarchy with the current item
|
||||||
$item = [
|
$item = [
|
||||||
'item'=> [
|
'item' => [
|
||||||
'_id' => $itemData['_id'],
|
'_id' => $itemData['_id'],
|
||||||
'_name' => $itemData['_name'],
|
'_name' => $itemData['_name'],
|
||||||
'_parent' => $itemData['_parent']
|
'_parent' => $itemData['_parent']
|
||||||
@ -164,7 +192,7 @@ class ItemsCollection
|
|||||||
$itemtId = $item['item']['_parent'];
|
$itemtId = $item['item']['_parent'];
|
||||||
$itemData = $this->items[$itemtId] ?? null;
|
$itemData = $this->items[$itemtId] ?? null;
|
||||||
$item = [
|
$item = [
|
||||||
'item'=> [
|
'item' => [
|
||||||
'_id' => $itemData['_id'],
|
'_id' => $itemData['_id'],
|
||||||
'_name' => $itemData['_name'],
|
'_name' => $itemData['_name'],
|
||||||
'_parent' => $itemData['_parent']
|
'_parent' => $itemData['_parent']
|
||||||
|
Loading…
x
Reference in New Issue
Block a user