mirror of
https://gitcode.com/gh_mirrors/hy/Hydro.git
synced 2026-10-20 01:38:19 +08:00
迁移工具: +user +solution +discussion +training
This commit is contained in:
1 parent
3c5fdb9032
commit
42cbd020d5
3 files changed
+125
-33
No files matched your search
@@ -209,6 +209,8 @@ async function load() {
|
|||||||
script: {},
|
script: {},
|
||||||
lib: {},
|
lib: {},
|
||||||
nodeModules: {
|
nodeModules: {
|
||||||
|
bson: require('bson'),
|
||||||
|
'js-yaml': require('js-yaml'),
|
||||||
mongodb: require('mongodb'),
|
mongodb: require('mongodb'),
|
||||||
},
|
},
|
||||||
template: {},
|
template: {},
|
||||||
|
|||||||
+123
-24
@@ -1,11 +1,8 @@
|
|||||||
/* eslint-disable no-await-in-loop */
|
/* eslint-disable no-await-in-loop */
|
||||||
const Mongo = global.Hydro.nodeModules.mongodb;
|
const { mongodb, bson } = global.Hydro.nodeModules;
|
||||||
const { ObjectID } = global.Hydro.nodeModules.bson;
|
|
||||||
const dst = global.Hydro.service.db;
|
const dst = global.Hydro.service.db;
|
||||||
const { problem } = global.Hydro.model.problem;
|
const { problem } = global.Hydro.model.problem;
|
||||||
|
|
||||||
const RULES = ['', 'oi', 'acm'];
|
|
||||||
|
|
||||||
const tasks = {
|
const tasks = {
|
||||||
user: async (docs) => docs.map((doc) => ({
|
user: async (docs) => docs.map((doc) => ({
|
||||||
_id: doc._id,
|
_id: doc._id,
|
||||||
@@ -17,11 +14,21 @@ const tasks = {
|
|||||||
gravatar: doc.gravatar,
|
gravatar: doc.gravatar,
|
||||||
email: doc.mail,
|
email: doc.mail,
|
||||||
emailLower: doc.mail_lower,
|
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) => ({
|
problem: async (docs) => docs.map((doc) => ({
|
||||||
_id: doc._id,
|
_id: doc._id,
|
||||||
pid: doc.doc_id || new ObjectID(),
|
pid: doc.pname || doc.doc_id.toString() || new bson.ObjectID(),
|
||||||
title: doc.title,
|
title: doc.title,
|
||||||
content: doc.content,
|
content: doc.content,
|
||||||
owner: doc.owner_uid,
|
owner: doc.owner_uid,
|
||||||
@@ -43,30 +50,120 @@ const tasks = {
|
|||||||
}
|
}
|
||||||
return problems;
|
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,
|
_id: doc._id,
|
||||||
title: doc.title,
|
|
||||||
content: doc.content,
|
|
||||||
owner: doc.owner_uid,
|
owner: doc.owner_uid,
|
||||||
rule: RULES[doc.rule],
|
ip: doc.ip,
|
||||||
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,
|
|
||||||
content: doc.content,
|
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 = {
|
const cursor = {
|
||||||
|
user: (s) => s.collection('user').find(),
|
||||||
problem: (s) => s.collection('document').find({ doc_type: 10 }),
|
problem: (s) => s.collection('document').find({ doc_type: 10 }),
|
||||||
'problem.status': (s) => s.collection('document.status').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 }),
|
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) {
|
async function task(name, src, report) {
|
||||||
@@ -86,7 +183,7 @@ async function migrateVijos({
|
|||||||
let mongourl = 'mongodb://';
|
let mongourl = 'mongodb://';
|
||||||
if (username) mongourl += `${username}:${password}@`;
|
if (username) mongourl += `${username}:${password}@`;
|
||||||
mongourl += `${host}:${port}/${name}`;
|
mongourl += `${host}:${port}/${name}`;
|
||||||
const Database = await Mongo.MongoClient.connect(mongourl, {
|
const Database = await mongodb.MongoClient.connect(mongourl, {
|
||||||
useNewUrlParser: true, useUnifiedTopology: true,
|
useNewUrlParser: true, useUnifiedTopology: true,
|
||||||
});
|
});
|
||||||
const src = Database.db(name);
|
const src = Database.db(name);
|
||||||
@@ -96,9 +193,11 @@ async function migrateVijos({
|
|||||||
value: (await src.collection('system').findOne({ _id: 'user_counter' })).value,
|
value: (await src.collection('system').findOne({ _id: 'user_counter' })).value,
|
||||||
});
|
});
|
||||||
await report({ progress: 1, message: 'Collection:system done.' });
|
await report({ progress: 1, message: 'Collection:system done.' });
|
||||||
await task('problem', src, report);
|
const t = [
|
||||||
await task('problem.status', src, report);
|
'user', 'problem', 'problem.status', 'solution', 'discussion',
|
||||||
await task('contest', src, report);
|
'discussion.reply', 'contest', 'training',
|
||||||
|
];
|
||||||
|
for (const i of t) await task(i, src, report);
|
||||||
}
|
}
|
||||||
|
|
||||||
global.Hydro.script.migrateVijos = module.exports = migrateVijos;
|
global.Hydro.script.migrateVijos = module.exports = migrateVijos;
|
||||||
@@ -17,9 +17,6 @@ export const STATUS_COMPILING = 21;
|
|||||||
export const STATUS_FETCHED = 22;
|
export const STATUS_FETCHED = 22;
|
||||||
export const STATUS_IGNORED = 30;
|
export const STATUS_IGNORED = 30;
|
||||||
|
|
||||||
export const TYPE_SUBMISSION = 0;
|
|
||||||
export const TYPE_PRETEST = 1;
|
|
||||||
|
|
||||||
export const STATUS_TEXTS = {
|
export const STATUS_TEXTS = {
|
||||||
[STATUS_WAITING]: 'Waiting',
|
[STATUS_WAITING]: 'Waiting',
|
||||||
[STATUS_ACCEPTED]: 'Accepted',
|
[STATUS_ACCEPTED]: 'Accepted',
|
||||||
@@ -90,9 +87,3 @@ export const STATUS_SCRATCHPAD_SHORT_TEXTS = {
|
|||||||
[STATUS_RUNTIME_ERROR]: 'RTE',
|
[STATUS_RUNTIME_ERROR]: 'RTE',
|
||||||
};
|
};
|
||||||
attachObjectMeta(STATUS_SCRATCHPAD_SHORT_TEXTS, 'exportToPython', false);
|
attachObjectMeta(STATUS_SCRATCHPAD_SHORT_TEXTS, 'exportToPython', false);
|
||||||
|
|
||||||
export const TYPE_TEXTS = {
|
|
||||||
[TYPE_SUBMISSION]: 'Submission',
|
|
||||||
[TYPE_PRETEST]: 'Pretest',
|
|
||||||
};
|
|
||||||
attachObjectMeta(TYPE_TEXTS, 'intKey', true);
|
|
||||||
Reference in new issue
Block a user