소스 검색

Fixes #7 Mass meta edit

isundil 1 년 전
부모
커밋
b79dd5e0f4
2개의 변경된 파일35개의 추가작업 그리고 16개의 파일을 삭제
  1. 19 7
      router/api.js
  2. 16 9
      static/public/js/medias.js

+ 19 - 7
router/api.js

@@ -97,16 +97,28 @@ module.exports = { register: app => {
         app.routerUtils.onApiRequest(req, res);
         if (!req.params.id ||!req.params.key || !Number.isInteger(req.body?.value?.length))
             return app.routerUtils.onBadRequest(res);
-        let data = await MediaService.fetchOne(app, req.params.id, req.sessionObj?.accessList);
-        if (!data || data.accessType !== ACCESS_GRANT.write)
-            return app.routerUtils.onPageNotFound(res);
+
+        let checksum = [ req.params.id ];
+        if (req.params.id === "list") {
+            if (!req.body?.['list[]'])
+                return app.routerUtils.onBadRequest(res);
+            checksum = req.body['list[]'];
+        }
+
+        let data = await MediaService.fetchMultiple(app, checksum, req.sessionObj?.accessList);
+        data = Object.keys(data)
+            .map(x => data[x])
+            .filter(x => x.ACCESS_TYPE != ACCESS_GRANT.write);
+
         if (!req.body.value) {
-            await app.databaseHelper.remove(MediaFileMetaModel, { md5sum: data.fixedSum, key: req.params.key, fromFile: 0 });
+            await app.databaseHelper.remove(MediaFileMetaModel, { md5sum: data.map(x => x.fixedSum), key: req.params.key, fromFile: 0 });
         } else {
-            let newMediaItemMedia = new MediaFileMetaModel(data.fixedSum, req.params.key, req.body.value, false);
-            await app.databaseHelper.upsertOne(newMediaItemMedia);
+            let newMediaItemMedia = data.map(x => new MediaFileMetaModel(x.fixedSum, req.params.key, req.body.value, false));
+            await app.databaseHelper.remove(MediaFileMetaModel, { md5sum: data.map(x => x.fixedSum), key: req.params.key, fromFile: 0 });
+            await app.databaseHelper.insertMultipleSameTable(newMediaItemMedia);
         }
-        app.routerUtils.jsonResponse(res, MediaToJson(await MediaService.fetchOne(app, req.params.id, req.sessionObj?.accessList)));
+        const allMedias = await MediaService.fetchMultiple(app, checksum, req.sessionObj?.accessList);
+        app.routerUtils.jsonResponse(res, Object.keys(allMedias).map(x => allMedias[x]).map(x => MediaToJson(x)));
     });
     app.router.get("/api/media/list", async (req, res) => {
         app.routerUtils.onApiRequest(req, res);

+ 16 - 9
static/public/js/medias.js

@@ -216,21 +216,28 @@ class MediaStorage extends EventTarget
     }
 
     setMetaValue(md5sum, key, value) {
-        // FIXME md5sum may be array
+        let md5arr = undefined;
+        if (Array.isArray(md5sum)) {
+            md5arr = md5sum;
+            md5sum = "list";
+        }
         return LoadingTasks.push(() => {
             return new Promise(ok => {
-                let media = this.medias.find(x => x.fixedSum === md5sum);
-                if (!media || !media.writeAccess)
+                let mediaCount = (md5arr || [ md5sum ]).map(checksum => this.medias.find(x => x.fixedSum === checksum)).filter(x => x.writeAccess).length;
+                if (mediaCount != (md5arr || [ md5sum ]).length)
                     return ok(false);
                 $.ajax({
                     url: `/api/media/${encodeURIComponent(md5sum)}/meta/${encodeURIComponent(key)}`,
                     type: "PATCH",
-                    data: { value },
-                    success: (queryResult) => {
-                        let meta = queryResult.meta[key] || { type: 'string', value: value, canWrite: true };
-                        meta.value = value;
-                        this.#pushMeta(key, meta);
-                        media.meta[key] = meta;
+                    data: { value: value, list: md5arr },
+                    success: allData => {
+                        allData.forEach(data => {
+                            let media = this.medias.find(x => x.fixedSum === data.fixedSum);
+                            let meta = data.meta[key] || { type: 'string', value: value, canWrite: true };
+                            meta.value = value;
+                            this.#pushMeta(key, meta);
+                            media.meta[key] = meta;
+                        });
                         window.ReloadFilters(this);
                         ok(true);
                     },