mirror of
https://github.com/overleaf/overleaf.git
synced 2025-04-11 18:45:25 +00:00
Merge pull request #4049 from overleaf/jel-featuresUpdatedAt
Set featuresUpdatedAt GitOrigin-RevId: 87d53e5ff27a8ebce2ba8c7223d498b291d05a23
This commit is contained in:
parent
9b29fa7cbc
commit
3af7b2da30
4 changed files with 64 additions and 26 deletions
|
@ -3,7 +3,9 @@ const { User } = require('../../models/User')
|
|||
module.exports = {
|
||||
updateFeatures(userId, features, callback) {
|
||||
const conditions = { _id: userId }
|
||||
const update = {}
|
||||
const update = {
|
||||
featuresUpdatedAt: new Date(),
|
||||
}
|
||||
for (const key in features) {
|
||||
const value = features[key]
|
||||
update[`features.${key}`] = value
|
||||
|
@ -15,7 +17,7 @@ module.exports = {
|
|||
|
||||
overrideFeatures(userId, features, callback) {
|
||||
const conditions = { _id: userId }
|
||||
const update = { features }
|
||||
const update = { features, featuresUpdatedAt: new Date() }
|
||||
User.updateOne(conditions, update, (err, result) =>
|
||||
callback(err, (result ? result.nModified : 0) === 1)
|
||||
)
|
||||
|
|
|
@ -129,6 +129,7 @@ const UserSchema = new Schema({
|
|||
},
|
||||
},
|
||||
],
|
||||
featuresUpdatedAt: { type: Date },
|
||||
// when auto-merged from SL and must-reconfirm is set, we may end up using
|
||||
// `sharelatexHashedPassword` to recover accounts...
|
||||
sharelatexHashedPassword: String,
|
||||
|
|
|
@ -379,4 +379,17 @@ describe('FeatureUpdater.refreshFeatures', function () {
|
|||
})
|
||||
})
|
||||
})
|
||||
|
||||
it('should update featuresUpdatedAt', async function () {
|
||||
user = (await UserHelper.getUser({ _id: user._id })).user
|
||||
expect(user.featuresUpdatedAt).to.not.exist // no default set
|
||||
await FeaturesUpdater.promises.refreshFeatures(user._id, 'test')
|
||||
user = (await UserHelper.getUser({ _id: user._id })).user
|
||||
const featuresUpdatedAt = user.featuresUpdatedAt
|
||||
expect(featuresUpdatedAt).to.exist
|
||||
// refresh again
|
||||
await FeaturesUpdater.promises.refreshFeatures(user._id, 'test')
|
||||
user = (await UserHelper.getUser({ _id: user._id })).user
|
||||
expect(user.featuresUpdatedAt > featuresUpdatedAt).to.be.true
|
||||
})
|
||||
})
|
||||
|
|
|
@ -1,52 +1,74 @@
|
|||
/* eslint-disable
|
||||
camelcase,
|
||||
node/handle-callback-err,
|
||||
max-len,
|
||||
no-return-assign,
|
||||
no-unused-vars,
|
||||
*/
|
||||
// TODO: This file was created by bulk-decaffeinate.
|
||||
// Fix any style issues and re-enable lint.
|
||||
/*
|
||||
* decaffeinate suggestions:
|
||||
* DS102: Remove unnecessary code created because of implicit returns
|
||||
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
||||
*/
|
||||
const SandboxedModule = require('sandboxed-module')
|
||||
const { expect } = require('chai')
|
||||
const sinon = require('sinon')
|
||||
const modulePath =
|
||||
'../../../../app/src/Features/Subscription/UserFeaturesUpdater'
|
||||
const { assert } = require('chai')
|
||||
|
||||
describe('UserFeaturesUpdater', function () {
|
||||
beforeEach(function () {
|
||||
this.User = { updateOne: sinon.stub().callsArgWith(2) }
|
||||
return (this.UserFeaturesUpdater = SandboxedModule.require(modulePath, {
|
||||
this.UserFeaturesUpdater = SandboxedModule.require(modulePath, {
|
||||
requires: {
|
||||
'../../models/User': {
|
||||
User: this.User,
|
||||
},
|
||||
},
|
||||
}))
|
||||
})
|
||||
})
|
||||
|
||||
describe('updateFeatures', function () {
|
||||
it('should send the users features', function (done) {
|
||||
const user_id = '5208dd34438842e2db000005'
|
||||
const userId = '5208dd34438842e2db000005'
|
||||
this.features = { versioning: true, collaborators: 10 }
|
||||
return this.UserFeaturesUpdater.updateFeatures(
|
||||
user_id,
|
||||
this.UserFeaturesUpdater.updateFeatures(
|
||||
userId,
|
||||
this.features,
|
||||
(err, features) => {
|
||||
const update = {
|
||||
'features.versioning': true,
|
||||
'features.collaborators': 10,
|
||||
}
|
||||
this.User.updateOne
|
||||
.calledWith({ _id: user_id }, update)
|
||||
.should.equal(true)
|
||||
const updateArgs = this.User.updateOne.lastCall.args
|
||||
expect(updateArgs[0]).to.deep.equal({ _id: userId })
|
||||
expect(Object.keys(updateArgs[1]).length).to.equal(3)
|
||||
expect(updateArgs[1]['features.versioning']).to.equal(
|
||||
update['features.versioning']
|
||||
)
|
||||
expect(updateArgs[1]['features.collaborators']).to.equal(
|
||||
update['features.collaborators']
|
||||
)
|
||||
expect(updateArgs[1].featuresUpdatedAt instanceof Date).to.be.true
|
||||
features.should.deep.equal(this.features)
|
||||
return done()
|
||||
done()
|
||||
}
|
||||
)
|
||||
})
|
||||
})
|
||||
|
||||
describe('overrideFeatures', function () {
|
||||
it('should send the users features', function (done) {
|
||||
const userId = '5208dd34438842e2db000005'
|
||||
this.features = { versioning: true, collaborators: 10 }
|
||||
this.UserFeaturesUpdater.updateFeatures(
|
||||
userId,
|
||||
this.features,
|
||||
(err, features) => {
|
||||
const update = {
|
||||
'features.versioning': true,
|
||||
'features.collaborators': 10,
|
||||
}
|
||||
const updateArgs = this.User.updateOne.lastCall.args
|
||||
expect(updateArgs[0]).to.deep.equal({ _id: userId })
|
||||
expect(Object.keys(updateArgs[1]).length).to.equal(3)
|
||||
expect(updateArgs[1]['features.versioning']).to.equal(
|
||||
update['features.versioning']
|
||||
)
|
||||
expect(updateArgs[1]['features.collaborators']).to.equal(
|
||||
update['features.collaborators']
|
||||
)
|
||||
expect(updateArgs[1].featuresUpdatedAt instanceof Date).to.be.true
|
||||
features.should.deep.equal(this.features)
|
||||
done()
|
||||
}
|
||||
)
|
||||
})
|
||||
|
|
Loading…
Add table
Reference in a new issue