mirror of
https://github.com/wassname/talk.git
synced 2026-07-04 11:04:47 +08:00
209 lines
4.4 KiB
JavaScript
209 lines
4.4 KiB
JavaScript
const UserModel = require('../models/user');
|
|
const merge = require('lodash/merge');
|
|
|
|
const transformUser = user => {
|
|
const created_at = Date.now();
|
|
|
|
const { id, status, canEditName, suspension, disabled } = user;
|
|
|
|
let update = {
|
|
$unset: {
|
|
canEditName: '',
|
|
suspension: '',
|
|
disabled: '',
|
|
},
|
|
$set: {
|
|
status: {
|
|
// The username status is specific to each case.
|
|
username: {
|
|
history: [],
|
|
},
|
|
|
|
// The user is not banned by default.
|
|
banned: {
|
|
status: false,
|
|
history: [],
|
|
},
|
|
|
|
// The user is not suspended by default.
|
|
suspension: {
|
|
until: null,
|
|
history: [],
|
|
},
|
|
},
|
|
updated_at: created_at,
|
|
},
|
|
};
|
|
|
|
if (disabled) {
|
|
update = merge(update, {
|
|
$set: {
|
|
status: {
|
|
banned: {
|
|
status: true,
|
|
history: [
|
|
{
|
|
status: true,
|
|
created_at,
|
|
},
|
|
],
|
|
},
|
|
},
|
|
},
|
|
});
|
|
}
|
|
|
|
// If the user has an "until" property of their suspension, then we need
|
|
// to reflect that in the new status object.
|
|
if (suspension && suspension.until !== null) {
|
|
update = merge(update, {
|
|
$set: {
|
|
status: {
|
|
suspension: {
|
|
until: suspension.until,
|
|
history: [
|
|
{
|
|
until: suspension.until,
|
|
created_at,
|
|
},
|
|
],
|
|
},
|
|
},
|
|
},
|
|
});
|
|
}
|
|
|
|
switch (status) {
|
|
case 'ACTIVE':
|
|
if (canEditName) {
|
|
update = merge(update, {
|
|
$set: {
|
|
status: {
|
|
username: {
|
|
status: 'UNSET',
|
|
history: [
|
|
{
|
|
status: 'UNSET',
|
|
created_at,
|
|
},
|
|
],
|
|
},
|
|
},
|
|
},
|
|
});
|
|
} else {
|
|
update = merge(update, {
|
|
$set: {
|
|
status: {
|
|
username: {
|
|
status: 'SET',
|
|
history: [
|
|
{
|
|
status: 'SET',
|
|
created_at,
|
|
},
|
|
],
|
|
},
|
|
},
|
|
},
|
|
});
|
|
}
|
|
break;
|
|
case 'BANNED':
|
|
if (canEditName) {
|
|
update = merge(update, {
|
|
$set: {
|
|
status: {
|
|
username: {
|
|
status: 'REJECTED',
|
|
history: [
|
|
{
|
|
status: 'REJECTED',
|
|
created_at,
|
|
},
|
|
],
|
|
},
|
|
},
|
|
},
|
|
});
|
|
} else {
|
|
update = merge(update, {
|
|
$set: {
|
|
status: {
|
|
banned: {
|
|
status: true,
|
|
history: [
|
|
{
|
|
status: true,
|
|
created_at,
|
|
},
|
|
],
|
|
},
|
|
username: {
|
|
status: 'SET',
|
|
history: [
|
|
{
|
|
status: 'SET',
|
|
created_at,
|
|
},
|
|
],
|
|
},
|
|
},
|
|
},
|
|
});
|
|
}
|
|
break;
|
|
case 'PENDING':
|
|
update = merge(update, {
|
|
$set: {
|
|
status: {
|
|
username: {
|
|
status: 'CHANGED',
|
|
history: [
|
|
{
|
|
status: 'CHANGED',
|
|
created_at,
|
|
},
|
|
],
|
|
},
|
|
},
|
|
},
|
|
});
|
|
break;
|
|
case 'APPROVED':
|
|
update = merge(update, {
|
|
$set: {
|
|
status: {
|
|
username: {
|
|
status: 'APPROVED',
|
|
history: [
|
|
{
|
|
status: 'APPROVED',
|
|
created_at,
|
|
},
|
|
],
|
|
},
|
|
},
|
|
},
|
|
});
|
|
break;
|
|
default:
|
|
throw new Error(`${status} is an invalid status`);
|
|
}
|
|
|
|
return { query: { id }, update };
|
|
};
|
|
|
|
module.exports = {
|
|
async up({ transformSingleWithCursor }) {
|
|
// Get the first batch of users.
|
|
const cursor = UserModel.collection.find({
|
|
status: {
|
|
$in: ['ACTIVE', 'BANNED', 'PENDING', 'APPROVED'],
|
|
},
|
|
});
|
|
|
|
await transformSingleWithCursor(cursor, transformUser, UserModel);
|
|
},
|
|
};
|