text: RocketChat.Migrations.add({
  	version: 15,
  	up() {
  		console.log('Starting file migration');
  		const oldFilesCollection = new Mongo.Collection('cfs.Files.filerecord');
  		const oldGridFSCollection = new Mongo.Collection('cfs_gridfs.files.files');
  		const oldChunkCollection = new Mongo.Collection('cfs_gridfs.files.chunks');
  		const newFilesCollection = RocketChat.models.Uploads;
  		const newGridFSCollection = new Mongo.Collection('rocketchat_uploads.files');
  		const newChunkCollection = new Mongo.Collection('rocketchat_uploads.chunks');
  
  		oldFilesCollection.find({
  			'copies.files.key': {
  				$exists: true
  			}
  		}).forEach((cfsRecord) => {
  			const nameParts = cfsRecord.original.name && cfsRecord.original.name.split('.');
  			let extension = '';
  			let url = `ufs/rocketchat_uploads/${ cfsRecord._id }`;
  
  			console.log('migrating file', url);
  
  			if (nameParts && nameParts.length > 1) {
  				extension = nameParts.pop();
  				url = `${ url }.${ extension }`;
  			}
  
  			const record = {
  				_id: cfsRecord._id,
  				name: cfsRecord.original.name || '',
  				size: cfsRecord.original.size,
  				type: cfsRecord.original.type,
  				complete: true,
  				uploading: false,
  				store: 'rocketchat_uploads',
  				extension,
  				userId: cfsRecord.userId,
  				uploadedAt: cfsRecord.updatedAt,
  				url: Meteor.absoluteUrl() + url
  			};
  
  			newFilesCollection.insert(record);
  
  			const oldGridFsFile = oldGridFSCollection.findOne({
  				_id: new Mongo.Collection.ObjectID(cfsRecord.copies.files.key)
  			});
  
  			newGridFSCollection.insert({
  				_id: cfsRecord._id,
  				filename: cfsRecord._id,
  				contentType: oldGridFsFile.contentType,
  				length: oldGridFsFile.length,
  				chunkSize: oldGridFsFile.chunkSize,
  				uploadDate: oldGridFsFile.uploadDate,
  				aliases: null,
  				metadata: null,
  				md5: oldGridFsFile.md5
  			});
  
  			oldChunkCollection.find({
  				files_id: new Mongo.Collection.ObjectID(cfsRecord.copies.files.key)
  			}).forEach((oldChunk) => {
  				newChunkCollection.insert({
  					_id: oldChunk._id,
  					files_id: cfsRecord._id,
  					n: oldChunk.n,
  					data: oldChunk.data
  				});
  			});
  
  			RocketChat.models.Messages.find({
  				$or: [{
  					'urls.url': `https://demo.rocket.chat/cfs/files/Files/${ cfsRecord._id }`
  				}, {
  					'urls.url': `https://rocket.chat/cfs/files/Files/${ cfsRecord._id }`
  				}]
  			}).forEach((message) => {
  				for (const urlsItem of message.urls) {
  					if (urlsItem.url === (`https://demo.rocket.chat/cfs/files/Files/${ cfsRecord._id }`) || urlsItem.url === (`https://rocket.chat/cfs/files/Files/${ cfsRecord._id }`)) {
  						urlsItem.url = Meteor.absoluteUrl() + url;
  						if (urlsItem.parsedUrl && urlsItem.parsedUrl.pathname) {
  							urlsItem.parsedUrl.pathname = `/${ url }`;
  						}
  						message.msg = message.msg.replace(`https://demo.rocket.chat/cfs/files/Files/${ cfsRecord._id }`, Meteor.absoluteUrl() + url);
  						message.msg = message.msg.replace(`https://rocket.chat/cfs/files/Files/${ cfsRecord._id }`, Meteor.absoluteUrl() + url);
  					}
  				}
  
  				RocketChat.models.Messages.update({_id: message._id}, {
  					$set: {
  						urls: message.urls,
  						msg: message.msg
  					}
  				});
  			});
  
  			oldFilesCollection.remove({_id: cfsRecord._id});
  			oldGridFSCollection.remove({_id: oldGridFsFile._id});
  			oldChunkCollection.remove({files_id: new Mongo.Collection.ObjectID(cfsRecord.copies.files.key)});
  		});
  
  		return console.log('End of file migration');
  	}
  });
  