diff --git a/server/config/base.js b/server/config/base.js index 6973e01d..e72f0dc4 100644 --- a/server/config/base.js +++ b/server/config/base.js @@ -66,9 +66,16 @@ module.exports = { remoteStorage: false, /* remoteStorage: { - url: 'https://127.0.0.1:11900', + url: 'wss://127.0.0.1:11900', accessToken: '', }, */ + bucEnabled: false, + bucServer: false, + /* + bucServer: { + url: 'wss://127.0.0.1:33443', + } + */ }; diff --git a/server/config/index.js b/server/config/index.js index 7ffa99f1..933d0f84 100644 --- a/server/config/index.js +++ b/server/config/index.js @@ -10,7 +10,9 @@ const propsToSave = [ 'useExternalBookConverter', 'servers', - 'remoteWebDavStorage', + 'remoteStorage', + 'bucEnabled', + 'bucServer', ]; let instance = null; diff --git a/server/controllers/BookUpdateCheckerController.js b/server/controllers/BookUpdateCheckerController.js index 050d6c33..084c6582 100644 --- a/server/controllers/BookUpdateCheckerController.js +++ b/server/controllers/BookUpdateCheckerController.js @@ -13,7 +13,6 @@ class BookUpdateCheckerController { this.config = config; this.isDevelopment = (config.branch == 'development'); - //this.readerStorage = new JembaReaderStorage(); this.bucServer = new BUCServer(config); this.bucServer.main(); //no await @@ -62,6 +61,10 @@ class BookUpdateCheckerController { switch (req.action) { case 'test': await this.test(req, ws); break; + case 'get-buc': + await this.getBuc(req, ws); break; + case 'update-buc': + await this.updateBuc(req, ws); break; default: throw new Error(`Action not found: ${req.action}`); @@ -93,6 +96,28 @@ class BookUpdateCheckerController { this.send({message: 'Liberama project is awesome'}, req, ws); } + async getBuc(req, ws) { + if (!req.fromCheckTime) + throw new Error(`key 'fromCheckTime' is empty`); + + await this.bucServer.getBuc(req.fromCheckTime, (rows) => { + this.send({state: 'get', rows}, req, ws); + }); + + this.send({state: 'finish'}, req, ws); + } + + async updateBuc(req, ws) { + if (!req.bookUrls) + throw new Error(`key 'bookUrls' is empty`); + + if (!Array.isArray(req.bookUrls)) + throw new Error(`key 'bookUrls' must be array`); + + await this.bucServer.updateBuc(req.bookUrls); + + this.send({state: 'success'}, req, ws); + } } module.exports = BookUpdateCheckerController; diff --git a/server/core/BookUpdateChecker/BUCServer.js b/server/core/BookUpdateChecker/BUCServer.js index b8c195d3..796a9677 100644 --- a/server/core/BookUpdateChecker/BUCServer.js +++ b/server/core/BookUpdateChecker/BUCServer.js @@ -58,6 +58,48 @@ class BUCServer { return instance; } + async getBuc(fromCheckTime, callback) { + const db = this.db; + + while (1) {//eslint-disable-line + const rows = await db.select({ + table: 'buc', + where: ` + let iter = @getItem('getBuc'); + if (!iter) { + iter = @dirtyIndexLR('checkTime', ${db.esc(fromCheckTime)}); + @setItem('getBuc', iter); + } + + const ids = new Set(); + let id = iter.next(); + while (!id.done && ids.size < 100) { + ids.add(id.value); + id = iter.next(); + } + + return ids; + ` + }); + + if (rows.length) + callback(rows); + else + break; + } + } + + async updateBuc(bookUrls) { + const db = this.db; + const now = Date.now(); + + await db.update({ + table: 'buc', + mod: `(r) => r.queryTime = ${db.esc(now)}`, + where: `@@id(${db.esc(bookUrls)})` + }); + } + async fillCheckQueue() { const db = this.db; diff --git a/server/db/jembaMigrations/app/002-create.js b/server/db/jembaMigrations/app/002-create.js new file mode 100644 index 00000000..a7260e8b --- /dev/null +++ b/server/db/jembaMigrations/app/002-create.js @@ -0,0 +1,24 @@ +module.exports = { + up: [ + ['create', { + /*{ + id, // book URL + queryTime: Number, + checkTime: Number, // 0 - never checked + size: Number, + checkSum: String, //sha256 + state: Number, // 0 - not processing, 1 - processing + error: String, + }*/ + table: 'buc', + index: [ + {field: 'queryTime', type: 'number'}, + ] + }], + ], + down: [ + ['drop', { + table: 'buc' + }], + ] +}; diff --git a/server/db/jembaMigrations/app/index.js b/server/db/jembaMigrations/app/index.js index 85941af0..4660f2d6 100644 --- a/server/db/jembaMigrations/app/index.js +++ b/server/db/jembaMigrations/app/index.js @@ -1,6 +1,7 @@ module.exports = { table: 'migration1', data: [ - {id: 1, name: 'create', data: require('./001-create')} + {id: 1, name: 'create', data: require('./001-create')}, + {id: 2, name: 'create', data: require('./002-create')}, ] } \ No newline at end of file