迁移工具: +user +solution +discussion +training

This commit is contained in:
masnn committed 2020-05-15 20:21:44 +08:00
1 parent 3c5fdb9032
commit 42cbd020d5
3 files changed
+125 -33

No files matched your search

+2
View File
@@ -209,6 +209,8 @@ async function load() {
script: {},
lib: {},
nodeModules: {
bson: require('bson'),
'js-yaml': require('js-yaml'),
mongodb: require('mongodb'),
},
template: {},
+123 -24
View File
@@ -1,11 +1,8 @@
/* eslint-disable no-await-in-loop */
const Mongo = global.Hydro.nodeModules.mongodb;
const { ObjectID } = global.Hydro.nodeModules.bson;
const { mongodb, bson } = global.Hydro.nodeModules;
const dst = global.Hydro.service.db;
const { problem } = global.Hydro.model.problem;
const RULES = ['', 'oi', 'acm'];
const tasks = {
user: async (docs) => docs.map((doc) => ({
_id: doc._id,
@@ -17,11 +14,21 @@ const tasks = {
gravatar: doc.gravatar,
email: doc.mail,
emailLower: doc.mail_lower,
regat: doc.regat,
regip: doc.regip,
loginat: doc.loginat,
loginip: doc.loginip,
codeLang: doc.code_lang,
codeTemplate: doc.code_template,
timezone: doc.timezone,
viewLang: doc.viewLang,
bio: doc.bio,
gender: doc.gender,
qq: doc.qq,
})),
problem: async (docs) => docs.map((doc) => ({
_id: doc._id,
pid: doc.doc_id || new ObjectID(),
pid: doc.pname || doc.doc_id.toString() || new bson.ObjectID(),
title: doc.title,
content: doc.content,
owner: doc.owner_uid,
@@ -43,30 +50,120 @@ const tasks = {
}
return problems;
},
contest: async (docs) => docs.map((doc) => ({
solution: async (docs) => {
const solutions = [];
for (const doc of docs) {
const reply = doc.reply.map((r) => ({
owner: r.owner_uid,
content: r.content,
_id: r._id,
}));
const pdoc = await problem.get(doc.parent_doc_id.toString());
solutions.push({
_id: doc._id,
owner: doc.owner_uid,
content: doc.content,
vote: doc.vote,
reply,
pid: pdoc._id,
});
}
return solutions;
},
discussion: async (docs) => {
const TYPE = {
10: 'problem',
20: 'node',
30: 'contest',
};
const discussions = [];
for (const doc of docs) {
discussions.push({
_id: doc._id,
title: doc.title,
content: doc.content,
owner: doc.owner_uid,
views: doc.views,
highlight: doc.highlight,
nReply: doc.num_replies,
ip: doc.ip,
updateAt: doc.update_at,
parentType: TYPE[doc.parentType],
parentId: doc.parentId,
});
}
return discussions;
},
'discussion.reply': async (docs) => docs.map((doc) => ({
_id: doc._id,
title: doc.title,
content: doc.content,
owner: doc.owner_uid,
rule: RULES[doc.rule],
beginAt: doc.begin_at,
endAt: doc.end_at,
pids: doc.pids,
attend: doc.attend,
})),
solution: async (docs) => docs.map((doc) => ({
_id: doc._id,
title: doc.title,
ip: doc.ip,
content: doc.content,
vote: doc.vote,
parentId: doc.parent_doc_id,
})),
contest: async (docs) => {
const RULES = ['oi', 'acm', 'homework'];
const contests = [];
for (const doc of docs) {
const pids = [];
for (const pid of doc.pids) {
const pdoc = await problem.get(pid.toString());
pids.push(pdoc._id);
}
contests.push({
_id: doc._id,
title: doc.title,
content: doc.content,
owner: doc.owner_uid,
rule: RULES[doc.rule],
beginAt: doc.begin_at,
endAt: doc.end_at,
pids,
attend: doc.attend,
});
}
return contests;
},
training: async (docs) => {
const trainings = [];
for (const doc of docs) {
const dag = [];
for (const t of doc.dag) {
const pids = [];
for (const pid of t.pids) {
const pdoc = await problem.get(pid.toString());
pids.push(pdoc._id);
}
dag.push({
_id: t._id,
title: t.title,
requireNids: t.require_nids,
pids,
});
}
trainings.push({
_id: doc._id,
title: doc.title,
content: doc.content,
description: doc.desc,
enroll: doc.enroll,
owner: doc.owner_uid,
dag,
});
}
return trainings;
},
};
const cursor = {
user: (s) => s.collection('user').find(),
problem: (s) => s.collection('document').find({ doc_type: 10 }),
'problem.status': (s) => s.collection('document.status').find({ doc_type: 10 }),
solution: (s) => s.collection('document').find({ doc_type: 11 }),
discussion: (s) => s.collection('document').find({ doc_type: 21 }),
'discussion.reply': (s) => s.collection('document').find({ doc_type: 22 }),
contest: (s) => s.collection('document').find({ doc_type: 30 }),
user: (s) => s.collection('user').find(),
training: (s) => s.collection('document').find({ doc_type: 40 }),
};
async function task(name, src, report) {
@@ -86,7 +183,7 @@ async function migrateVijos({
let mongourl = 'mongodb://';
if (username) mongourl += `${username}:${password}@`;
mongourl += `${host}:${port}/${name}`;
const Database = await Mongo.MongoClient.connect(mongourl, {
const Database = await mongodb.MongoClient.connect(mongourl, {
useNewUrlParser: true, useUnifiedTopology: true,
});
const src = Database.db(name);
@@ -96,9 +193,11 @@ async function migrateVijos({
value: (await src.collection('system').findOne({ _id: 'user_counter' })).value,
});
await report({ progress: 1, message: 'Collection:system done.' });
await task('problem', src, report);
await task('problem.status', src, report);
await task('contest', src, report);
const t = [
'user', 'problem', 'problem.status', 'solution', 'discussion',
'discussion.reply', 'contest', 'training',
];
for (const i of t) await task(i, src, report);
}
global.Hydro.script.migrateVijos = module.exports = migrateVijos;
-9
View File
@@ -17,9 +17,6 @@ export const STATUS_COMPILING = 21;
export const STATUS_FETCHED = 22;
export const STATUS_IGNORED = 30;
export const TYPE_SUBMISSION = 0;
export const TYPE_PRETEST = 1;
export const STATUS_TEXTS = {
[STATUS_WAITING]: 'Waiting',
[STATUS_ACCEPTED]: 'Accepted',
@@ -90,9 +87,3 @@ export const STATUS_SCRATCHPAD_SHORT_TEXTS = {
[STATUS_RUNTIME_ERROR]: 'RTE',
};
attachObjectMeta(STATUS_SCRATCHPAD_SHORT_TEXTS, 'exportToPython', false);
export const TYPE_TEXTS = {
[TYPE_SUBMISSION]: 'Submission',
[TYPE_PRETEST]: 'Pretest',
};
attachObjectMeta(TYPE_TEXTS, 'intKey', true);