diff --git a/app/api/server/lib/users.js b/app/api/server/lib/users.js
index 82194832ceb..4d7226a608d 100644
--- a/app/api/server/lib/users.js
+++ b/app/api/server/lib/users.js
@@ -14,6 +14,7 @@ export async function findUsersToAutocomplete({ uid, selector }) {
name: 1,
username: 1,
status: 1,
+ avatarETag: 1,
},
sort: {
username: 1,
diff --git a/app/api/server/v1/users.js b/app/api/server/v1/users.js
index c252b743e84..4eebd8bc7bb 100644
--- a/app/api/server/v1/users.js
+++ b/app/api/server/v1/users.js
@@ -716,6 +716,7 @@ API.v1.addRoute('users.presence', { authRequired: true }, {
status: 1,
utcOffset: 1,
statusText: 1,
+ avatarETag: 1,
},
};
diff --git a/app/lazy-load/client/index.js b/app/lazy-load/client/index.js
index 61a0ece9c73..7bb31b6e897 100644
--- a/app/lazy-load/client/index.js
+++ b/app/lazy-load/client/index.js
@@ -9,14 +9,16 @@ const loadImage = (el) => {
map.delete(el);
if (!instance) {
- return instance.loaded.set(true);
+ return;
}
+
const img = new Image();
const src = el.getAttribute('data-src');
img.onload = () => {
el.className = el.className.replace('lazy-img', '');
el.src = src;
el.removeAttribute('data-src');
+ instance.loaded.set(true);
};
img.src = src;
};
diff --git a/app/lazy-load/client/lazyloadImage.js b/app/lazy-load/client/lazyloadImage.js
index c711f73ebb9..9d2151498b0 100644
--- a/app/lazy-load/client/lazyloadImage.js
+++ b/app/lazy-load/client/lazyloadImage.js
@@ -4,7 +4,7 @@ import { Template } from 'meteor/templating';
import './lazyloadImage.html';
import { addImage } from '.';
-const emptyImageEncoded = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8+/u3PQAJJAM0dIyWdgAAAABJRU5ErkJggg==';
+const emptyImageEncoded = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8+/u3PQAJJAM0dIyWdgAAAABJRU5ErkJggg==';
const imgsrcs = new Set();
@@ -15,12 +15,17 @@ Template.lazyloadImage.helpers({
},
srcUrl() {
+ if (Template.instance().loaded.get()) {
+ return;
+ }
return this.src;
},
lazySrcUrl() {
const { preview, placeholder, src } = this;
- if (Template.instance().loaded.get() || (!preview && !placeholder) || imgsrcs.has(src)) {
+ const { loaded } = Template.instance();
+
+ if (loaded.get() || (!preview && !placeholder) || imgsrcs.has(src)) {
return src;
}
diff --git a/app/ldap/server/sync.js b/app/ldap/server/sync.js
index 5e290d9bb8e..a2e6a24eb9a 100644
--- a/app/ldap/server/sync.js
+++ b/app/ldap/server/sync.js
@@ -409,10 +409,10 @@ export function syncUserData(user, ldapUser, ldap) {
};
Meteor.runAsUser(user._id, () => {
- fileStore.insert(file, rs, () => {
+ fileStore.insert(file, rs, (err, result) => {
Meteor.setTimeout(function() {
- Users.setAvatarOrigin(user._id, 'ldap');
- Notifications.notifyLogged('updateAvatar', { username: user.username });
+ Users.setAvatarData(user._id, 'ldap', result.etag);
+ Notifications.notifyLogged('updateAvatar', { username: user.username, etag: result.etag });
}, 500);
});
});
diff --git a/app/lib/lib/roomTypes/direct.js b/app/lib/lib/roomTypes/direct.js
index a8b7bc73d18..e54022b5f2e 100644
--- a/app/lib/lib/roomTypes/direct.js
+++ b/app/lib/lib/roomTypes/direct.js
@@ -190,6 +190,11 @@ export class DirectMessageRoomType extends RoomTypeConfig {
return '';
}
+ // if coming from sidenav search
+ if (roomData.name && roomData.avatarETag) {
+ return getUserAvatarURL(roomData.name, roomData.avatarETag);
+ }
+
if (this.isGroupChat(roomData)) {
return getAvatarURL({ username: roomData.uids.length + roomData.usernames.join() });
}
@@ -197,7 +202,8 @@ export class DirectMessageRoomType extends RoomTypeConfig {
const sub = subData || Subscriptions.findOne({ rid: roomData._id }, { fields: { name: 1 } });
if (sub && sub.name) {
- return getUserAvatarURL(sub.name);
+ const user = Meteor.users.findOne({ username: sub.name }, { fields: { username: 1, avatarETag: 1 } });
+ return getUserAvatarURL(user?.username || sub.name, user?.avatarETag);
}
if (roomData) {
diff --git a/app/lib/lib/roomTypes/public.js b/app/lib/lib/roomTypes/public.js
index 70b2dc3fd41..e7b935805ce 100644
--- a/app/lib/lib/roomTypes/public.js
+++ b/app/lib/lib/roomTypes/public.js
@@ -4,7 +4,7 @@ import { openRoom } from '../../../ui-utils';
import { ChatRoom, ChatSubscription } from '../../../models';
import { settings } from '../../../settings';
import { hasAtLeastOnePermission } from '../../../authorization';
-import { getUserPreference, RoomTypeConfig, RoomTypeRouteConfig, RoomSettingsEnum, UiTextContext, RoomMemberActions } from '../../../utils';
+import { getUserPreference, RoomTypeConfig, RoomTypeRouteConfig, RoomSettingsEnum, UiTextContext, RoomMemberActions, roomTypes } from '../../../utils';
import { getAvatarURL } from '../../../utils/lib/getAvatarURL';
export class PublicRoomRoute extends RoomTypeRouteConfig {
@@ -136,6 +136,17 @@ export class PublicRoomType extends RoomTypeConfig {
getAvatarPath(roomData) {
// TODO: change to always get avatar from _id when rooms have avatars
+ // if room is not a discussion, returns the avatar for its name
+ if (!roomData.prid) {
+ return getAvatarURL({ username: `@${ this.roomName(roomData) }` });
+ }
+
+ // if discussion's parent room is known, get his avatar
+ const proom = ChatRoom.findOne({ _id: roomData.prid }, { reactive: false });
+ if (proom) {
+ return roomTypes.getConfig(proom.t).getAvatarPath(proom);
+ }
+
return getAvatarURL({ username: `@${ this.roomName(roomData) }` });
}
diff --git a/app/lib/server/functions/getFullUserData.js b/app/lib/server/functions/getFullUserData.js
index cb75e4fa37e..571977614f5 100644
--- a/app/lib/server/functions/getFullUserData.js
+++ b/app/lib/server/functions/getFullUserData.js
@@ -16,6 +16,7 @@ const defaultFields = {
active: 1,
reason: 1,
statusText: 1,
+ avatarETag: 1,
};
const fullFields = {
diff --git a/app/lib/server/functions/setUserAvatar.js b/app/lib/server/functions/setUserAvatar.js
index 9cab632e239..ae6c54fe1ef 100644
--- a/app/lib/server/functions/setUserAvatar.js
+++ b/app/lib/server/functions/setUserAvatar.js
@@ -11,7 +11,7 @@ export const setUserAvatar = function(user, dataURI, contentType, service) {
let image;
if (service === 'initials') {
- return Users.setAvatarOrigin(user._id, service);
+ return Users.setAvatarData(user._id, service, null);
} if (service === 'url') {
let result = null;
@@ -61,10 +61,10 @@ export const setUserAvatar = function(user, dataURI, contentType, service) {
size: buffer.length,
};
- fileStore.insert(file, buffer, () => {
+ fileStore.insert(file, buffer, (err, result) => {
Meteor.setTimeout(function() {
- Users.setAvatarOrigin(user._id, service);
- Notifications.notifyLogged('updateAvatar', { username: user.username });
+ Users.setAvatarData(user._id, service, result.etag);
+ Notifications.notifyLogged('updateAvatar', { username: user.username, etag: result.etag });
}, 500);
});
};
diff --git a/app/models/server/models/Users.js b/app/models/server/models/Users.js
index d5ef36e75ef..6594098a0c3 100644
--- a/app/models/server/models/Users.js
+++ b/app/models/server/models/Users.js
@@ -1002,20 +1002,22 @@ export class Users extends Base {
return this.update(_id, update);
}
- setAvatarOrigin(_id, origin) {
+ setAvatarData(_id, origin, etag) {
const update = {
$set: {
avatarOrigin: origin,
+ avatarETag: etag,
},
};
return this.update(_id, update);
}
- unsetAvatarOrigin(_id) {
+ unsetAvatarData(_id) {
const update = {
$unset: {
avatarOrigin: 1,
+ avatarETag: 1,
},
};
diff --git a/app/ui-account/client/avatar/avatar.js b/app/ui-account/client/avatar/avatar.js
index 6ea8531bde2..2035df824ff 100644
--- a/app/ui-account/client/avatar/avatar.js
+++ b/app/ui-account/client/avatar/avatar.js
@@ -1,18 +1,24 @@
import { Meteor } from 'meteor/meteor';
-import { Session } from 'meteor/session';
import { Template } from 'meteor/templating';
import { getUserAvatarURL } from '../../../utils/lib/getUserAvatarURL';
const getUsername = ({ userId, username }) => {
+ const query = {};
if (username) {
- return username;
+ query.username = username;
}
if (userId) {
- const user = Meteor.users.findOne(userId, { fields: { username: 1 } });
- return user && user.username;
+ query._id = userId;
+ }
+
+ const user = Meteor.users.findOne(query, { fields: { username: 1, avatarETag: 1 } });
+ if (!user) {
+ return {};
}
+
+ return user;
};
Template.avatar.helpers({
@@ -22,21 +28,23 @@ Template.avatar.helpers({
return url;
}
- let username = getUsername(this);
- if (!username) {
- return;
+ if (this.roomIcon && this.username) {
+ return getUserAvatarURL(`@${ this.username }`);
}
- Session.get(`avatar_random_${ username }`);
-
- if (this.roomIcon) {
- username = `@${ username }`;
+ const { username, avatarETag } = getUsername(this);
+ if (!username) {
+ if (this.username) {
+ return getUserAvatarURL(this.username);
+ }
+ return;
}
- return getUserAvatarURL(username);
+ return getUserAvatarURL(username, avatarETag);
},
alt() {
- return getUsername(this);
+ const { username } = getUsername(this);
+ return username;
},
});
diff --git a/app/ui-flextab/client/tabs/membersList.html b/app/ui-flextab/client/tabs/membersList.html
index 69c75e11214..9eead962def 100644
--- a/app/ui-flextab/client/tabs/membersList.html
+++ b/app/ui-flextab/client/tabs/membersList.html
@@ -34,7 +34,7 @@
{{#each users}}
-
- {{> avatar username=user.username}}
+ {{> avatar url=avatarUrl}}
{{# userPresence uid=user._id}}
{{/userPresence}}
{{ignored}} {{displayName}} {{utcOffset}}
diff --git a/app/ui-flextab/client/tabs/membersList.js b/app/ui-flextab/client/tabs/membersList.js
index bd1797578ab..54d8bf1a297 100644
--- a/app/ui-flextab/client/tabs/membersList.js
+++ b/app/ui-flextab/client/tabs/membersList.js
@@ -4,12 +4,12 @@ import { Session } from 'meteor/session';
import { Template } from 'meteor/templating';
import { getActions } from './userActions';
-import { RoomManager, popover } from '../../../ui-utils';
-import { ChatRoom, Subscriptions } from '../../../models';
-import { settings } from '../../../settings';
-import { t, isRtl, handleError, roomTypes } from '../../../utils';
+import { RoomManager, popover } from '../../../ui-utils/client';
+import { ChatRoom, Subscriptions } from '../../../models/client';
+import { settings } from '../../../settings/client';
+import { t, isRtl, handleError, roomTypes, getUserAvatarURL } from '../../../utils/client';
import { WebRTC } from '../../../webrtc/client';
-import { hasPermission } from '../../../authorization';
+import { hasPermission } from '../../../authorization/client';
Template.membersList.helpers({
ignored() {
@@ -129,6 +129,11 @@ Template.membersList.helpers({
loadingMore() {
return Template.instance().loadingMore.get();
},
+
+ avatarUrl() {
+ const { user: { username, avatarETag } } = this;
+ return getUserAvatarURL(username, avatarETag);
+ },
});
Template.membersList.events({
diff --git a/app/ui-message/client/popup/messagePopupConfig.js b/app/ui-message/client/popup/messagePopupConfig.js
index a99b3e10838..def4a4714ce 100644
--- a/app/ui-message/client/popup/messagePopupConfig.js
+++ b/app/ui-message/client/popup/messagePopupConfig.js
@@ -67,13 +67,14 @@ const fetchUsersFromServer = _.throttle(async (filterText, records, rid, cb) =>
users
.slice(0, 5)
- .forEach(({ username, name, status }) => {
+ .forEach(({ username, name, status, avatarETag }) => {
if (records.length < 5) {
records.push({
_id: username,
username,
name,
status,
+ avatarETag,
sort: 3,
});
}
diff --git a/app/ui-message/client/popup/messagePopupUser.html b/app/ui-message/client/popup/messagePopupUser.html
index c90a04375d3..c620f4553e5 100644
--- a/app/ui-message/client/popup/messagePopupUser.html
+++ b/app/ui-message/client/popup/messagePopupUser.html
@@ -1,7 +1,7 @@
{{#unless system}}
-
+
{{/unless}}
{{username}} {{name}}
diff --git a/app/ui-sidenav/client/toolbar.js b/app/ui-sidenav/client/toolbar.js
index 3c59a62a749..df0995056d9 100644
--- a/app/ui-sidenav/client/toolbar.js
+++ b/app/ui-sidenav/client/toolbar.js
@@ -52,6 +52,7 @@ const getFromServer = (cb, type) => {
t: 'd',
name: user.username,
fname: user.name,
+ avatarETag: user.avatarETag,
});
resultsFromServer.push(...results.users.map(userMap));
diff --git a/app/utils/lib/getAvatarURL.js b/app/utils/lib/getAvatarURL.js
index 6794060a3ce..a6a50930e58 100644
--- a/app/utils/lib/getAvatarURL.js
+++ b/app/utils/lib/getAvatarURL.js
@@ -2,9 +2,9 @@ import { getURL } from './getURL';
export const getAvatarURL = ({ username, roomId, cache }) => {
if (username) {
- return getURL(`/avatar/${ encodeURIComponent(username) }${ cache ? `?_dc=${ cache }` : '' }`);
+ return getURL(`/avatar/${ encodeURIComponent(username) }${ cache ? `?etag=${ cache }` : '' }`);
}
if (roomId) {
- return getURL(`/avatar/room/${ encodeURIComponent(roomId) }${ cache ? `?_dc=${ cache }` : '' }`);
+ return getURL(`/avatar/room/${ encodeURIComponent(roomId) }${ cache ? `?etag=${ cache }` : '' }`);
}
};
diff --git a/app/utils/lib/getUserAvatarURL.js b/app/utils/lib/getUserAvatarURL.js
index 82f0905f571..54a546ba9ec 100644
--- a/app/utils/lib/getUserAvatarURL.js
+++ b/app/utils/lib/getUserAvatarURL.js
@@ -1,10 +1,7 @@
-import { Session } from 'meteor/session';
-import { Tracker } from 'meteor/tracker';
-
import { getAvatarURL } from './getAvatarURL';
import { settings } from '../../settings';
-export const getUserAvatarURL = function(username) {
+export const getUserAvatarURL = function(username, cache = '') {
const externalSource = (settings.get('Accounts_AvatarExternalProviderUrl') || '').trim().replace(/\/$/, '');
if (externalSource !== '') {
return externalSource.replace('{username}', username);
@@ -12,8 +9,6 @@ export const getUserAvatarURL = function(username) {
if (username == null) {
return;
}
- const key = `avatar_random_${ username }`;
- const cache = Tracker.nonreactive(() => Session && Session.get(key)); // there is no Session on server
return getAvatarURL({ username, cache });
};
diff --git a/client/admin/users/UsersTable.js b/client/admin/users/UsersTable.js
index 1b72cdbe4ab..b673bf500c8 100644
--- a/client/admin/users/UsersTable.js
+++ b/client/admin/users/UsersTable.js
@@ -4,7 +4,7 @@ import React, { useMemo, useCallback, useState, useEffect } from 'react';
import { GenericTable, Th } from '../../components/GenericTable';
import { useTranslation } from '../../contexts/TranslationContext';
-import { roomTypes } from '../../../app/utils/client';
+import { getUserAvatarURL } from '../../../app/utils/client';
import { useRoute } from '../../contexts/RouterContext';
import { useEndpointData } from '../../hooks/useEndpointData';
@@ -26,7 +26,7 @@ const FilterByText = ({ setFilter, ...props }) => {
const sortDir = (sortDir) => (sortDir === 'asc' ? 1 : -1);
const useQuery = ({ text, itemsPerPage, current }, [column, direction]) => useMemo(() => ({
- fields: JSON.stringify({ name: 1, username: 1, emails: 1, roles: 1, status: 1 }),
+ fields: JSON.stringify({ name: 1, username: 1, emails: 1, roles: 1, status: 1, avatarETag: 1 }),
query: JSON.stringify({
$or: [
{ 'emails.address': { $regex: text || '', $options: 'i' } },
@@ -78,8 +78,8 @@ export function UsersTable() {
{t('Status')} | ,
].filter(Boolean), [sort, onHeaderClick, t, mediaQuery]);
- const renderRow = useCallback(({ emails, _id, username, name, roles, status, ...args }) => {
- const avatarUrl = roomTypes.getConfig('d').getAvatarPath({ name: username || name, type: 'd', _id, ...args });
+ const renderRow = useCallback(({ emails, _id, username, name, roles, status, avatarETag }) => {
+ const avatarUrl = getUserAvatarURL(username, avatarETag);
return
diff --git a/client/components/RoomForeword.js b/client/components/RoomForeword.js
index dfa9779fd97..ca95f1a569f 100644
--- a/client/components/RoomForeword.js
+++ b/client/components/RoomForeword.js
@@ -1,11 +1,11 @@
import React from 'react';
import { Avatar, Margins, Flex, Box, Tag } from '@rocket.chat/fuselage';
-import { Rooms } from '../../app/models';
+import { Rooms, Users } from '../../app/models/client';
import { useTranslation } from '../contexts/TranslationContext';
import { useReactiveValue } from '../hooks/useReactiveValue';
import { useUser } from '../contexts/UserContext';
-import { roomTypes } from '../../app/utils/client';
+import { getUserAvatarURL } from '../../app/utils/client';
const RoomForeword = ({ _id: rid }) => {
const t = useTranslation();
@@ -17,8 +17,8 @@ const RoomForeword = ({ _id: rid }) => {
return t('Start_of_conversation');
}
- const users = room.usernames.filter((username) => username !== user.username);
- if (users.length < 1) {
+ const usernames = room.usernames.filter((username) => username !== user.username);
+ if (usernames.length < 1) {
return null;
}
@@ -26,9 +26,12 @@ const RoomForeword = ({ _id: rid }) => {
- {users.map(
+ {usernames.map(
(username, index) => {
- const avatarUrl = roomTypes.getConfig('d').getAvatarPath({ name: username, type: 'd' });
+ const user = Users.findOne({ username }, { fields: { avatarETag: 1 } });
+
+ const avatarUrl = getUserAvatarURL(username, user?.avatarETag);
+
return ;
})}
@@ -36,7 +39,7 @@ const RoomForeword = ({ _id: rid }) => {
{t('Direct_message_you_have_joined')}
- {users.map((username, index) =>
+ {usernames.map((username, index) =>
{
- const avatarUrl = roomTypes.getConfig('d').getAvatarPath({ name: name || fname, type: 'd', _id });
+ const renderRow = useCallback((room) => {
+ const { _id, ts, t, name, fname, usersCount, lastMessage, topic } = room;
+ const avatarUrl = roomTypes.getConfig(t).getAvatarPath(room);
return
@@ -87,7 +88,7 @@ function ChannelsTable() {
{fname || name}
- {topic && }
+ {topic && }
diff --git a/client/views/directory/UserTab.js b/client/views/directory/UserTab.js
index 56d6fd6230b..21e54f010d7 100644
--- a/client/views/directory/UserTab.js
+++ b/client/views/directory/UserTab.js
@@ -7,7 +7,7 @@ import { useTranslation } from '../../contexts/TranslationContext';
import { useRoute } from '../../contexts/RouterContext';
import { usePermission } from '../../contexts/AuthorizationContext';
import { useQuery } from './hooks';
-import { roomTypes } from '../../../app/utils/client';
+import { getUserAvatarURL } from '../../../app/utils/client';
import { useEndpointData } from '../../hooks/useEndpointData';
import { useFormatDate } from '../../hooks/useFormatDate';
import NotAuthorizedPage from '../../admin/NotAuthorizedPage';
@@ -72,8 +72,8 @@ function UserTable({
const formatDate = useFormatDate();
- const renderRow = useCallback(({ createdAt, emails, _id, username, name, domain, bio }) => {
- const avatarUrl = roomTypes.getConfig('d').getAvatarPath({ name: username || name, type: 'd', _id });
+ const renderRow = useCallback(({ createdAt, emails, _id, username, name, domain, bio, avatarETag }) => {
+ const avatarUrl = getUserAvatarURL(username, avatarETag);
return
diff --git a/imports/startup/client/listenActiveUsers.js b/imports/startup/client/listenActiveUsers.js
index 105be406a22..0fe9c6c5784 100644
--- a/imports/startup/client/listenActiveUsers.js
+++ b/imports/startup/client/listenActiveUsers.js
@@ -25,6 +25,7 @@ export const saveUser = (user, force = false) => {
// utcOffset: user.utcOffset,
status: user.status,
statusText: user.statusText,
+ ...user.avatarETag && { avatarETag: user.avatarETag },
},
});
}
diff --git a/server/methods/browseChannels.js b/server/methods/browseChannels.js
index ba720a62cbb..49fd2ca9bdb 100644
--- a/server/methods/browseChannels.js
+++ b/server/methods/browseChannels.js
@@ -129,6 +129,7 @@ Meteor.methods({
createdAt: 1,
emails: 1,
federation: 1,
+ avatarETag: 1,
},
};
diff --git a/server/methods/getUsersOfRoom.js b/server/methods/getUsersOfRoom.js
index 43e2a8dca8b..ecf88f588d4 100644
--- a/server/methods/getUsersOfRoom.js
+++ b/server/methods/getUsersOfRoom.js
@@ -26,6 +26,7 @@ function findUsers({ rid, status, skip, limit, filter = '' }) {
'u.name': 1,
'u.username': 1,
'u.status': 1,
+ 'u.avatarETag': 1,
},
},
...status ? [{ $match: { 'u.status': status } }] : [],
@@ -42,6 +43,7 @@ function findUsers({ rid, status, skip, limit, filter = '' }) {
_id: { $arrayElemAt: ['$u._id', 0] },
name: { $arrayElemAt: ['$u.name', 0] },
username: { $arrayElemAt: ['$u.username', 0] },
+ avatarETag: { $arrayElemAt: ['$u.avatarETag', 0] },
},
},
]).toArray();
diff --git a/server/methods/resetAvatar.js b/server/methods/resetAvatar.js
index f60b0aefc43..48a6c3b8e3c 100644
--- a/server/methods/resetAvatar.js
+++ b/server/methods/resetAvatar.js
@@ -42,9 +42,10 @@ Meteor.methods({
}
FileUpload.getStore('Avatars').deleteByName(user.username);
- Users.unsetAvatarOrigin(user._id);
+ Users.unsetAvatarData(user._id);
Notifications.notifyLogged('updateAvatar', {
username: user.username,
+ etag: null,
});
},
});
diff --git a/server/publications/spotlight.js b/server/publications/spotlight.js
index 702ed843d13..24014117f67 100644
--- a/server/publications/spotlight.js
+++ b/server/publications/spotlight.js
@@ -61,6 +61,7 @@ Meteor.methods({
name: 1,
status: 1,
statusText: 1,
+ avatarETag: 1,
},
sort: {},
};
diff --git a/server/startup/initialData.js b/server/startup/initialData.js
index 6974e3aa03e..170b1ac06b6 100644
--- a/server/startup/initialData.js
+++ b/server/startup/initialData.js
@@ -41,7 +41,7 @@ Meteor.startup(function() {
};
Meteor.runAsUser('rocket.cat', () => {
- fileStore.insert(file, rs, () => Users.setAvatarOrigin('rocket.cat', 'local'));
+ fileStore.insert(file, rs, () => Users.setAvatarData('rocket.cat', 'local', null));
});
}
diff --git a/server/startup/migrations/v002.js b/server/startup/migrations/v002.js
index 66c311ee2d7..cf80409dd16 100644
--- a/server/startup/migrations/v002.js
+++ b/server/startup/migrations/v002.js
@@ -38,7 +38,7 @@ Migrations.add({
type: contentType,
};
- fileStore.insert(file, rs, () => Users.setAvatarOrigin(user._id, service));
+ fileStore.insert(file, rs, (err, result) => Users.setAvatarData(user._id, service, result.etag));
});
},
});
diff --git a/tests/end-to-end/api/01-users.js b/tests/end-to-end/api/01-users.js
index 982e8b96654..dba49e4c025 100644
--- a/tests/end-to-end/api/01-users.js
+++ b/tests/end-to-end/api/01-users.js
@@ -375,6 +375,7 @@ describe('[Users]', function() {
expect(res.body).to.have.property('full', true);
expect(res.body).to.have.property('users').to.have.property('0').to.deep.have.all.keys(
'_id',
+ 'avatarETag',
'username',
'name',
'status',
@@ -410,6 +411,7 @@ describe('[Users]', function() {
expect(res.body).to.have.property('full', true);
expect(res.body).to.have.property('users').to.have.property('0').to.deep.have.all.keys(
'_id',
+ 'avatarETag',
'username',
'name',
'status',