habitica-self-host/migrations/20180125_clean_new_notifications.js

94 lines
2.3 KiB
JavaScript
Raw Normal View History

Notifications v2 and Bailey API (#9716) * Added initial bailey api * wip * implement new panel header * Fixed lint * add ability to mark notification as seen * add notification count, remove top badge from user and add ability to mark multiple notifications as seen * add support dismissall and mark all as read * do not dismiss actionable notif * mark as seen when menu is opened instead of closed * implement ordering, list of actionable notifications * add groups messages and fix badges count * add notifications for received cards * send card received notification to target not sender * rename notificaion field * fix integration tests * mark cards notifications as read and update tests * add mystery items notifications * add unallocated stats points notifications * fix linting * simplify code * refactoring and fixes * fix dropdown opening * start splitting notifications into their own component * add notifications for inbox messages * fix unit tests * fix default buttons styles * add initial bailey support * add title and tests to new stuff notification * add notification if a group task needs more work * add tests and fixes for marking a task as needing more work * make sure user._v is updated * remove console.log * notification: hover status and margins * start styling notifications, add separate files and basic functionalities * fix tests * start adding mystery items notification * wip card notification * fix cards text * initial implementation inbox messages * initial implementation group messages * disable inbox notifications until mobile is ready * wip group chat messages * finish mystery and card notifications * add bailey notification and fix a lot of stuff * start adding guilds and parties invitations * misc invitation fixes * fix lint issues * remove old code and add key to notifications * fix tests * remove unused code * add link for public guilds invite * starts to implement needs work notification design and feature * fixes to needs work, add group task approved notification * finish needs work feature * lots of fixes * implement quest notification * bailey fixes and static page * routing fixes * fixes # this.$store.dispatch(guilds:join, {groupId: group.id, type: party}); * read notifications on click * chat notifications * fix tests for chat notifications * fix chat notification test * fix tests * fix tests (again) * try awaiting * remove only * more sleep * add bailey tests * fix icons alignment * fix issue with multiple points notifications * remove merge code * fix rejecting guild invitation * make remove area bigger * fix error with notifications and add migration * fix migration * fix typos * add cleanup migration too * notifications empty state, new counter color, fix marking messages as seen in guilds * fixes * add image and install correct packages * fix mongoose version * update bailey * typo * make sure chat is marked as read after other requests
2018-01-31 10:55:39 +00:00
const UserNotification = require('../website/server/models/userNotification').model;
const content = require('../website/common/script/content/index');
const migrationName = '20180125_clean_new_migrations';
const authorName = 'paglias'; // in case script author needs to know when their ...
const authorUuid = 'ed4c688c-6652-4a92-9d03-a5a79844174a'; // ... own data is done
/*
* Clean new migration types for processed users
*/
const monk = require('monk');
const connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE
const dbUsers = monk(connectionString).get('users', { castIds: false });
const progressCount = 1000;
let count = 0;
function updateUser (user) {
count++;
const types = ['NEW_MYSTERY_ITEMS', 'CARD_RECEIVED', 'NEW_CHAT_MESSAGE'];
dbUsers.update({_id: user._id}, {
$pull: {notifications: { type: {$in: types } } },
$set: {migration: migrationName},
});
if (count % progressCount === 0) console.warn(`${count } ${ user._id}`);
if (user._id === authorUuid) console.warn(`${authorName } processed`);
}
function exiting (code, msg) {
code = code || 0; // 0 = success
if (code && !msg) {
msg = 'ERROR!';
}
if (msg) {
if (code) {
console.error(msg);
} else {
console.log(msg);
}
}
process.exit(code);
}
function displayData () {
console.warn(`\n${ count } users processed\n`);
return exiting(0);
}
function updateUsers (users) {
if (!users || users.length === 0) {
console.warn('All appropriate users found and modified.');
displayData();
return;
}
const userPromises = users.map(updateUser);
const lastUser = users[users.length - 1];
return Promise.all(userPromises)
.then(() => {
processUsers(lastUser._id);
});
}
function processUsers (lastId) {
// specify a query to limit the affected users (empty for all users):
const query = {
migration: {$ne: migrationName},
'auth.timestamps.loggedin': {$gt: new Date('2010-01-24')},
};
if (lastId) {
query._id = {
$gt: lastId,
};
}
dbUsers.find(query, {
sort: {_id: 1},
limit: 250,
})
.then(updateUsers)
.catch((err) => {
console.log(err);
return exiting(1, `ERROR! ${ err}`);
});
}
module.exports = processUsers;