From b8c316c44b53d7ed815b752e9b445b98c3ad2c2d Mon Sep 17 00:00:00 2001 From: undefined Date: Mon, 5 Oct 2020 20:58:18 +0800 Subject: [PATCH] core: add history for psdoc,ddoc,drdoc --- packages/hydrooj/TODO | 4 +-- packages/hydrooj/package.json | 2 +- packages/hydrooj/src/entry/common.ts | 1 - packages/hydrooj/src/entry/master.ts | 12 +++++--- packages/hydrooj/src/interface.ts | 8 ++++++ packages/hydrooj/src/model/domain.ts | 3 +- packages/hydrooj/src/model/problem.ts | 7 ++--- packages/hydrooj/src/script/upgrade0_1.ts | 13 --------- packages/hydrooj/src/upgrade.ts | 34 +++++++++++++++++++++++ packages/hydrooj/test/db.ts | 11 ++++++-- packages/migrate-vijos/package.json | 6 ++-- packages/migrate-vijos/script.ts | 1 + 12 files changed, 70 insertions(+), 32 deletions(-) delete mode 100644 packages/hydrooj/src/script/upgrade0_1.ts create mode 100644 packages/hydrooj/src/upgrade.ts diff --git a/packages/hydrooj/TODO b/packages/hydrooj/TODO index 7927f9f1f..c1643e1e8 100644 --- a/packages/hydrooj/TODO +++ b/packages/hydrooj/TODO @@ -11,7 +11,7 @@ message.markAsRead 解离mail模块 存储系统抽象化 extend problem settings -+oplog 将系统设置存于本地而非数据库 添加nav排序功能 -自动拓扑组件加载顺序? \ No newline at end of file +自动拓扑组件加载顺序? +add declarations to psdoc \ No newline at end of file diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 57e860d2c..bd4fee0d7 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.13.24", + "version": "2.13.25", "bin": "bin/hydrooj.js", "main": "dist/loader.js", "typings": "dist/loader.d.ts", diff --git a/packages/hydrooj/src/entry/common.ts b/packages/hydrooj/src/entry/common.ts index 9b08ffe79..2b5e9ca4c 100644 --- a/packages/hydrooj/src/entry/common.ts +++ b/packages/hydrooj/src/entry/common.ts @@ -29,7 +29,6 @@ export const builtinHandler = [ export const builtinScript = [ 'rating', 'difficulty', 'problemStat', 'blacklist', 'deleteUser', - 'upgrade0_1', ]; function getFiles(folder: string, base = ''): string[] { diff --git a/packages/hydrooj/src/entry/master.ts b/packages/hydrooj/src/entry/master.ts index 0241928f2..c6fb595f4 100644 --- a/packages/hydrooj/src/entry/master.ts +++ b/packages/hydrooj/src/entry/master.ts @@ -58,10 +58,14 @@ export async function load(call: Entry) { require('../service/monitor'); for (const i of builtinModel) require(`../model/${i}`); const modelSystem = require('../model/system'); - const dbVer = await modelSystem.get('db.ver'); - if (dbVer !== 1) { - const ins = require('../script/upgrade0_1'); - await ins.run({ username: 'Root', password: 'rootroot' }); + const scripts = require('../upgrade'); + let dbVer = (await modelSystem.get('db.ver')) || 0; + const expected = scripts.length; + while (dbVer < expected) { + logger.info('Upgrading database: from %d to %d', dbVer, expected); + await scripts[dbVer](); + dbVer++; + await modelSystem.set('db.ver', dbVer); } bus.serial('app/started'); return await modelSystem.get('server.worker'); diff --git a/packages/hydrooj/src/interface.ts b/packages/hydrooj/src/interface.ts index e7ebad71c..86bbb3ff5 100644 --- a/packages/hydrooj/src/interface.ts +++ b/packages/hydrooj/src/interface.ts @@ -330,6 +330,11 @@ export interface Bdoc { expireAt: Date, } +export interface HistoryDoc { + content: string, + time: Date, +} + // Discussion export interface Ddoc extends Document { docType: document['TYPE_DISCUSSION'], @@ -344,6 +349,7 @@ export interface Ddoc extends Document { updateAt: Date, nReply: number, views: number, + history: HistoryDoc[], } // Discussion reply @@ -355,6 +361,7 @@ export interface Drdoc extends Document { ip: string, content: string, reply: Drrdoc[], + history: HistoryDoc[], } // Discussion Tail Reply @@ -363,6 +370,7 @@ export interface Drrdoc { owner: number, content: string, ip: string, + history: HistoryDoc[], } export interface TokenDoc { diff --git a/packages/hydrooj/src/model/domain.ts b/packages/hydrooj/src/model/domain.ts index 437be8a07..9934d48ee 100644 --- a/packages/hydrooj/src/model/domain.ts +++ b/packages/hydrooj/src/model/domain.ts @@ -1,4 +1,5 @@ import { Dictionary } from 'lodash'; +import { FilterQuery } from 'mongodb'; import { BUILTIN_ROLES, PRIV } from './builtin'; import { DomainDoc } from '../interface'; import * as db from '../service/db'; @@ -46,7 +47,7 @@ export function get(domainId: string): Promise { return coll.findOne({ _id: domainId }); } -export function getMulti(query: any = {}) { +export function getMulti(query: FilterQuery = {}) { return coll.find(query); } diff --git a/packages/hydrooj/src/model/problem.ts b/packages/hydrooj/src/model/problem.ts index 71d3b9804..42a9927bb 100644 --- a/packages/hydrooj/src/model/problem.ts +++ b/packages/hydrooj/src/model/problem.ts @@ -121,11 +121,8 @@ export async function getList( if (pdocs.length !== pids.length) { for (const pid of pids) { if (!(r[pid] || l[pid])) { - if (doThrow) { - throw new ProblemNotFoundError(domainId, pid); - } else { - r[pid] = pdocHidden; - } + if (doThrow) throw new ProblemNotFoundError(domainId, pid); + else r[pid] = pdocHidden; } } } diff --git a/packages/hydrooj/src/script/upgrade0_1.ts b/packages/hydrooj/src/script/upgrade0_1.ts deleted file mode 100644 index 8a7ec77a2..000000000 --- a/packages/hydrooj/src/script/upgrade0_1.ts +++ /dev/null @@ -1,13 +0,0 @@ -import * as domain from '../model/domain'; - -export const description = 'Upgrade database from 0 to 1'; - -export async function run() { - const ddoc = await domain.get('system'); - if (!ddoc) await domain.add('system', 0, 'Hydro', 'Hydro System'); - // TODO discussion node? -} - -export const validate = {}; - -global.Hydro.script.upgrade0_1 = { run, description, validate }; diff --git a/packages/hydrooj/src/upgrade.ts b/packages/hydrooj/src/upgrade.ts new file mode 100644 index 000000000..aeee7bf40 --- /dev/null +++ b/packages/hydrooj/src/upgrade.ts @@ -0,0 +1,34 @@ +/* eslint-disable no-await-in-loop */ +import * as domain from './model/domain'; +import * as document from './model/document'; + +type UpgradeScript = () => Promise; + +const scripts: UpgradeScript[] = [ + // Init + async function _0_1() { + const ddoc = await domain.get('system'); + if (!ddoc) await domain.add('system', 0, 'Hydro', 'Hydro System'); + // TODO discussion node? + }, + // Add history column to ddoc,drdoc,psdoc + async function _1_2() { + const domains = await domain.getMulti().project({ _id: 1 }).toArray(); + for (const d of domains) { + const bulk = document.coll.initializeUnorderedBulkOp(); + await document.getMulti(d._id, document.TYPE_DISCUSSION).forEach((ddoc) => { + bulk.find({ _id: ddoc._id }).updateOne({ $set: { history: [] } }); + }); + await document.getMulti(d._id, document.TYPE_DISCUSSION_REPLY).forEach((drdoc) => { + bulk.find({ _id: drdoc._id }).updateOne({ $set: { history: [] } }); + }); + // TODO tail reply + await document.getMulti(d._id, document.TYPE_PROBLEM_SOLUTION).forEach((psdoc) => { + bulk.find({ _id: psdoc._id }).updateOne({ $set: { history: [] } }); + }); + if (bulk.length) await bulk.execute(); + } + }, +]; + +export = scripts; diff --git a/packages/hydrooj/test/db.ts b/packages/hydrooj/test/db.ts index 319b29a76..f52bf2368 100644 --- a/packages/hydrooj/test/db.ts +++ b/packages/hydrooj/test/db.ts @@ -6,8 +6,15 @@ export async function connect() { const db = require('hydrooj/src/service/db'); db.bus.once('connect', resolve); }); - const script = require('../src/script/upgrade0_1'); - await script.run(); + const modelSystem = require('hydrooj/src/model/system'); + const scripts = require('hydrooj/src/upgrade'); + let dbVer = (await modelSystem.get('db.ver')) || 0; + const expected = scripts.length; + while (dbVer < expected) { + await scripts[dbVer](); + dbVer++; + await modelSystem.set('db.ver', dbVer); + } } export async function dispose() { diff --git a/packages/migrate-vijos/package.json b/packages/migrate-vijos/package.json index 7b9d41a11..fd270bfbc 100644 --- a/packages/migrate-vijos/package.json +++ b/packages/migrate-vijos/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/migrate-vijos", - "version": "1.3.8", + "version": "1.3.9", "main": "package.json", "repository": "git@github.com:hydro-dev/Hydro.git", "author": "undefined ", @@ -14,10 +14,10 @@ "@types/mongodb": "^3.5.27" }, "peerDependencies": { - "hydrooj": "^2.13.5" + "hydrooj": "^2.13.25" }, "dependencies": { "js-yaml": "^3.14.0", "mongodb": "^3.6.2" } -} +} \ No newline at end of file diff --git a/packages/migrate-vijos/script.ts b/packages/migrate-vijos/script.ts index 768156ad0..048687624 100644 --- a/packages/migrate-vijos/script.ts +++ b/packages/migrate-vijos/script.ts @@ -73,6 +73,7 @@ const tasks = { content: r.content, owner: r.owner_uid, ip: r.ip, + history: [], }; res.push(drrdoc); }