mirror of
https://github.com/yu-i-i/overleaf-cep.git
synced 2026-11-15 14:43:46 +01:00
Merge pull request #28850 from overleaf/mfb-promisify-user-membership-view-model
Promisify UserMembershipViewModel.js GitOrigin-RevId: d06b44ca7df65886f420332a1f9fc3d5f9c989af
This commit is contained in:
committed by
Copybot
parent
e29de2b881
commit
2bd9ffbd6d
@@ -1,88 +1,60 @@
|
|||||||
/* eslint-disable
|
|
||||||
n/handle-callback-err,
|
|
||||||
max-len,
|
|
||||||
*/
|
|
||||||
// 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
|
|
||||||
* DS207: Consider shorter variations of null checks
|
|
||||||
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
|
||||||
*/
|
|
||||||
const UserGetter = require('../User/UserGetter')
|
const UserGetter = require('../User/UserGetter')
|
||||||
const { isObjectIdInstance } = require('../Helpers/Mongo')
|
const { isObjectIdInstance } = require('../Helpers/Mongo')
|
||||||
const { promisify } = require('@overleaf/promise-utils')
|
|
||||||
|
|
||||||
const UserMembershipViewModel = {
|
const UserMembershipViewModel = {
|
||||||
build(userOrEmail) {
|
build(userOrEmail) {
|
||||||
if (userOrEmail._id) {
|
if (userOrEmail._id) {
|
||||||
return buildUserViewModel(userOrEmail)
|
return buildUserViewModel(userOrEmail, false)
|
||||||
} else {
|
} else {
|
||||||
return buildUserViewModelWithEmail(userOrEmail)
|
return buildUserViewModelWithEmail(userOrEmail)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
buildAsync(userOrIdOrEmailArray, callback) {
|
async buildAsync(userOrIdOrEmailArray) {
|
||||||
if (callback == null) {
|
|
||||||
callback = function () {}
|
|
||||||
}
|
|
||||||
|
|
||||||
const userObjectIds = userOrIdOrEmailArray.filter(isObjectIdInstance)
|
const userObjectIds = userOrIdOrEmailArray.filter(isObjectIdInstance)
|
||||||
|
const results = []
|
||||||
return UserGetter.getUsers(
|
try {
|
||||||
userObjectIds,
|
const users = await UserGetter.promises.getUsers(userObjectIds, {
|
||||||
{
|
|
||||||
email: 1,
|
email: 1,
|
||||||
first_name: 1,
|
first_name: 1,
|
||||||
last_name: 1,
|
last_name: 1,
|
||||||
lastLoggedIn: 1,
|
lastLoggedIn: 1,
|
||||||
lastActive: 1,
|
lastActive: 1,
|
||||||
enrollment: 1,
|
enrollment: 1,
|
||||||
},
|
})
|
||||||
function (error, users) {
|
const usersMap = new Map()
|
||||||
const results = []
|
for (const user of users) {
|
||||||
|
usersMap.set(user._id.toString(), user)
|
||||||
if (error != null) {
|
|
||||||
userOrIdOrEmailArray.forEach(item => {
|
|
||||||
if (isObjectIdInstance(item)) {
|
|
||||||
results.push(buildUserViewModelWithId(item.toString()))
|
|
||||||
} else {
|
|
||||||
// `item` is a user or an email and can be parsed by #build
|
|
||||||
results.push(UserMembershipViewModel.build(item))
|
|
||||||
}
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
const usersMap = new Map()
|
|
||||||
for (const user of users) {
|
|
||||||
usersMap.set(user._id.toString(), user)
|
|
||||||
}
|
|
||||||
|
|
||||||
userOrIdOrEmailArray.forEach(item => {
|
|
||||||
if (isObjectIdInstance(item)) {
|
|
||||||
const user = usersMap.get(item.toString())
|
|
||||||
if (user == null) {
|
|
||||||
results.push(buildUserViewModelWithId(item.toString()))
|
|
||||||
} else {
|
|
||||||
results.push(buildUserViewModel(user))
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// `item` is a user or an email and can be parsed by #build
|
|
||||||
results.push(UserMembershipViewModel.build(item))
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
callback(null, results)
|
|
||||||
}
|
}
|
||||||
)
|
|
||||||
|
userOrIdOrEmailArray.forEach(item => {
|
||||||
|
if (isObjectIdInstance(item)) {
|
||||||
|
const user = usersMap.get(item.toString())
|
||||||
|
if (!user) {
|
||||||
|
results.push(buildUserViewModelWithId(item.toString()))
|
||||||
|
} else {
|
||||||
|
results.push(buildUserViewModel(user, false))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// `item` is a user or an email and can be parsed by #build
|
||||||
|
results.push(UserMembershipViewModel.build(item))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} catch (error) {
|
||||||
|
userOrIdOrEmailArray.forEach(item => {
|
||||||
|
if (isObjectIdInstance(item)) {
|
||||||
|
results.push(buildUserViewModelWithId(item.toString()))
|
||||||
|
} else {
|
||||||
|
// `item` is a user or an email and can be parsed by #build
|
||||||
|
results.push(UserMembershipViewModel.build(item))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return results
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildUserViewModel(user, isInvite) {
|
function buildUserViewModel(user, isInvite) {
|
||||||
if (isInvite == null) {
|
|
||||||
isInvite = false
|
|
||||||
}
|
|
||||||
return {
|
return {
|
||||||
_id: user._id || null,
|
_id: user._id || null,
|
||||||
email: user.email || null,
|
email: user.email || null,
|
||||||
@@ -106,7 +78,7 @@ const buildUserViewModelWithEmail = email => buildUserViewModel({ email }, true)
|
|||||||
const buildUserViewModelWithId = id => buildUserViewModel({ _id: id }, false)
|
const buildUserViewModelWithId = id => buildUserViewModel({ _id: id }, false)
|
||||||
|
|
||||||
UserMembershipViewModel.promises = {
|
UserMembershipViewModel.promises = {
|
||||||
buildAsync: promisify(UserMembershipViewModel.buildAsync),
|
buildAsync: UserMembershipViewModel.buildAsync,
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = UserMembershipViewModel
|
module.exports = UserMembershipViewModel
|
||||||
|
|||||||
@@ -1,15 +1,3 @@
|
|||||||
/* eslint-disable
|
|
||||||
n/handle-callback-err,
|
|
||||||
max-len,
|
|
||||||
no-return-assign,
|
|
||||||
*/
|
|
||||||
// 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 { expect } = require('chai')
|
const { expect } = require('chai')
|
||||||
const sinon = require('sinon')
|
const sinon = require('sinon')
|
||||||
const assertCalledWith = sinon.assert.calledWith
|
const assertCalledWith = sinon.assert.calledWith
|
||||||
@@ -25,7 +13,7 @@ const {
|
|||||||
|
|
||||||
describe('UserMembershipViewModel', function () {
|
describe('UserMembershipViewModel', function () {
|
||||||
beforeEach(function () {
|
beforeEach(function () {
|
||||||
this.UserGetter = { getUsers: sinon.stub() }
|
this.UserGetter = { promises: { getUsers: sinon.stub() } }
|
||||||
this.UserMembershipViewModel = SandboxedModule.require(modulePath, {
|
this.UserMembershipViewModel = SandboxedModule.require(modulePath, {
|
||||||
requires: {
|
requires: {
|
||||||
'mongodb-legacy': { ObjectId },
|
'mongodb-legacy': { ObjectId },
|
||||||
@@ -54,7 +42,7 @@ describe('UserMembershipViewModel', function () {
|
|||||||
describe('build', function () {
|
describe('build', function () {
|
||||||
it('build email', function () {
|
it('build email', function () {
|
||||||
const viewModel = this.UserMembershipViewModel.build(this.email)
|
const viewModel = this.UserMembershipViewModel.build(this.email)
|
||||||
return expect(viewModel).to.deep.equal({
|
expect(viewModel).to.deep.equal({
|
||||||
email: this.email,
|
email: this.email,
|
||||||
invite: true,
|
invite: true,
|
||||||
last_active_at: null,
|
last_active_at: null,
|
||||||
@@ -83,67 +71,49 @@ describe('UserMembershipViewModel', function () {
|
|||||||
|
|
||||||
describe('build async', function () {
|
describe('build async', function () {
|
||||||
beforeEach(function () {
|
beforeEach(function () {
|
||||||
return (this.UserMembershipViewModel.build = sinon.stub())
|
this.UserMembershipViewModel.build = sinon.stub()
|
||||||
})
|
})
|
||||||
|
|
||||||
it('build email', function (done) {
|
it('build email', async function () {
|
||||||
this.UserGetter.getUsers.yields(null, [])
|
this.UserGetter.promises.getUsers.resolves([])
|
||||||
return this.UserMembershipViewModel.buildAsync(
|
await this.UserMembershipViewModel.buildAsync([this.email])
|
||||||
[this.email],
|
assertCalledWith(this.UserMembershipViewModel.build, this.email)
|
||||||
(error, [viewModel]) => {
|
|
||||||
assertCalledWith(this.UserMembershipViewModel.build, this.email)
|
|
||||||
return done()
|
|
||||||
}
|
|
||||||
)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
it('build user', function (done) {
|
it('build user', async function () {
|
||||||
this.UserGetter.getUsers.yields(null, [])
|
this.UserGetter.promises.getUsers.resolves([])
|
||||||
return this.UserMembershipViewModel.buildAsync(
|
await this.UserMembershipViewModel.buildAsync([this.user])
|
||||||
[this.user],
|
assertCalledWith(this.UserMembershipViewModel.build, this.user)
|
||||||
(error, [viewModel]) => {
|
|
||||||
assertCalledWith(this.UserMembershipViewModel.build, this.user)
|
|
||||||
return done()
|
|
||||||
}
|
|
||||||
)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
it('build user id', function (done) {
|
it('build user id', async function () {
|
||||||
const user = {
|
const user = {
|
||||||
...this.user,
|
...this.user,
|
||||||
_id: new ObjectId(),
|
_id: new ObjectId(),
|
||||||
}
|
}
|
||||||
this.UserGetter.getUsers.yields(null, [user])
|
this.UserGetter.promises.getUsers.resolves([user])
|
||||||
return this.UserMembershipViewModel.buildAsync(
|
const [viewModel] = await this.UserMembershipViewModel.buildAsync([
|
||||||
[user._id],
|
user._id,
|
||||||
(error, [viewModel]) => {
|
])
|
||||||
expect(error).not.to.exist
|
assertNotCalled(this.UserMembershipViewModel.build)
|
||||||
assertNotCalled(this.UserMembershipViewModel.build)
|
expect(viewModel._id.toString()).to.equal(user._id.toString())
|
||||||
expect(viewModel._id.toString()).to.equal(user._id.toString())
|
expect(viewModel.email).to.equal(user.email)
|
||||||
expect(viewModel.email).to.equal(user.email)
|
expect(viewModel.first_name).to.equal(user.first_name)
|
||||||
expect(viewModel.first_name).to.equal(user.first_name)
|
expect(viewModel.invite).to.equal(false)
|
||||||
expect(viewModel.invite).to.equal(false)
|
expect(viewModel.email).to.exist
|
||||||
expect(viewModel.email).to.exist
|
expect(viewModel.enrollment).to.exist
|
||||||
expect(viewModel.enrollment).to.exist
|
expect(viewModel.enrollment).to.deep.equal(user.enrollment)
|
||||||
expect(viewModel.enrollment).to.deep.equal(user.enrollment)
|
|
||||||
return done()
|
|
||||||
}
|
|
||||||
)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
it('build user id with error', function (done) {
|
it('build user id with error', async function () {
|
||||||
this.UserGetter.getUsers.yields(new Error('nope'), [])
|
this.UserGetter.promises.getUsers.rejects(new Error('nope'))
|
||||||
const userId = new ObjectId()
|
const userId = new ObjectId()
|
||||||
return this.UserMembershipViewModel.buildAsync(
|
const [viewModel] = await this.UserMembershipViewModel.buildAsync([
|
||||||
[userId],
|
userId,
|
||||||
(error, [viewModel]) => {
|
])
|
||||||
expect(error).not.to.exist
|
assertNotCalled(this.UserMembershipViewModel.build)
|
||||||
assertNotCalled(this.UserMembershipViewModel.build)
|
expect(viewModel._id).to.equal(userId.toString())
|
||||||
expect(viewModel._id).to.equal(userId.toString())
|
expect(viewModel.email).not.to.exist
|
||||||
expect(viewModel.email).not.to.exist
|
|
||||||
return done()
|
|
||||||
}
|
|
||||||
)
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user