@ -9,9 +9,9 @@ import { IImportChannel } from '../../../../definition/IImportChannel';
import { IConversionCallbacks } from '../definitions/IConversionCallbacks' ;
import { IImportUserRecord , IImportChannelRecord , IImportMessageRecord } from '../../../../definition/IImportRecord' ;
import { Users , Rooms , Subscriptions , ImportData } from '../../../models/server' ;
import { generateUsernameSuggestion , insertMessage } from '../../../lib/server' ;
import { generateUsernameSuggestion , insertMessage , saveUserIdentity , addUserToDefaultChannels } from '../../../lib/server' ;
import { setUserActiveStatus } from '../../../lib/server/functions/setUserActiveStatus' ;
import { IUser } from '../../../../definition/IUser' ;
import { IUser , IUserEmail } from '../../../../definition/IUser' ;
import type { Logger } from '../../../../server/lib/logger/Logger' ;
type IRoom = Record < string , any > ;
@ -148,6 +148,26 @@ export class ImportDataConverter {
}
}
addUserEmails ( updateData : Record < string , any > , userData : IImportUser , existingEmails : Array < IUserEmail > ) : void {
if ( ! userData . emails ? . length ) {
return ;
}
const verifyEmails = Boolean ( this . options . flagEmailsAsVerified ) ;
const newEmailList : Array < IUserEmail > = [ ] ;
for ( const email of userData . emails ) {
const verified = verifyEmails || existingEmails . find ( ( ee ) = > ee . address === email ) ? . verified || false ;
newEmailList . push ( {
address : email ,
verified ,
} ) ;
}
updateData . $set . emails = newEmailList ;
}
addUserServices ( updateData : Record < string , any > , userData : IImportUser ) : void {
if ( ! userData . services ) {
return ;
@ -170,14 +190,6 @@ export class ImportDataConverter {
}
}
flagEmailsAsVerified ( updateData : Record < string , any > , userData : IImportUser ) : void {
if ( ! this . options . flagEmailsAsVerified || ! userData . emails . length ) {
return ;
}
updateData . $set [ 'emails.$[].verified' ] = true ;
}
addCustomFields ( updateData : Record < string , any > , userData : IImportUser ) : void {
if ( ! userData . customFields ) {
return ;
@ -202,7 +214,11 @@ export class ImportDataConverter {
subset ( userData . customFields , 'customFields' ) ;
}
updateUserId ( _id : string , userData : IImportUser ) : void {
updateUser ( existingUser : IUser , userData : IImportUser ) : void {
const { _id } = existingUser ;
userData . _id = _id ;
// #ToDo: #TODO: Move this to the model class
const updateData : Record < string , any > = {
$set : {
@ -210,35 +226,28 @@ export class ImportDataConverter {
type : userData . type || 'user' ,
. . . userData . statusText && { statusText : userData.statusText } ,
. . . userData . bio && { bio : userData.bio } ,
. . . userData . name && { name : userData.name } ,
. . . userData . services ? . ldap && { ldap : true } ,
. . . userData . avatarUrl && { _pendingAvatarUrl : userData.avatarUrl } ,
} ,
} ;
this . addCustomFields ( updateData , userData ) ;
this . addUserServices ( updateData , userData ) ;
this . addUserImportId ( updateData , userData ) ;
this . flagEmailsAsVerified ( updateData , userData ) ;
this . addUserEmails ( updateData , userData , existingUser . emails || [ ] ) ;
Users . update ( { _id } , updateData ) ;
}
updateUser ( existingUser : IUser , userData : IImportUser ) : void {
userData . _id = existingUser . _id ;
if ( userData . utcOffset ) {
Users . setUtcOffset ( _id , userData . utcOffset ) ;
}
this . updateUserId ( userData . _id , userData ) ;
if ( userData . name || userData . username ) {
saveUserIdentity ( { _id , name : userData.name , username : userData.username } ) ;
}
if ( userData . importIds . length ) {
this . addUserToCache ( userData . importIds [ 0 ] , existingUser . _id , existingUser . username ) ;
}
if ( userData . avatarUrl ) {
try {
Users . update ( { _id : existingUser._id } , { $set : { _pendingAvatarUrl : userData.avatarUrl } } ) ;
} catch ( error ) {
this . _logger . warn ( ` Failed to set ${ existingUser . _id } 's avatar from url ${ userData . avatarUrl } ` ) ;
this . _logger . error ( error ) ;
}
}
}
insertUser ( userData : IImportUser ) : IUser {
@ -253,35 +262,10 @@ export class ImportDataConverter {
joinDefaultChannelsSilenced : true ,
} ) ;
userData . _id = userId ;
const user = Users . findOneById ( userId , { } ) ;
this . updateUser ( user , userData ) ;
if ( user && userData . importIds . length ) {
this . addUserToCache ( userData . importIds [ 0 ] , user . _id , userData . username ) ;
}
Meteor . runAsUser ( userId , ( ) = > {
Meteor . call ( 'setUsername' , userData . username , { joinDefaultChannelsSilenced : true } ) ;
if ( userData . name ) {
Users . setName ( userId , userData . name ) ;
}
this . updateUserId ( userId , userData ) ;
if ( userData . utcOffset ) {
Users . setUtcOffset ( userId , userData . utcOffset ) ;
}
if ( userData . avatarUrl ) {
try {
Users . update ( { _id : userId } , { $set : { _pendingAvatarUrl : userData.avatarUrl } } ) ;
} catch ( error ) {
this . _logger . warn ( ` Failed to set ${ userId } 's avatar from url ${ userData . avatarUrl } ` ) ;
this . _logger . error ( error ) ;
}
}
} ) ;
addUserToDefaultChannels ( user , true ) ;
return user ;
}