From 7724b202197f05cf379842b8640b5e2581a7f1ac Mon Sep 17 00:00:00 2001
From: Rodrigo Nascimento <rodrigoknascimento@gmail.com>
Date: Wed, 16 Sep 2015 14:34:32 -0300
Subject: [PATCH] Replace all Meteor.users.update

---
 .../rocketchat-lib/server/models/Users.coffee | 90 +++++++++++++++++++
 server/configuration/accounts_meld.coffee     |  9 +-
 server/methods/eraseRoom.coffee               |  4 -
 server/methods/registerUser.coffee            |  4 +-
 server/methods/resetAvatar.coffee             |  2 +-
 server/methods/saveUserPreferences.coffee     |  2 +-
 server/methods/saveUserProfile.coffee         |  4 +-
 server/methods/setAvatarFromService.coffee    |  4 +-
 server/methods/setUserActiveStatus.coffee     |  4 +-
 server/methods/updateUserUtcOffset.coffee     |  2 +-
 server/startup/migrations/v1.coffee           |  2 +-
 server/startup/migrations/v13.coffee          |  4 +-
 server/startup/migrations/v2.coffee           |  2 +-
 server/startup/migrations/v5.coffee           |  2 +-
 14 files changed, 106 insertions(+), 29 deletions(-)

diff --git a/packages/rocketchat-lib/server/models/Users.coffee b/packages/rocketchat-lib/server/models/Users.coffee
index ce41313a357..284a6e67dea 100644
--- a/packages/rocketchat-lib/server/models/Users.coffee
+++ b/packages/rocketchat-lib/server/models/Users.coffee
@@ -82,3 +82,93 @@ RocketChat.models.Users = new class asd extends RocketChat.models._Base
 				lastLogin: new Date
 
 		return @update _id, update
+
+	setServiceId: (_id, serviceName, serviceId) ->
+		update =
+			$set: {}
+
+		serviceIdKey = "services.#{serviceName}.id"
+		update.$set[serviceIdKey] = serviceData.id
+
+		return @update _id, update
+
+	setUsername: (_id, username) ->
+		update =
+			$set: username: username
+
+		return @update _id, update
+
+	setName: (_id, name) ->
+		update =
+			$set:
+				name: name
+
+		return @update _id, update
+
+	setAvatarOrigin: (_id, origin) ->
+		update =
+			$set:
+				avatarOrigin: origin
+
+		return @update _id, update
+
+	unsetAvatarOrigin: (_id) ->
+		update =
+			$unset:
+				avatarOrigin: 1
+
+		return @update _id, update
+
+	setUserActive: (_id, active=true) ->
+		update =
+			$set:
+				active: active
+
+		return @update _id, update
+
+	setAllUsersActive: (active) ->
+		update =
+			$set:
+				active: active
+
+		return @update {}, update, { multi: true }
+
+	unsetLoginTokens: (_id) ->
+		update =
+			$set:
+				"services.resume.loginTokens" : []
+
+		return @update _id, update
+
+	setLanguage: (_id, language) ->
+		update =
+			$set:
+				language: language
+
+		return @update _id, update
+
+	setProfile: (_id, profile) ->
+		update =
+			$set:
+				"settings.profile": profile
+
+		return @update _id, update
+
+	setPreferences: (_id, preferences) ->
+		update =
+			$set:
+				"settings.preferences": preferences
+
+		return @update _id, update
+
+	setUtcOffset: (_id, utcOffset) ->
+		query =
+			_id: _id
+			utcOffset:
+				$ne: utcOffset
+
+		update =
+			$set:
+				utcOffset: utcOffset
+
+		return @update query, update
diff --git a/server/configuration/accounts_meld.coffee b/server/configuration/accounts_meld.coffee
index 0794d7ec218..1893e66e434 100644
--- a/server/configuration/accounts_meld.coffee
+++ b/server/configuration/accounts_meld.coffee
@@ -25,13 +25,6 @@ Accounts.updateOrCreateUserFromExternalService = (serviceName, serviceData, opti
 		user = RocketChat.models.Users.findOneByVerifiedEmailAddress(serviceData.email, true)
 
 		if user?
-			serviceIdKey = "services." + serviceName + ".id"
-			update = {}
-			update[serviceIdKey] = serviceData.id
-			Meteor.users.update({
-				_id: user._id
-			}, {
-				$set: update
-			})
+			RocketChat.models.Users.setServiceId user._id, serviceName, serviceData.id
 
 	return orig_updateOrCreateUserFromExternalService.apply(this, arguments)
diff --git a/server/methods/eraseRoom.coffee b/server/methods/eraseRoom.coffee
index 0bb6e5d10b8..90881984d00 100644
--- a/server/methods/eraseRoom.coffee
+++ b/server/methods/eraseRoom.coffee
@@ -10,10 +10,6 @@ Meteor.methods
 
 			# ChatRoom.update({ _id: rid}, {'$pull': { userWatching: Meteor.userId(), userIn: Meteor.userId() }})
 
-			userUnset = {'$unset': {}}
-			userUnset.$unset['readMessages.' + rid] = ''
-			Meteor.users.update({_id: Meteor.userId()}, userUnset)
-
 			ChatMessage.remove({rid: rid})
 			ChatSubscription.remove({rid: rid})
 			ChatRoom.remove(rid)
diff --git a/server/methods/registerUser.coffee b/server/methods/registerUser.coffee
index e7596a3a04b..ec9baf84f49 100644
--- a/server/methods/registerUser.coffee
+++ b/server/methods/registerUser.coffee
@@ -6,9 +6,7 @@ Meteor.methods
 
 		userId = Accounts.createUser userData
 
-		Meteor.users.update userId,
-			$set:
-				name: formData.name
+		RocketChat.models.Users.setName userId, formData.name
 
 		if userData.email
 			Accounts.sendVerificationEmail(userId, userData.email);
diff --git a/server/methods/resetAvatar.coffee b/server/methods/resetAvatar.coffee
index 2b49fdbf3db..c3e31abe508 100644
--- a/server/methods/resetAvatar.coffee
+++ b/server/methods/resetAvatar.coffee
@@ -9,7 +9,7 @@ Meteor.methods
 
 		RocketChatFileAvatarInstance.deleteFile "#{user.username}.jpg"
 
-		Meteor.users.update user._id, {$unset: {avatarOrigin: 1}}
+		RocketChat.models.Users.unsetAvatarOrigin user._id
 
 		RocketChat.Notifications.notifyAll 'updateAvatar', {username: user.username}
 		return
diff --git a/server/methods/saveUserPreferences.coffee b/server/methods/saveUserPreferences.coffee
index bd04edc631a..4a7e414a0b2 100644
--- a/server/methods/saveUserPreferences.coffee
+++ b/server/methods/saveUserPreferences.coffee
@@ -23,6 +23,6 @@ Meteor.methods
 			if settings.autoImageLoad?
 				preferences.autoImageLoad = if settings.autoImageLoad is "1" then true else false
 
-			Meteor.users.update Meteor.userId(), { $set: { "settings.preferences": preferences } }
+			RocketChat.models.Users.setPreferences Meteor.userId(), preferences
 
 			return true
diff --git a/server/methods/saveUserProfile.coffee b/server/methods/saveUserProfile.coffee
index 4129201e979..40131de389e 100644
--- a/server/methods/saveUserProfile.coffee
+++ b/server/methods/saveUserProfile.coffee
@@ -2,7 +2,7 @@ Meteor.methods
 	saveUserProfile: (settings) ->
 		if Meteor.userId()
 			if settings.language?
-				Meteor.users.update Meteor.userId(), { $set: { language: settings.language } }
+				RocketChat.models.Users.setLanguage Meteor.userId(), settings.language
 
 			if settings.password?
 				Accounts.setPassword Meteor.userId(), settings.password, { logout: false }
@@ -12,6 +12,6 @@ Meteor.methods
 
 			profile = {}
 
-			Meteor.users.update Meteor.userId(), { $set: { "settings.profile": profile } }
+			RocketChat.models.Users.setProfile Meteor.userId(), profile
 
 			return true
diff --git a/server/methods/setAvatarFromService.coffee b/server/methods/setAvatarFromService.coffee
index 475c005a598..90df44e2ad2 100644
--- a/server/methods/setAvatarFromService.coffee
+++ b/server/methods/setAvatarFromService.coffee
@@ -8,7 +8,7 @@ Meteor.methods
 		user = Meteor.user()
 
 		if service is 'initials'
-			Meteor.users.update {_id: user._id}, {$set: {avatarOrigin: service}}
+			RocketChat.models.Users.setAvatarOrigin user._id, service
 			return
 
 		{image, contentType} = RocketChatFile.dataURIParse dataURI
@@ -17,7 +17,7 @@ Meteor.methods
 		ws = RocketChatFileAvatarInstance.createWriteStream "#{user.username}.jpg", contentType
 		ws.on 'end', Meteor.bindEnvironment ->
 			Meteor.setTimeout ->
-				Meteor.users.update {_id: user._id}, {$set: {avatarOrigin: service}}
+				RocketChat.models.Users.setAvatarOrigin user._id, service
 				RocketChat.Notifications.notifyAll 'updateAvatar', {username: user.username}
 			, 500
 
diff --git a/server/methods/setUserActiveStatus.coffee b/server/methods/setUserActiveStatus.coffee
index c44862871ec..59e4dd268c3 100644
--- a/server/methods/setUserActiveStatus.coffee
+++ b/server/methods/setUserActiveStatus.coffee
@@ -7,9 +7,9 @@ Meteor.methods
 		unless user?.admin is true
 			throw new Meteor.Error 'not-authorized', '[methods] setUserActiveStatus -> Not authorized'
 
-		Meteor.users.update userId, { $set: { active: active } }
+		RocketChat.models.Users.setUserActive userId, active
 
 		if active is false
-			Meteor.users.update userId, { $set: { "services.resume.loginTokens" : [] } }
+			RocketChat.models.Users.unsetLoginTokens userId
 
 		return true
diff --git a/server/methods/updateUserUtcOffset.coffee b/server/methods/updateUserUtcOffset.coffee
index f5b800c257e..a116647e1c2 100644
--- a/server/methods/updateUserUtcOffset.coffee
+++ b/server/methods/updateUserUtcOffset.coffee
@@ -5,4 +5,4 @@ Meteor.methods
 
 		@unblock()
 
-		Meteor.users.update({_id: @userId, utcOffset: {$ne: utcOffset}}, {$set: {utcOffset: utcOffset}})
\ No newline at end of file
+		RocketChat.models.Users.setUtcOffset @userId, utcOffset
diff --git a/server/startup/migrations/v1.coffee b/server/startup/migrations/v1.coffee
index f56561d7342..e2f1756dd10 100644
--- a/server/startup/migrations/v1.coffee
+++ b/server/startup/migrations/v1.coffee
@@ -5,6 +5,6 @@ Meteor.startup ->
 			RocketChat.models.Users.find({username: {$exists: false}, lastLogin: {$exists: true}}).forEach (user) ->
 				username = generateSuggestion(user)
 				if username? and username.trim() isnt ''
-					Meteor.users.update({_id: user._id}, {$set: {username: username}})
+					RocketChat.models.Users.setUsername user._id, username
 				else
 					console.log "User without username", JSON.stringify(user, null, ' ')
diff --git a/server/startup/migrations/v13.coffee b/server/startup/migrations/v13.coffee
index be8b90dbee5..0d7c18d745e 100644
--- a/server/startup/migrations/v13.coffee
+++ b/server/startup/migrations/v13.coffee
@@ -3,5 +3,5 @@ Meteor.startup ->
 		version: 13
 		up: ->
 			# Set all current users as active
-			Meteor.users.update {}, { $set: { active: true } }, { multi: true }
-			console.log "Set all users as active"
\ No newline at end of file
+			RocketChat.models.Users.setAllUsersActive true
+			console.log "Set all users as active"
diff --git a/server/startup/migrations/v2.coffee b/server/startup/migrations/v2.coffee
index 05b81ba3d2e..baf7777b185 100644
--- a/server/startup/migrations/v2.coffee
+++ b/server/startup/migrations/v2.coffee
@@ -20,6 +20,6 @@ Meteor.startup ->
 				rs = RocketChatFile.bufferToStream new Buffer(image, 'base64')
 				ws = RocketChatFileAvatarInstance.createWriteStream "#{user.username}.jpg", contentType
 				ws.on 'end', Meteor.bindEnvironment ->
-					Meteor.users.update {_id: user._id}, {$set: {avatarOrigin: service}}
+					RocketChat.models.Users.setAvatarOrigin user._id, service
 
 				rs.pipe(ws)
diff --git a/server/startup/migrations/v5.coffee b/server/startup/migrations/v5.coffee
index d1d2218adb9..12cd247c20f 100644
--- a/server/startup/migrations/v5.coffee
+++ b/server/startup/migrations/v5.coffee
@@ -29,7 +29,7 @@ Meteor.startup ->
 						if RocketChat.models.Users.findOneByUsername(newUserName)
 							newUserName = newUserName + Math.floor((Math.random() * 10) + 1);
 				console.log 'Adding: username ' + newUserName + ' to all user ' + user._id;
-				Meteor.users.update({'_id':user._id},{'$set':{'username':newUserName}});
+				RocketChat.models.Users.setUsername user._id, newUserName
 
 
 			console.log 'Fixing _id of direct messages rooms'
-- 
GitLab