mirror of
https://github.com/overleaf/overleaf.git
synced 2024-11-21 20:47:08 -05:00
Merge pull request #3225 from overleaf/jpa-scripts-cleanup
[misc] delete unneeded scripts GitOrigin-RevId: 30b1c97dfde8d2e93b40c0df4cb8be9a963580ad
This commit is contained in:
parent
370ee79a30
commit
cec854de89
17 changed files with 0 additions and 939 deletions
|
@ -1,25 +0,0 @@
|
||||||
const { db } = require('../app/src/infrastructure/mongojs')
|
|
||||||
const logger = require('logger-sharelatex')
|
|
||||||
logger.logger.level('error')
|
|
||||||
|
|
||||||
logger.log({}, 'Updating users in mongo')
|
|
||||||
|
|
||||||
db.users.update(
|
|
||||||
{
|
|
||||||
'features.github': true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
$set: { 'features.gitBridge': true }
|
|
||||||
},
|
|
||||||
function(err, result) {
|
|
||||||
if (err) {
|
|
||||||
logger.err({ err: err, result: result }, 'Error updating users in mongo')
|
|
||||||
return
|
|
||||||
}
|
|
||||||
logger.log(
|
|
||||||
{ result: result },
|
|
||||||
'Updated users who have github to have gitBridge too'
|
|
||||||
)
|
|
||||||
process.exit(0)
|
|
||||||
}
|
|
||||||
)
|
|
|
@ -1,63 +0,0 @@
|
||||||
const { db } = require('../app/src/infrastructure/mongojs')
|
|
||||||
const async = require('async')
|
|
||||||
const minilist = require('minimist')
|
|
||||||
|
|
||||||
const updateUser = function(user, callback) {
|
|
||||||
console.log(`Updating user ${user._id}`)
|
|
||||||
const update = {
|
|
||||||
$set: {
|
|
||||||
emails: [
|
|
||||||
{
|
|
||||||
email: user.email,
|
|
||||||
createdAt: new Date()
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
db.users.update({ _id: user._id }, update, callback)
|
|
||||||
}
|
|
||||||
|
|
||||||
const updateUsers = (users, callback) =>
|
|
||||||
async.eachLimit(users, ASYNC_LIMIT, updateUser, function(error) {
|
|
||||||
if (error) {
|
|
||||||
callback(error)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
counter += users.length
|
|
||||||
console.log(`${counter} users updated`)
|
|
||||||
loopForUsers(callback)
|
|
||||||
})
|
|
||||||
|
|
||||||
var loopForUsers = callback =>
|
|
||||||
db.users
|
|
||||||
.find({ emails: { $exists: false } }, { email: 1 })
|
|
||||||
.limit(FETCH_LIMIT, function(error, users) {
|
|
||||||
if (error) {
|
|
||||||
callback(error)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if (users.length === 0) {
|
|
||||||
console.log(`DONE (${counter} users updated)`)
|
|
||||||
return callback()
|
|
||||||
}
|
|
||||||
updateUsers(users, callback)
|
|
||||||
})
|
|
||||||
|
|
||||||
var counter = 0
|
|
||||||
var run = () =>
|
|
||||||
loopForUsers(function(error) {
|
|
||||||
if (error) {
|
|
||||||
throw error
|
|
||||||
}
|
|
||||||
process.exit()
|
|
||||||
})
|
|
||||||
|
|
||||||
let FETCH_LIMIT, ASYNC_LIMIT
|
|
||||||
var setup = function() {
|
|
||||||
let args = minilist(process.argv.slice(2))
|
|
||||||
FETCH_LIMIT = args.fetch ? args.fetch : 100
|
|
||||||
ASYNC_LIMIT = args.async ? args.async : 10
|
|
||||||
}
|
|
||||||
|
|
||||||
setup()
|
|
||||||
run()
|
|
|
@ -1,63 +0,0 @@
|
||||||
const { DeletedProject } = require('../app/src/models/DeletedProject')
|
|
||||||
const Async = require('async')
|
|
||||||
|
|
||||||
DeletedProject.find({}, (error, deletedProjects) => {
|
|
||||||
if (error) {
|
|
||||||
throw error
|
|
||||||
}
|
|
||||||
|
|
||||||
Async.eachLimit(
|
|
||||||
deletedProjects,
|
|
||||||
10,
|
|
||||||
(deletedProject, cb) => {
|
|
||||||
if (deletedProject.project) {
|
|
||||||
const src = deletedProject.project
|
|
||||||
|
|
||||||
let values = {
|
|
||||||
'deleterData.deletedProjectId': src._id,
|
|
||||||
'deleterData.deletedProjectOwnerId': src.owner_ref,
|
|
||||||
'deleterData.deletedProjectCollaboratorIds': src.collaberator_refs,
|
|
||||||
'deleterData.deletedProjectReadOnlyIds': src.readOnly_refs,
|
|
||||||
'deleterData.deletedProjectReadWriteToken': src.tokens
|
|
||||||
? src.tokens.readAndWrite
|
|
||||||
: undefined,
|
|
||||||
'deleterData.deletedProjectOverleafId': src.overleaf
|
|
||||||
? src.overleaf.id
|
|
||||||
: undefined,
|
|
||||||
'deleterData.deletedProjectOverleafHistoryId':
|
|
||||||
src.overleaf && src.overleaf.history
|
|
||||||
? src.overleaf.history.id
|
|
||||||
: undefined,
|
|
||||||
'deleterData.deletedProjectReadOnlyToken': src.tokens
|
|
||||||
? src.tokens.readOnly
|
|
||||||
: undefined,
|
|
||||||
'deleterData.deletedProjectReadWriteTokenAccessIds':
|
|
||||||
src.tokenAccessReadOnly_refs,
|
|
||||||
'deleterData.deletedProjectReadOnlyTokenAccessIds':
|
|
||||||
src.tokenAccessReadAndWrite_refs,
|
|
||||||
'deleterData.deletedProjectLastUpdatedAt': src.lastUpdated
|
|
||||||
}
|
|
||||||
|
|
||||||
Object.keys(values).forEach(
|
|
||||||
key => (values[key] === undefined ? delete values[key] : '')
|
|
||||||
)
|
|
||||||
|
|
||||||
DeletedProject.findOneAndUpdate(
|
|
||||||
{ _id: deletedProject._id },
|
|
||||||
{
|
|
||||||
$set: values
|
|
||||||
},
|
|
||||||
cb
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
cb()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
err => {
|
|
||||||
if (err) {
|
|
||||||
throw err
|
|
||||||
}
|
|
||||||
process.exit(0)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
})
|
|
|
@ -1,97 +0,0 @@
|
||||||
const { DeletedProject } = require('../app/src/models/DeletedProject')
|
|
||||||
const { DeletedUser } = require('../app/src/models/DeletedUser')
|
|
||||||
const { db } = require('../app/src/infrastructure/mongojs')
|
|
||||||
const pLimit = require('p-limit')
|
|
||||||
|
|
||||||
const CONCURRENCY = 10
|
|
||||||
|
|
||||||
function getCollectionContents(collection) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
collection.find({}).toArray((error, contents) => {
|
|
||||||
if (error) {
|
|
||||||
reject(error)
|
|
||||||
} else {
|
|
||||||
resolve(contents)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function deleteCollectionItem(collection, id) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
collection.remove({ _id: id }, error => {
|
|
||||||
if (error) {
|
|
||||||
reject(error)
|
|
||||||
} else {
|
|
||||||
resolve()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
async function backfillUser(user) {
|
|
||||||
await DeletedUser.create({
|
|
||||||
user: user,
|
|
||||||
deleterData: {
|
|
||||||
deletedAt: new Date(),
|
|
||||||
deletedUserId: user._id,
|
|
||||||
deletedUserLastLoggedIn: user.lastLoggedIn,
|
|
||||||
deletedUserSignUpDate: user.signUpDate,
|
|
||||||
deletedUserLoginCount: user.loginCount,
|
|
||||||
deletedUserReferralId: user.referal_id,
|
|
||||||
deletedUserReferredUsers: user.refered_users,
|
|
||||||
deletedUserReferredUserCount: user.refered_user_count,
|
|
||||||
deletedUserOverleafId: user.overleaf ? user.overleaf.id : undefined
|
|
||||||
}
|
|
||||||
})
|
|
||||||
await deleteCollectionItem(db.usersDeletedByMigration, user._id)
|
|
||||||
}
|
|
||||||
|
|
||||||
async function backfillProject(project) {
|
|
||||||
await DeletedProject.create({
|
|
||||||
project: project,
|
|
||||||
deleterData: {
|
|
||||||
deletedAt: new Date(),
|
|
||||||
deletedProjectId: project._id,
|
|
||||||
deletedProjectOwnerId: project.owner_ref,
|
|
||||||
deletedProjectCollaboratorIds: project.collaberator_refs,
|
|
||||||
deletedProjectReadOnlyIds: project.readOnly_refs,
|
|
||||||
deletedProjectReadWriteTokenAccessIds:
|
|
||||||
project.tokenAccessReadAndWrite_refs,
|
|
||||||
deletedProjectReadOnlyTokenAccessIds: project.tokenAccessReadOnly_refs,
|
|
||||||
deletedProjectReadWriteToken: project.tokens
|
|
||||||
? project.tokens.readAndWrite
|
|
||||||
: undefined,
|
|
||||||
deletedProjectReadOnlyToken: project.tokens
|
|
||||||
? project.tokens.readOnly
|
|
||||||
: undefined,
|
|
||||||
deletedProjectLastUpdatedAt: project.lastUpdated
|
|
||||||
}
|
|
||||||
})
|
|
||||||
await deleteCollectionItem(db.projectsDeletedByMigration, project._id)
|
|
||||||
}
|
|
||||||
|
|
||||||
async function backfillUsers() {
|
|
||||||
const limit = pLimit(CONCURRENCY)
|
|
||||||
|
|
||||||
const migrationUsers = await getCollectionContents(db.usersDeletedByMigration)
|
|
||||||
console.log('Found ' + migrationUsers.length + ' users')
|
|
||||||
await Promise.all(migrationUsers.map(user => limit(() => backfillUser(user))))
|
|
||||||
}
|
|
||||||
|
|
||||||
async function backfillProjects() {
|
|
||||||
const limit = pLimit(CONCURRENCY)
|
|
||||||
|
|
||||||
const migrationProjects = await getCollectionContents(
|
|
||||||
db.projectsDeletedByMigration
|
|
||||||
)
|
|
||||||
console.log('Found ' + migrationProjects.length + ' projects')
|
|
||||||
await Promise.all(
|
|
||||||
migrationProjects.map(project => limit(() => backfillProject(project)))
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
Promise.all([backfillProjects(), backfillUsers()]).then(() => {
|
|
||||||
console.log('Finished')
|
|
||||||
process.exit(0)
|
|
||||||
})
|
|
|
@ -1,40 +0,0 @@
|
||||||
const { db } = require('../app/src/infrastructure/mongojs')
|
|
||||||
const Async = require('async')
|
|
||||||
const minimist = require('minimist')
|
|
||||||
|
|
||||||
const argv = minimist(process.argv.slice(2))
|
|
||||||
const limit = argv.limit
|
|
||||||
|
|
||||||
if (!limit) {
|
|
||||||
console.log('Please supply an async limit with --limit')
|
|
||||||
process.exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
db.users.find(
|
|
||||||
{ hashedPassword: { $exists: 1 }, sharelatexHashedPassword: { $exists: 0 } },
|
|
||||||
{ hashedPassword: 1 },
|
|
||||||
(err, users) => {
|
|
||||||
if (err) {
|
|
||||||
throw err
|
|
||||||
}
|
|
||||||
|
|
||||||
Async.eachLimit(
|
|
||||||
users,
|
|
||||||
limit,
|
|
||||||
(user, cb) => {
|
|
||||||
db.users.update(
|
|
||||||
{ _id: user._id },
|
|
||||||
{ $set: { sharelatexHashedPassword: user.hashedPassword } },
|
|
||||||
cb
|
|
||||||
)
|
|
||||||
},
|
|
||||||
err => {
|
|
||||||
if (err) {
|
|
||||||
throw err
|
|
||||||
}
|
|
||||||
console.log('finished')
|
|
||||||
process.exit(0)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
)
|
|
|
@ -1,41 +0,0 @@
|
||||||
const readline = require('readline')
|
|
||||||
const { Project } = require('../app/src/models/Project')
|
|
||||||
const FileStoreHandler = require('../app/src/Features/FileStore/FileStoreHandler')
|
|
||||||
const { DeletedProject } = require('../app/src/models/DeletedProject')
|
|
||||||
|
|
||||||
/* eslint-disable no-console */
|
|
||||||
|
|
||||||
async function deleteFiles() {
|
|
||||||
const rl = readline.createInterface({
|
|
||||||
input: process.stdin
|
|
||||||
})
|
|
||||||
|
|
||||||
for await (const projectId of rl) {
|
|
||||||
try {
|
|
||||||
const projectCount = await Project.count({ _id: projectId }).exec()
|
|
||||||
if (projectCount > 0) {
|
|
||||||
throw new Error('found an existing project - refusing')
|
|
||||||
}
|
|
||||||
const count = await DeletedProject.count({
|
|
||||||
'deleterData.deletedProjectId': projectId,
|
|
||||||
project: { $ne: null }
|
|
||||||
}).exec()
|
|
||||||
if (count > 0) {
|
|
||||||
throw new Error('found an existing deleted project - refusing')
|
|
||||||
}
|
|
||||||
await FileStoreHandler.promises.deleteProject(projectId)
|
|
||||||
console.error(projectId, 'OK')
|
|
||||||
} catch (err) {
|
|
||||||
console.error(projectId, 'ERROR', err.name, err.message)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
deleteFiles()
|
|
||||||
.then(() => {
|
|
||||||
process.exit(0)
|
|
||||||
})
|
|
||||||
.catch(err => {
|
|
||||||
console.log('Aiee, something went wrong!', err)
|
|
||||||
process.exit(1)
|
|
||||||
})
|
|
|
@ -1,92 +0,0 @@
|
||||||
const { db } = require('../app/src/infrastructure/mongojs')
|
|
||||||
const async = require('async')
|
|
||||||
const minilist = require('minimist')
|
|
||||||
|
|
||||||
const newTimeout = 240
|
|
||||||
const oldTimeoutLimits = { $gt: 60, $lt: 240 }
|
|
||||||
|
|
||||||
const updateUser = function(user, callback) {
|
|
||||||
console.log(`Updating user ${user._id}`)
|
|
||||||
const update = {
|
|
||||||
$set: {
|
|
||||||
'features.compileTimeout': newTimeout
|
|
||||||
}
|
|
||||||
}
|
|
||||||
db.users.update(
|
|
||||||
{
|
|
||||||
_id: user._id,
|
|
||||||
'features.compileTimeout': oldTimeoutLimits
|
|
||||||
},
|
|
||||||
update,
|
|
||||||
callback
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
const updateUsers = (users, callback) =>
|
|
||||||
async.eachLimit(users, ASYNC_LIMIT, updateUser, function(error) {
|
|
||||||
if (error) {
|
|
||||||
callback(error)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
counter += users.length
|
|
||||||
console.log(`${counter} users updated`)
|
|
||||||
if (DO_ALL) {
|
|
||||||
return loopForUsers(callback)
|
|
||||||
} else {
|
|
||||||
console.log('*** run again to continue updating ***')
|
|
||||||
return callback()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
var loopForUsers = callback =>
|
|
||||||
db.users
|
|
||||||
.find(
|
|
||||||
{ 'features.compileTimeout': oldTimeoutLimits },
|
|
||||||
{ 'features.compileTimeout': 1 }
|
|
||||||
)
|
|
||||||
.limit(FETCH_LIMIT, function(error, users) {
|
|
||||||
if (error) {
|
|
||||||
callback(error)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if (users.length === 0) {
|
|
||||||
console.log(`DONE (${counter} users updated)`)
|
|
||||||
return callback()
|
|
||||||
}
|
|
||||||
updateUsers(users, callback)
|
|
||||||
})
|
|
||||||
|
|
||||||
var counter = 0
|
|
||||||
var run = () =>
|
|
||||||
loopForUsers(function(error) {
|
|
||||||
if (error) {
|
|
||||||
throw error
|
|
||||||
}
|
|
||||||
process.exit()
|
|
||||||
})
|
|
||||||
|
|
||||||
let FETCH_LIMIT, ASYNC_LIMIT, DO_ALL
|
|
||||||
var setup = function() {
|
|
||||||
let args = minilist(process.argv.slice(2))
|
|
||||||
// --fetch N get N users each time
|
|
||||||
FETCH_LIMIT = args.fetch ? args.fetch : 100
|
|
||||||
// --async M run M updates in parallel
|
|
||||||
ASYNC_LIMIT = args.async ? args.async : 10
|
|
||||||
// --all means run to completion
|
|
||||||
if (args.all) {
|
|
||||||
if (args.fetch) {
|
|
||||||
console.error('error: do not use --fetch with --all')
|
|
||||||
process.exit(1)
|
|
||||||
} else {
|
|
||||||
DO_ALL = true
|
|
||||||
// if we are updating for all users then ignore the fetch limit.
|
|
||||||
FETCH_LIMIT = 0
|
|
||||||
// A limit() value of 0 (i.e. .limit(0)) is equivalent to setting
|
|
||||||
// no limit.
|
|
||||||
// https://docs.mongodb.com/manual/reference/method/cursor.limit
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
setup()
|
|
||||||
run()
|
|
|
@ -1,22 +0,0 @@
|
||||||
const { db } = require('../../app/src/infrastructure/mongojs')
|
|
||||||
|
|
||||||
const keys = { 'tokens.readAndWritePrefix': 1 }
|
|
||||||
const opts = {
|
|
||||||
unique: true,
|
|
||||||
partialFilterExpression: {
|
|
||||||
'tokens.readAndWritePrefix': { $exists: true }
|
|
||||||
},
|
|
||||||
background: true
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log(
|
|
||||||
`>> Creating index on ${JSON.stringify(keys)}, ${JSON.stringify(opts)}`
|
|
||||||
)
|
|
||||||
|
|
||||||
db.projects.createIndex(keys, opts, err => {
|
|
||||||
if (err) {
|
|
||||||
throw err
|
|
||||||
}
|
|
||||||
console.log('>> done')
|
|
||||||
process.exit(0)
|
|
||||||
})
|
|
|
@ -1,30 +0,0 @@
|
||||||
const { db, ObjectId } = require('../../app/src/infrastructure/mongojs')
|
|
||||||
const Async = require('async')
|
|
||||||
|
|
||||||
const projectIds = [
|
|
||||||
// put ids here
|
|
||||||
]
|
|
||||||
|
|
||||||
Async.eachLimit(
|
|
||||||
projectIds,
|
|
||||||
5,
|
|
||||||
(projectId, cb) => {
|
|
||||||
db.projects.update(
|
|
||||||
{ _id: ObjectId(projectId) },
|
|
||||||
{
|
|
||||||
$unset: { tokens: 1 },
|
|
||||||
$set: { publicAccesLevel: 'private' }
|
|
||||||
},
|
|
||||||
err => {
|
|
||||||
if (err) return cb(err)
|
|
||||||
console.log(`Deactivated tokens for ${projectId}`)
|
|
||||||
cb()
|
|
||||||
}
|
|
||||||
)
|
|
||||||
},
|
|
||||||
err => {
|
|
||||||
if (err) throw err
|
|
||||||
console.log('>> Done')
|
|
||||||
process.exit(0)
|
|
||||||
}
|
|
||||||
)
|
|
|
@ -1,43 +0,0 @@
|
||||||
const { db } = require('../../app/src/infrastructure/mongojs')
|
|
||||||
const Async = require('async')
|
|
||||||
|
|
||||||
db.projects.find(
|
|
||||||
{
|
|
||||||
'tokens.readAndWrite': { $exists: true },
|
|
||||||
'tokens.readAndWritePrefix': { $exists: false }
|
|
||||||
},
|
|
||||||
{ tokens: 1 },
|
|
||||||
(err, projects) => {
|
|
||||||
if (err) {
|
|
||||||
throw err
|
|
||||||
}
|
|
||||||
console.log(`>> Updating ${projects.length} projects`)
|
|
||||||
Async.eachLimit(
|
|
||||||
projects,
|
|
||||||
5,
|
|
||||||
(project, cb) => {
|
|
||||||
const rwToken = project.tokens.readAndWrite
|
|
||||||
const prefixMatch = rwToken.match(/^(\d+).*$/)
|
|
||||||
if (!prefixMatch) {
|
|
||||||
const err = new Error(
|
|
||||||
`no prefix on token: ${project._id}, ${rwToken}`
|
|
||||||
)
|
|
||||||
console.log(`>> Error, ${err.message}`)
|
|
||||||
return cb(err)
|
|
||||||
}
|
|
||||||
db.projects.update(
|
|
||||||
{ _id: project._id },
|
|
||||||
{ $set: { 'tokens.readAndWritePrefix': prefixMatch[1] } },
|
|
||||||
cb
|
|
||||||
)
|
|
||||||
},
|
|
||||||
err => {
|
|
||||||
if (err) {
|
|
||||||
throw err
|
|
||||||
}
|
|
||||||
console.log('>> done')
|
|
||||||
process.exit(0)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
)
|
|
|
@ -1,39 +0,0 @@
|
||||||
const ProjectDetailsHandler = require('../../app/src/Features/Project/ProjectDetailsHandler')
|
|
||||||
const Async = require('async')
|
|
||||||
|
|
||||||
const projectIds = [
|
|
||||||
// put ids here
|
|
||||||
]
|
|
||||||
|
|
||||||
Async.eachLimit(
|
|
||||||
projectIds,
|
|
||||||
5,
|
|
||||||
(projectId, cb) => {
|
|
||||||
ProjectDetailsHandler.setPublicAccessLevel(projectId, 'tokenBased', err => {
|
|
||||||
if (err) {
|
|
||||||
return cb(err)
|
|
||||||
}
|
|
||||||
console.log(
|
|
||||||
`>> Set public-access-level to tokenBased for project ${projectId}`
|
|
||||||
)
|
|
||||||
ProjectDetailsHandler.ensureTokensArePresent(projectId, (err, tokens) => {
|
|
||||||
if (err) {
|
|
||||||
return cb(err)
|
|
||||||
}
|
|
||||||
console.log(
|
|
||||||
`>> Re-generated tokens for project ${projectId}, ${JSON.stringify(
|
|
||||||
tokens
|
|
||||||
)}`
|
|
||||||
)
|
|
||||||
cb()
|
|
||||||
})
|
|
||||||
})
|
|
||||||
},
|
|
||||||
err => {
|
|
||||||
if (err) {
|
|
||||||
throw err
|
|
||||||
}
|
|
||||||
console.log('>> Done')
|
|
||||||
process.exit(0)
|
|
||||||
}
|
|
||||||
)
|
|
|
@ -1,77 +0,0 @@
|
||||||
//
|
|
||||||
// Remove the brandVariationId attribute from project documents that have
|
|
||||||
// that attribute, which value matches the one given.
|
|
||||||
//
|
|
||||||
// node scripts/remove_brand_variation_ids.js 3
|
|
||||||
// gives a report of project documents that have brandVariationId attribute
|
|
||||||
// with value, "3"
|
|
||||||
//
|
|
||||||
// node scripts/remove_brand_variation_ids.js 3 --commit true
|
|
||||||
// actually removes the brandVariationId attribute from project documents
|
|
||||||
// that have brandVariationId attribute with value, "3"
|
|
||||||
//
|
|
||||||
const { db } = require('../app/src/infrastructure/mongojs')
|
|
||||||
const async = require('async')
|
|
||||||
const minimist = require('minimist')
|
|
||||||
|
|
||||||
const argv = minimist(process.argv.slice(2))
|
|
||||||
const bvId = argv._[0]
|
|
||||||
const commit = argv.commit !== undefined
|
|
||||||
const maxParallel = 4
|
|
||||||
|
|
||||||
console.log(
|
|
||||||
(commit ? 'Remove' : 'Dry run for remove') +
|
|
||||||
' brandVariationId from projects that have { brandVariationId: ' +
|
|
||||||
bvId +
|
|
||||||
' }'
|
|
||||||
)
|
|
||||||
|
|
||||||
var count = 0
|
|
||||||
|
|
||||||
db.projects.find(
|
|
||||||
{ brandVariationId: bvId.toString() },
|
|
||||||
{ _id: 1, name: 1 },
|
|
||||||
processRemovals
|
|
||||||
)
|
|
||||||
|
|
||||||
function processRemovals(err, projects) {
|
|
||||||
if (err) throw err
|
|
||||||
async.eachLimit(
|
|
||||||
projects,
|
|
||||||
maxParallel,
|
|
||||||
function(project, cb) {
|
|
||||||
count += 1
|
|
||||||
console.log(
|
|
||||||
(commit ? 'Removing' : 'Would remove') +
|
|
||||||
' brandVariationId on project ' +
|
|
||||||
project._id +
|
|
||||||
', name: "' +
|
|
||||||
project.name +
|
|
||||||
'"'
|
|
||||||
)
|
|
||||||
if (commit) {
|
|
||||||
db.projects.update(
|
|
||||||
{ _id: project._id },
|
|
||||||
{ $unset: { brandVariationId: '' } },
|
|
||||||
cb
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
async.setImmediate(cb)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
function(err) {
|
|
||||||
if (err) {
|
|
||||||
console.log('There was a problem: ', err)
|
|
||||||
}
|
|
||||||
console.log(
|
|
||||||
'BrandVariationId ' +
|
|
||||||
(commit ? 'removed' : 'would be removed') +
|
|
||||||
' from ' +
|
|
||||||
count +
|
|
||||||
' projects'
|
|
||||||
)
|
|
||||||
|
|
||||||
process.exit()
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
|
@ -1,45 +0,0 @@
|
||||||
const { db } = require('../app/src/infrastructure/mongojs')
|
|
||||||
const minimist = require('minimist')
|
|
||||||
|
|
||||||
const argv = minimist(process.argv.slice(2))
|
|
||||||
const commit = argv.commit !== undefined
|
|
||||||
|
|
||||||
if (!commit) {
|
|
||||||
console.log('DOING DRY RUN. TO SAVE CHANGES PASS --commit')
|
|
||||||
}
|
|
||||||
|
|
||||||
function main(callback) {
|
|
||||||
const query = { 'overleaf.id': { $exists: true } }
|
|
||||||
db.users.count(query, (err, result) => {
|
|
||||||
if (err) {
|
|
||||||
return callback(err)
|
|
||||||
}
|
|
||||||
console.log(`>> Count: ${result}`)
|
|
||||||
if (!commit) {
|
|
||||||
return callback()
|
|
||||||
}
|
|
||||||
db.users.update(
|
|
||||||
query,
|
|
||||||
{ $unset: { hashedPassword: 1 } },
|
|
||||||
{ multi: true },
|
|
||||||
(err, result) => {
|
|
||||||
if (err) {
|
|
||||||
return callback(err)
|
|
||||||
}
|
|
||||||
console.log(`>> Updated users: ${JSON.stringify(result)}`)
|
|
||||||
return callback()
|
|
||||||
}
|
|
||||||
)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if (require.main === module) {
|
|
||||||
main(err => {
|
|
||||||
if (err) {
|
|
||||||
console.error(err)
|
|
||||||
return process.exit(1)
|
|
||||||
}
|
|
||||||
console.log('>> done')
|
|
||||||
process.exit(0)
|
|
||||||
})
|
|
||||||
}
|
|
|
@ -1,76 +0,0 @@
|
||||||
// Run like this:
|
|
||||||
// node ... --projectIds ./path/to/file/with/one/projectId/in/each/line
|
|
||||||
|
|
||||||
const fs = require('fs')
|
|
||||||
const { db, ObjectId } = require('../app/src/infrastructure/mongojs')
|
|
||||||
|
|
||||||
const minimist = require('minimist')
|
|
||||||
|
|
||||||
const argv = minimist(process.argv.slice(2))
|
|
||||||
const commit = argv.commit !== undefined
|
|
||||||
|
|
||||||
if (!argv.projectIds) {
|
|
||||||
console.error('--projectIds flag is missing')
|
|
||||||
process.exit(100)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!commit) {
|
|
||||||
console.log('DOING DRY RUN. TO SAVE CHANGES PASS --commit')
|
|
||||||
}
|
|
||||||
|
|
||||||
const languages = [
|
|
||||||
'am',
|
|
||||||
'hy',
|
|
||||||
'bn',
|
|
||||||
'gu',
|
|
||||||
'he',
|
|
||||||
'hi',
|
|
||||||
'hu',
|
|
||||||
'is',
|
|
||||||
'kn',
|
|
||||||
'ml',
|
|
||||||
'mr',
|
|
||||||
'or',
|
|
||||||
'ss',
|
|
||||||
'ta',
|
|
||||||
'te',
|
|
||||||
'uk',
|
|
||||||
'uz',
|
|
||||||
'zu',
|
|
||||||
'fi'
|
|
||||||
]
|
|
||||||
|
|
||||||
const projectIds = fs
|
|
||||||
.readFileSync(argv.projectIds, { encoding: 'utf-8' })
|
|
||||||
.split('\n')
|
|
||||||
.filter(Boolean)
|
|
||||||
|
|
||||||
function main(callback) {
|
|
||||||
const query = {
|
|
||||||
_id: { $in: projectIds.map(ObjectId) },
|
|
||||||
spellCheckLanguage: { $in: languages }
|
|
||||||
}
|
|
||||||
db.projects.update(
|
|
||||||
query,
|
|
||||||
{ $set: { spellCheckLanguage: '' } },
|
|
||||||
{ multi: true },
|
|
||||||
(err, result) => {
|
|
||||||
if (err) {
|
|
||||||
return callback(err)
|
|
||||||
}
|
|
||||||
console.log(`>> Updated projects: ${JSON.stringify(result)}`)
|
|
||||||
return callback()
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (require.main === module) {
|
|
||||||
main(err => {
|
|
||||||
if (err) {
|
|
||||||
console.error(err)
|
|
||||||
return process.exit(1)
|
|
||||||
}
|
|
||||||
console.log('>> done')
|
|
||||||
process.exit(0)
|
|
||||||
})
|
|
||||||
}
|
|
|
@ -1,53 +0,0 @@
|
||||||
const { db } = require('../../app/src/infrastructure/mongojs')
|
|
||||||
const async = require('async')
|
|
||||||
|
|
||||||
db.deletedSubscriptions.aggregate(
|
|
||||||
{ $match: { 'subscription.teamName': /(Work From Home|Work from Home)/ } },
|
|
||||||
{ $unwind: '$subscription.member_ids' },
|
|
||||||
{
|
|
||||||
$group: { _id: null, memberIds: { $addToSet: '$subscription.member_ids' } }
|
|
||||||
},
|
|
||||||
function(err, results) {
|
|
||||||
if (err) {
|
|
||||||
console.error(err)
|
|
||||||
process.exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!results.length) {
|
|
||||||
console.error('No users found')
|
|
||||||
process.exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
const userIds = results[0].memberIds
|
|
||||||
|
|
||||||
console.log('Id,First Name,Last Name,Sign Up Date,Emails')
|
|
||||||
|
|
||||||
async.eachLimit(
|
|
||||||
userIds,
|
|
||||||
10,
|
|
||||||
function(userId, callback) {
|
|
||||||
db.users.findOne(userId, function(err, user) {
|
|
||||||
if (user) {
|
|
||||||
const emails = user.emails.map(email => email.email)
|
|
||||||
console.log(
|
|
||||||
`${user._id},${user.first_name || ''},${user.last_name || ''},${
|
|
||||||
user.signUpDate
|
|
||||||
},${emails.join(',')}`
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
console.error('A group user was not found')
|
|
||||||
}
|
|
||||||
callback(err)
|
|
||||||
})
|
|
||||||
},
|
|
||||||
function(err) {
|
|
||||||
if (err) {
|
|
||||||
console.error(err)
|
|
||||||
process.exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
process.exit(0)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
)
|
|
|
@ -1,46 +0,0 @@
|
||||||
const NotificationsHandler = require('../../app/src/Features/Notifications/NotificationsHandler')
|
|
||||||
|
|
||||||
const { db } = require('../../app/src/infrastructure/mongojs')
|
|
||||||
const async = require('async')
|
|
||||||
|
|
||||||
const templateKey = 'wfh_2020_upgrade_offer'
|
|
||||||
const key = 'wfh-2020-upgrade-2020-06-01'
|
|
||||||
|
|
||||||
db.subscriptions.aggregate(
|
|
||||||
{ $match: { teamName: /(Work From Home|Work from Home)/ } },
|
|
||||||
{ $unwind: '$member_ids' },
|
|
||||||
{ $group: { _id: null, memberIds: { $addToSet: '$member_ids' } } },
|
|
||||||
function(err, results) {
|
|
||||||
if (err) {
|
|
||||||
throw err
|
|
||||||
}
|
|
||||||
|
|
||||||
const userIds = results[0].memberIds
|
|
||||||
|
|
||||||
async.eachLimit(
|
|
||||||
userIds,
|
|
||||||
10,
|
|
||||||
function(userId, callback) {
|
|
||||||
NotificationsHandler.createNotification(
|
|
||||||
userId,
|
|
||||||
key,
|
|
||||||
templateKey,
|
|
||||||
{},
|
|
||||||
null,
|
|
||||||
true,
|
|
||||||
function(err) {
|
|
||||||
if (err) {
|
|
||||||
return callback(err)
|
|
||||||
}
|
|
||||||
console.log('Notification created for user ' + userId)
|
|
||||||
callback()
|
|
||||||
}
|
|
||||||
)
|
|
||||||
},
|
|
||||||
function() {
|
|
||||||
console.log('Done')
|
|
||||||
process.exit(0)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
)
|
|
|
@ -1,87 +0,0 @@
|
||||||
const NotificationsHandler = require('../../app/src/Features/Notifications/NotificationsHandler')
|
|
||||||
|
|
||||||
const { db } = require('../../app/src/infrastructure/mongojs')
|
|
||||||
const async = require('async')
|
|
||||||
|
|
||||||
const templateKey = 'wfh_2020_upgrade_offer'
|
|
||||||
const oldKey = 'wfh-2020-upgrade-2020-06-01'
|
|
||||||
const key = 'wfh-2020-upgrade-2020-06-18'
|
|
||||||
|
|
||||||
db.subscriptions.aggregate(
|
|
||||||
{ $match: { teamName: /(Work From Home|Work from Home)/ } },
|
|
||||||
{ $unwind: '$member_ids' },
|
|
||||||
{ $group: { _id: null, memberIds: { $addToSet: '$member_ids' } } },
|
|
||||||
function(err, results) {
|
|
||||||
if (err) {
|
|
||||||
throw err
|
|
||||||
}
|
|
||||||
|
|
||||||
const userIds = results[0].memberIds
|
|
||||||
|
|
||||||
async.eachLimit(
|
|
||||||
userIds,
|
|
||||||
10,
|
|
||||||
function(userId, callback) {
|
|
||||||
async.series(
|
|
||||||
[
|
|
||||||
function(cb) {
|
|
||||||
db.notifications.findOne(
|
|
||||||
{ user_id: userId, key: oldKey },
|
|
||||||
function(err, notification) {
|
|
||||||
if (err) {
|
|
||||||
console.log('Error finding notification for ' + userId)
|
|
||||||
cb(err)
|
|
||||||
} else if (!notification) {
|
|
||||||
cb()
|
|
||||||
} else {
|
|
||||||
if (notification.templateKey && notification.messageOpts) {
|
|
||||||
db.notifications.update(
|
|
||||||
{
|
|
||||||
_id: notification._id
|
|
||||||
},
|
|
||||||
{
|
|
||||||
$unset: { templateKey: true, messageOpts: true }
|
|
||||||
},
|
|
||||||
cb
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
cb()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
},
|
|
||||||
function(cb) {
|
|
||||||
NotificationsHandler.createNotification(
|
|
||||||
userId,
|
|
||||||
key,
|
|
||||||
templateKey,
|
|
||||||
{},
|
|
||||||
null,
|
|
||||||
true,
|
|
||||||
cb
|
|
||||||
)
|
|
||||||
}
|
|
||||||
],
|
|
||||||
function(err) {
|
|
||||||
if (err) {
|
|
||||||
callback(err)
|
|
||||||
} else {
|
|
||||||
console.log('Notification created for user ' + userId)
|
|
||||||
callback()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
},
|
|
||||||
function(err) {
|
|
||||||
if (err) {
|
|
||||||
console.log(err)
|
|
||||||
process.exit(1)
|
|
||||||
} else {
|
|
||||||
console.log('Done')
|
|
||||||
process.exit(0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
)
|
|
Loading…
Reference in a new issue