Compare commits

..

5 Commits
1.1 ... master

Author SHA1 Message Date
Rev
35b8d4676a update frontend 2021-10-27 00:40:14 +09:00
Rev
98e00c6427 add docstring to method 2021-10-27 00:39:47 +09:00
Rev
33da8354db set execution time and memory when refreshing the data 2021-10-26 11:37:51 +09:00
Rev
a269395b9e fix getLocales method 2021-10-25 23:51:28 +09:00
Rev
3a5849d91a refactor itemCollection class 2021-10-25 21:02:05 +09:00
6 changed files with 72 additions and 39 deletions

View File

@ -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)
@ -139,7 +171,8 @@ class ItemsCollection
];
}
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');

View File

@ -1,7 +1,7 @@
{
"files": {
"main.js": "/static/js/main.e49801bc.chunk.js",
"main.js.map": "/static/js/main.e49801bc.chunk.js.map",
"main.js": "/static/js/main.33101a6f.chunk.js",
"main.js.map": "/static/js/main.33101a6f.chunk.js.map",
"runtime-main.js": "/static/js/runtime-main.45092312.js",
"runtime-main.js.map": "/static/js/runtime-main.45092312.js.map",
"static/js/2.c9c7c886.chunk.js": "/static/js/2.c9c7c886.chunk.js",
@ -14,6 +14,6 @@
"entrypoints": [
"static/js/runtime-main.45092312.js",
"static/js/2.c9c7c886.chunk.js",
"static/js/main.e49801bc.chunk.js"
"static/js/main.33101a6f.chunk.js"
]
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -17,7 +17,7 @@
<div id="root"></div>
<script>!function (e) { function t(t) { for (var n, u, a = t[0], c = t[1], f = t[2], s = 0, p = []; s < a.length; s++)u = a[s], Object.prototype.hasOwnProperty.call(o, u) && o[u] && p.push(o[u][0]), o[u] = 0; for (n in c) Object.prototype.hasOwnProperty.call(c, n) && (e[n] = c[n]); for (l && l(t); p.length;)p.shift()(); return i.push.apply(i, f || []), r() } function r() { for (var e, t = 0; t < i.length; t++) { for (var r = i[t], n = !0, a = 1; a < r.length; a++) { var c = r[a]; 0 !== o[c] && (n = !1) } n && (i.splice(t--, 1), e = u(u.s = r[0])) } return e } var n = {}, o = { 1: 0 }, i = []; function u(t) { if (n[t]) return n[t].exports; var r = n[t] = { i: t, l: !1, exports: {} }; return e[t].call(r.exports, r, r.exports, u), r.l = !0, r.exports } u.e = function (e) { var t = [], r = o[e]; if (0 !== r) if (r) t.push(r[2]); else { var n = new Promise((function (t, n) { r = o[e] = [t, n] })); t.push(r[2] = n); var i, a = document.createElement("script"); a.charset = "utf-8", a.timeout = 120, u.nc && a.setAttribute("nonce", u.nc), a.src = function (e) { return u.p + "static/js/" + ({}[e] || e) + "." + { 3: "ff1076df" }[e] + ".chunk.js" }(e); var c = new Error; i = function (t) { a.onerror = a.onload = null, clearTimeout(f); var r = o[e]; if (0 !== r) { if (r) { var n = t && ("load" === t.type ? "missing" : t.type), i = t && t.target && t.target.src; c.message = "Loading chunk " + e + " failed.\n(" + n + ": " + i + ")", c.name = "ChunkLoadError", c.type = n, c.request = i, r[1](c) } o[e] = void 0 } }; var f = setTimeout((function () { i({ type: "timeout", target: a }) }), 12e4); a.onerror = a.onload = i, document.head.appendChild(a) } return Promise.all(t) }, u.m = e, u.c = n, u.d = function (e, t, r) { u.o(e, t) || Object.defineProperty(e, t, { enumerable: !0, get: r }) }, u.r = function (e) { "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { value: "Module" }), Object.defineProperty(e, "__esModule", { value: !0 }) }, u.t = function (e, t) { if (1 & t && (e = u(e)), 8 & t) return e; if (4 & t && "object" == typeof e && e && e.__esModule) return e; var r = Object.create(null); if (u.r(r), Object.defineProperty(r, "default", { enumerable: !0, value: e }), 2 & t && "string" != typeof e) for (var n in e) u.d(r, n, function (t) { return e[t] }.bind(null, n)); return r }, u.n = function (e) { var t = e && e.__esModule ? function () { return e.default } : function () { return e }; return u.d(t, "a", t), t }, u.o = function (e, t) { return Object.prototype.hasOwnProperty.call(e, t) }, u.p = "/", u.oe = function (e) { throw console.error(e), e }; var a = this["webpackJsonpnew-item-finder-website"] = this["webpackJsonpnew-item-finder-website"] || [], c = a.push.bind(a); a.push = t, a = a.slice(); for (var f = 0; f < a.length; f++)t(a[f]); var l = c; r() }([])</script>
<script src="/static/js/2.c9c7c886.chunk.js"></script>
<script src="/static/js/main.e49801bc.chunk.js"></script>
<script src="/static/js/main.33101a6f.chunk.js"></script>
</body>
</html>