diff --git a/back/loaders/db.ts b/back/loaders/db.ts index e1b8ca14..421293ed 100644 --- a/back/loaders/db.ts +++ b/back/loaders/db.ts @@ -1,28 +1,101 @@ import Logger from './logger'; +import path from 'path'; +import DataStore from 'nedb'; import { EnvModel } from '../data/env'; import { CrontabModel } from '../data/cron'; import { DependenceModel } from '../data/dependence'; import { AppModel } from '../data/open'; import { AuthModel } from '../data/auth'; import { sequelize } from '../data'; +import { fileExist } from '../config/util'; export default async () => { try { - await sequelize.sync(); await CrontabModel.sync(); await DependenceModel.sync(); await AppModel.sync(); await AuthModel.sync(); await EnvModel.sync(); + await sequelize.sync(); // try { // const queryInterface = sequelize.getQueryInterface(); // await queryInterface.addIndex('Crontabs', ['command'], { unique: true }); // await queryInterface.addIndex('Envs', ['name', 'value'], { unique: true }); // await queryInterface.addIndex('Apps', ['name'], { unique: true }); - // } catch (error) { + // } catch (error) { } - // } + // 2.10-2.11 升级 + const cronDbFile = path.join('/ql', 'db/crontab.db'); + const envDbFile = path.join('/ql', 'db/env.db'); + const appDbFile = path.join('/ql', 'db/app.db'); + const authDbFile = path.join('/ql', 'db/auth.db'); + const dependenceDbFile = path.join('/ql', 'db/dependence.db'); + const crondbExist = await fileExist(cronDbFile); + const dependenceDbExist = await fileExist(dependenceDbFile); + const envDbExist = await fileExist(envDbFile); + const appDbExist = await fileExist(appDbFile); + const authDbExist = await fileExist(authDbFile); + + const cronCount = await CrontabModel.count(); + const dependenceCount = await DependenceModel.count(); + const envCount = await EnvModel.count(); + const appCount = await AppModel.count(); + const authCount = await AuthModel.count(); + if (crondbExist && cronCount === 0) { + const cronDb = new DataStore({ + filename: cronDbFile, + autoload: true, + }); + cronDb.persistence.compactDatafile(); + cronDb.find({}).exec(async (err, docs) => { + await CrontabModel.bulkCreate(docs, { ignoreDuplicates: true }); + }); + } + + if (dependenceDbExist && dependenceCount === 0) { + const dependenceDb = new DataStore({ + filename: dependenceDbFile, + autoload: true, + }); + dependenceDb.persistence.compactDatafile(); + dependenceDb.find({}).exec(async (err, docs) => { + await DependenceModel.bulkCreate(docs, { ignoreDuplicates: true }); + }); + } + + if (envDbExist && envCount === 0) { + const envDb = new DataStore({ + filename: envDbFile, + autoload: true, + }); + envDb.persistence.compactDatafile(); + envDb.find({}).exec(async (err, docs) => { + await EnvModel.bulkCreate(docs, { ignoreDuplicates: true }); + }); + } + + if (appDbExist && appCount === 0) { + const appDb = new DataStore({ + filename: appDbFile, + autoload: true, + }); + appDb.persistence.compactDatafile(); + appDb.find({}).exec(async (err, docs) => { + await AppModel.bulkCreate(docs, { ignoreDuplicates: true }); + }); + } + + if (authDbExist && authCount === 0) { + const authDb = new DataStore({ + filename: authDbFile, + autoload: true, + }); + authDb.persistence.compactDatafile(); + authDb.find({}).exec(async (err, docs) => { + await AuthModel.bulkCreate(docs, { ignoreDuplicates: true }); + }); + } Logger.info('✌️ DB loaded'); } catch (error) { diff --git a/package.json b/package.json index 0bdd227f..dc7e7293 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "iconv-lite": "^0.6.3", "jsonwebtoken": "^8.5.1", "lodash": "^4.17.21", + "nedb": "^1.8.0", "node-fetch": "^2.6.1", "node-schedule": "^2.0.0", "nodemailer": "^6.7.0", @@ -67,6 +68,7 @@ "@types/express-jwt": "^6.0.1", "@types/jsonwebtoken": "^8.5.0", "@types/lodash": "^4.14.170", + "@types/nedb": "^1.8.12", "@types/node": "^14.11.2", "@types/node-fetch": "^2.5.8", "@types/node-schedule": "^1.3.2", diff --git a/yarn.lock b/yarn.lock index 3fcb234f..fb87cbaa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1219,6 +1219,13 @@ resolved "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz" integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== +"@types/nedb@^1.8.12": + version "1.8.12" + resolved "https://registry.yarnpkg.com/@types/nedb/-/nedb-1.8.12.tgz#597bb124ddaf16039c6d478f4abc0a8f2006b134" + integrity sha512-ICDoQMORMjOSqfNFXT4ENXfwwCir1BPblXNm0SPH7C4Q10ou+pvVagcFAJ+rrzf3A47tGU4K/KbzKu7wO9j45Q== + dependencies: + "@types/node" "*" + "@types/node-fetch@^2.5.8": version "2.5.11" resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.11.tgz" @@ -2326,6 +2333,11 @@ async-validator@^4.0.2: resolved "https://registry.npmjs.org/async-validator/-/async-validator-4.0.3.tgz" integrity sha512-LVoIbJNHPKsO7FMLamo88uxdrvayGkF3vLTMTeiN3CqAbP3qSafLRc6yx3Sq9lHkiEOLNpoA2jwwnfGDdu1SMQ== +async@0.2.10: + version "0.2.10" + resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" + integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E= + async@^1.5.0: version "1.5.2" resolved "https://registry.npmjs.org/async/-/async-1.5.2.tgz" @@ -2528,6 +2540,13 @@ binary-extensions@^2.0.0: resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== +binary-search-tree@0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/binary-search-tree/-/binary-search-tree-0.2.5.tgz#7dbb3b210fdca082450dad2334c304af39bdc784" + integrity sha1-fbs7IQ/coIJFDa0jNMMErzm9x4Q= + dependencies: + underscore "~1.4.4" + bindings@^1.5.0: version "1.5.0" resolved "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz" @@ -5125,6 +5144,11 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= + import-cwd@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz" @@ -6404,6 +6428,13 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +lie@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e" + integrity sha1-mkNrLMd0bKWd56QfpGmz77dr2H4= + dependencies: + immediate "~3.0.5" + lines-and-columns@^1.1.6: version "1.1.6" resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz" @@ -6476,6 +6507,13 @@ loader-utils@^2.0.0: emojis-list "^3.0.0" json5 "^2.1.2" +localforage@^1.3.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.10.0.tgz#5c465dc5f62b2807c3a84c0c6a1b1b3212781dd4" + integrity sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg== + dependencies: + lie "3.1.1" + locate-path@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" @@ -6877,7 +6915,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.5: +"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.5, mkdirp@~0.5.1: version "0.5.5" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== @@ -6957,6 +6995,17 @@ natural-compare@^1.4.0: resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= +nedb@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/nedb/-/nedb-1.8.0.tgz#0e3502cd82c004d5355a43c9e55577bd7bd91d88" + integrity sha1-DjUCzYLABNU1WkPJ5VV3vXvZHYg= + dependencies: + async "0.2.10" + binary-search-tree "0.2.5" + localforage "^1.3.0" + mkdirp "~0.5.1" + underscore "~1.4.4" + needle@^2.2.1: version "2.9.1" resolved "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz" @@ -10912,6 +10961,11 @@ undefsafe@^2.0.3: dependencies: debug "^2.2.0" +underscore@~1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.4.4.tgz#61a6a32010622afa07963bf325203cf12239d604" + integrity sha1-YaajIBBiKvoHljvzJSA88SI51gQ= + unescape@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/unescape/-/unescape-1.0.1.tgz#956e430f61cad8a4d57d82c518f5e6cc5d0dda96"