diff --git a/modules/account/back/methods/account/sync.js b/modules/account/back/methods/account/sync.js index 0eab0ef63..1026c5020 100644 --- a/modules/account/back/methods/account/sync.js +++ b/modules/account/back/methods/account/sync.js @@ -26,24 +26,46 @@ module.exports = Self => { }); Self.sync = async function(userName, password, force, options) { + const models = Self.app.models; const myOptions = {}; - + let tx; + if (typeof options == 'object') Object.assign(myOptions, options); - const models = Self.app.models; - const user = await models.VnUser.findOne({ - fields: ['id', 'password'], - where: {name: userName} - }, myOptions); + if (!myOptions.transaction) { + tx = await Self.beginTransaction({}); + myOptions.transaction = tx; + }; - if (user && password && !await user.hasPassword(password)) - throw new ForbiddenError('Wrong password'); + try { + const user = await models.VnUser.findOne({ + fields: ['id', 'password'], + where: {name: userName} + }, myOptions); - const isSync = !await models.UserSync.exists(userName, myOptions); + if (user && password && !await user.hasPassword(password)) + throw new ForbiddenError('Wrong password'); - if (!force && isSync && user) return; - await models.AccountConfig.syncUser(userName, password); - await models.UserSync.destroyById(userName, myOptions); + const isSync = !await models.UserSync.exists(userName, myOptions); + + if (!force && isSync && user) { + if (tx) await tx.rollback(); + return; + } + + await Self.rawSql(` + SELECT id + FROM account.user + WHERE id = ? + FOR UPDATE`, [user.id], myOptions); + + await models.AccountConfig.syncUser(userName, password); + await models.UserSync.destroyById(userName, myOptions); + if (tx) await tx.commit(); + } catch (err) { + if (tx) await tx.rollback(); + throw err; + } }; };