Forráskód Böngészése

Fixes #26 reload DB data

isundil 1 éve
szülő
commit
993e22fd29

+ 6 - 3
main.js

@@ -35,12 +35,15 @@ App.prototype.init = async function() {
 }
 
 App.prototype.run = async function() {
+    let BuilderClass = require('./src/autotagBuilder');
+
     http.createServer(this.router).listen(CONFIG.port);
     await this.libraryManager.updateLibraries(this.databaseHelper);
-    setInterval(() => { this.libraryManager.updateLibraries(this.databaseHelper); }, UPDATE_INTERVAL);
-
-    let BuilderClass = require('./src/autotagBuilder');
     await BuilderClass.rebuildPathTags(this);
+    setInterval(async () => {
+        await this.libraryManager.updateLibraries(this.databaseHelper);
+        BuilderClass.rebuildPathTags(this);
+    }, UPDATE_INTERVAL);
 }
 
 console.info = () => {};

+ 7 - 0
router/api.js

@@ -20,6 +20,13 @@ function MediaToJson(mediaData) {
 }
 
 module.exports = { register: app => {
+    app.router.post("/api/database/reload", (req, res) => {
+        app.routerUtils.onApiRequest(req, res);
+        if (!req.sessionObj?.accessList?.isAdmin)
+            return app.routerUtils.onBadRequest(res);
+        app.libraryManager.updateLibraries(app.databaseHelper).finally(x => { require('../src/autotagBuilder').rebuildPathTags(app); });
+        app.routerUtils.jsonResponse(res, {});
+    });
     app.router.get("/api/access/list", (req, res) => {
         app.routerUtils.onApiRequest(req, res);
         app.routerUtils.jsonResponse(res, req.sessionObj?.accessList || {});

+ 6 - 1
src/autotagBuilder.js

@@ -7,6 +7,7 @@ const MediaFileTagModel = require('../model/mediaItemTag.js').MediaFileTagModel;
 class AutoTagBuilder
 {
     #initialized = false;
+    #loading = false;
     #pathTags = [];
     #metaTags = [];
 
@@ -37,6 +38,9 @@ class AutoTagBuilder
     }
 
     async rebuildPathTags(app) {
+        if (this.#loading)
+            return;
+        this.#loading = true;
         if (!this.#initialized)
             await this.reloadRules(app);
         await app.databaseHelper.remove(MediaFileTagModel, { fromAutotag: true });
@@ -52,7 +56,8 @@ class AutoTagBuilder
             }
         }
         await app.databaseHelper.insertMultipleSameTable(entities);
-        console.log("Done proccessing autotags");
+        this.#loading = false;
+        console.log("Done processing autotags");
     }
 }
 

+ 1 - 0
src/library.js

@@ -91,6 +91,7 @@ async function Library_doUpdate(dbHelper, lib) {
     lib.buff = lib.buff.filter(i => !!i.checksum);
     if (lib.buff.length === 0)
         return;
+    lib.buff = lib.buff.filter(i => !!i.checksum);
     const dbItems = (await dbHelper.fetchRaw(["path", "md5sum", "fixedSum"], MediaFileModel.prototype.getTableName.call(null), { "path": lib.buff.map(i => i.path) }));
     lib.buff.forEach(i => i.dbItem = dbItems.find(x => x.path == i.path));
     lib.buff = lib.buff.filter(i => !i.dbItem || i.dbItem.md5sum != i.checksum);

+ 7 - 1
src/security.js

@@ -32,7 +32,9 @@ module.exports.createSession = req => {
         userAgent: req.headers['user-agent'],
         ipAddress: module.exports.getRequestIp(req),
         data: {
-            accessList: {}
+            accessList: {
+                isAdmin: false
+            }
         }
     };
     let sessionKey = MD5(JSON.stringify(sessionInfos));
@@ -57,3 +59,7 @@ module.exports.removeFromSession = (req, accessId) => {
     return session.accessList;
 };
 
+module.exports.setAdminFlat = () => {
+    session.accessList.isAdmin = true;
+}
+

+ 13 - 4
static/public/js/access.js

@@ -2,6 +2,7 @@
 $(() => {
     class AccessManager {
         #linkStoredAccesses = new Set();
+        #isAdmin = false;
 
         constructor() {
             this.#linkStoredAccesses.clear();
@@ -44,6 +45,10 @@ $(() => {
             });
         }
 
+        IsAdmin() {
+            return this.#isAdmin;
+        }
+
         LinkLogin(linkList) {
             return new Promise(ok => {
                 $.ajax({
@@ -51,8 +56,10 @@ $(() => {
                     type: "POST",
                     data: { linkIds: JSON.stringify(Array.from(linkList)) },
                     success: data => {
-                        for (let i in data)
-                            this.#linkStoredAccesses.add({key: i, value: data[i].linkId });
+                        for (let i in data) {
+                            data[i].linkId && this.#linkStoredAccesses.add({key: i, value: data[i].linkId });
+                        }
+                        this.#isAdmin = data.isAdmin;
                         this.#UpdateStorage();
                         window.ReloadAccessList(data);
                         ok();
@@ -71,8 +78,10 @@ $(() => {
                 return LoadingTasks.push(() => {
                     return new Promise(ok => {
                         $.get("/api/access/list", data => {
-                            for (let i in data)
-                                this.#linkStoredAccesses.add({ key: i, value: data[i].linkId });
+                            for (let i in data) {
+                                data[i].linkId && this.#linkStoredAccesses.add({key: i, value: data[i].linkId });
+                            }
+                            this.#isAdmin = data.isAdmin;
                             this.#UpdateStorage();
                             window.ReloadAccessList(data);
                             MediaStorage.Instance.rebuildMetaList().finally(ok);

+ 8 - 0
static/public/js/common.js

@@ -55,6 +55,14 @@ $(() => {
             onScrollBottom.fnc();
     });
 
+    window.reloadServerDb = () => {
+        $.ajax({
+            url: "/api/database/reload",
+            type: "POST",
+            data: "{}"
+        });
+    }
+
     document.Title.pop();
     AccessManager.RebuildAccess();
     loadHash(document.location?.hash?.substr(1));

+ 13 - 7
static/public/js/medias.js

@@ -110,22 +110,22 @@ class MediaStorage extends EventTarget
             return;
         this.#isLoading = true;
         document.getElementById("pch-infiniteScrollLoading").classList.remove("hidden");
+        let hasData = false;
         try {
             await LoadingTasks.push(async () => {
                 let data = await window.indexedData.listMedias();
                 this.pushAll(data.medias.map(x => new Media(x)));
                 this.#updateDbVersion(data.version);
                 this.#isLoading = false;
+                hasData = !!(data.medias?.length);
             });
         } catch (err) {
             console.error(err);
         }
-        this.downloadMetaList(true);
+        this.downloadMetaList(hasData);
     }
 
-    downloadMetaList(isUpdate) {
-        if (this.isLoading())
-            return;
+    #doDownloadMetaList(isUpdate) {
         this.#isLoading = true;
         document.getElementById("pch-infiniteScrollLoading").classList.remove("hidden");
         LoadingTasks.push(() => {
@@ -138,21 +138,27 @@ class MediaStorage extends EventTarget
                     this.pushAll(data.data.map(i => new Media(i)));
                     if (data.first || data.last)
                         window.chronology.rebuildRange(data.first, data.last);
-                    this.#isLoading = false;
                     if ((data.data?.length || 0) < requestCount) {
+                        this.#isLoading = false;
                         document.getElementById("pch-infiniteScrollLoading").classList.add("hidden");
                         this.#updateDbVersion(this.loadingVersion);
                         window.ReloadFilters(MediaStorage.Instance);
                         this.dispatchEvent(new CustomEvent("doneLoading"));
+                    } else {
+                        this.#doDownloadMetaList(isUpdate);
                     }
-                    else
-                        setTimeout(this.downloadMetaList.bind(this, isUpdate), 25);
                     ok();
                 });
             });
         });
     }
 
+    downloadMetaList(isUpdate) {
+        if (this.isLoading())
+            return;
+        this.#doDownloadMetaList(isUpdate);
+    }
+
     getDbVersion() { return this.#dbVersion; }
 
     #updateDbVersion(version) {

+ 4 - 0
static/public/js/uiAccess.js

@@ -52,6 +52,10 @@ async function logout(accessId, linkId) {
 }
 
 window.ReloadAccessList = function(accessList) {
+    console.log(accessList);
+    document.getElementById("pch-navbar-reload");
+    document.getElementById("pch-navbar-share");
+
     let getIconForType = type => {
         if (!!type.linkId) return "bi-link-45deg";
         if (!!type.userName) return "bi-person";

+ 2 - 0
static/public/js/uiCommon.js

@@ -18,6 +18,8 @@ $(() => {
             triggerClosePopinsRequestHandlers();
     });
 
+    document.getElementById("pch-navbar-reload").addEventListener("click", () => reloadServerDb());
+    document.getElementById("pch-navbar-share").addEventListener("click", () => showShareUi());
     document.getElementById("fullScreenOverlay").addEventListener("click", triggerClosePopinsRequestHandlers);
     document.onClosePopinRequested = (hndl) => closePopinsRequestedHandlers.push(hndl);
 });

+ 4 - 0
static/public/js/uiShare.js

@@ -0,0 +1,4 @@
+
+function showShareUi() {
+}
+

+ 1 - 0
templates/_footer.js

@@ -16,6 +16,7 @@ module.exports = `
 <script src="/public/js/uiMediaFullpage.js"></script>
 <script src="/public/js/uiAccess.js"></script>
 <script src="/public/js/uiFilter.js"></script>
+<script src="/public/js/uiShare.js"></script>
 <script src="/public/js/chronology.js"></script>
 <script src="/public/js/common.js"></script>
 </body></html>`;

+ 6 - 0
templates/_menu.js

@@ -5,6 +5,12 @@ module.exports = `
     <nav id="pch-navbar" class="navbar navbar-expand-lg bg-body-tertiary">
         <div class="container-fluid" id="navbarSupportedContent">
             <ul class="navbar-nav col justify-content-end">
+                <li class="nav-item">
+                    <a class="nav-link" href="#" role="button" id="pch-navbar-reload"><i class="bi bi-database-gear">&nbsp;</i></a>
+                </li>
+                <li class="nav-item">
+                    <a class="nav-link" href="#" role="button" id="pch-navbar-share"><i class="bi bi-share">&nbsp;</i></a>
+                </li>
                 <li class="nav-item">
                     <a class="nav-link" id="pch-navbar-filterToggle" href="#" role="button">
                         <i class="bi bi-funnel bt-filter-inactive">&nbsp;</i>