Use new collection for avatars only

pull/6788/head
Diego Sampaio 9 years ago
parent 4785fd479a
commit b7fc7b68da
  1. 10
      lib/fileUpload.js
  2. 11
      packages/rocketchat-file-upload/client/lib/FileUploadAmazonS3.js
  3. 11
      packages/rocketchat-file-upload/client/lib/FileUploadGoogleStorage.js
  4. 3
      packages/rocketchat-file-upload/server/config/configFileUploadAmazonS3.js
  5. 3
      packages/rocketchat-file-upload/server/config/configFileUploadGoogleStorage.js
  6. 6
      packages/rocketchat-lib/client/models/Avatars.js
  7. 2
      packages/rocketchat-lib/package.js
  8. 105
      packages/rocketchat-lib/server/models/Avatars.js
  9. 51
      packages/rocketchat-lib/server/models/Uploads.coffee
  10. 9
      server/methods/setAvatarFromService.js
  11. 2
      server/startup/avatar.js

@ -74,9 +74,9 @@ if (UploadFS) {
});
Meteor.fileStoreAvatar = new UploadFS.store.GridFS({
collection: RocketChat.models.Uploads.model,
collection: RocketChat.models.Avatars.model,
name: 'rocketchat_uploads_avatar',
collectionName: 'rocketchat_uploads',
collectionName: 'rocketchat_avatars',
// filter: new UploadFS.Filter({
// onCheck: FileUpload.validateFileUpload
// }),
@ -110,12 +110,12 @@ if (UploadFS) {
onFinishUpload(file) {
// update file record to match user's username
const user = RocketChat.models.Users.findOneById(file.userId);
const oldAvatar = RocketChat.models.Uploads.findOneByName(`${ user.username }.avatar`);
const oldAvatar = RocketChat.models.Avatars.findOneByName(`${ user.username }.avatar`);
if (oldAvatar) {
Meteor.fileStoreAvatar.delete(oldAvatar._id);
RocketChat.models.Uploads.deleteFile(oldAvatar._id);
RocketChat.models.Avatars.deleteFile(oldAvatar._id);
}
RocketChat.models.Uploads.updateFileNameById(file._id, `${ user.username }.avatar`);
RocketChat.models.Avatars.updateFileNameById(file._id, `${ user.username }.avatar`);
// console.log('upload finished ->', file);
},

@ -3,7 +3,12 @@
FileUpload.AmazonS3 = class FileUploadAmazonS3 extends FileUploadBase {
constructor(directive, meta, file) {
super(meta, file);
this.uploader = new Slingshot.Upload(directive, meta);
this.directive = directive;
const directives = {
'upload': 'rocketchat-uploads',
'avatar': 'rocketchat-avatars'
};
this.uploader = new Slingshot.Upload(directives[directive], meta);
}
start(callback) {
@ -19,6 +24,10 @@ FileUpload.AmazonS3 = class FileUploadAmazonS3 extends FileUploadBase {
file._id = downloadUrl.substr(downloadUrl.lastIndexOf('/') + 1);
file.url = downloadUrl;
if (this.directive === 'avatar') {
return callback(null, file);
}
Meteor.call('sendFileMessage', this.meta.rid, 's3', file, () => {
Meteor.setTimeout(() => {
callback.call(this, null, file);

@ -3,7 +3,12 @@
FileUpload.GoogleCloudStorage = class FileUploadGoogleCloudStorage extends FileUploadBase {
constructor(directive, meta, file) {
super(meta, file);
this.uploader = new Slingshot.Upload(directive, { rid: meta.rid });
this.directive = directive;
const directives = {
'upload': 'rocketchat-uploads-gs',
'avatar': 'rocketchat-avatars-gs'
};
this.uploader = new Slingshot.Upload(directives[directive], { rid: meta.rid });
}
start(callback) {
@ -19,6 +24,10 @@ FileUpload.GoogleCloudStorage = class FileUploadGoogleCloudStorage extends FileU
file._id = downloadUrl.substr(downloadUrl.lastIndexOf('/') + 1);
file.url = downloadUrl;
if (this.directive === 'avatar') {
return callback(null, file);
}
Meteor.call('sendFileMessage', this.meta.rid, 'googleCloudStorage', file, () => {
Meteor.setTimeout(() => {
callback.call(this, null, file);

@ -105,7 +105,8 @@ const configureSlingshot = _.debounce(() => {
path
}
};
RocketChat.models.Uploads.insertAvatarFileInit(user.username, this.userId, 's3', file, upload);
delete file.name;
RocketChat.models.Avatars.insertAvatarFileInit(user.username, this.userId, 's3', file, upload);
return path + user.username;
}

@ -121,7 +121,8 @@ const createGoogleStorageDirective = _.debounce(() => {
path
}
};
RocketChat.models.Uploads.insertAvatarFileInit(user.username, this.userId, 'googleCloudStorage', file, upload);
delete file.name;
RocketChat.models.Avatars.insertAvatarFileInit(user.username, this.userId, 'googleCloudStorage', file, upload);
return path + user.username;
}

@ -0,0 +1,6 @@
RocketChat.models.Avatars = new class extends RocketChat.models._Base {
constructor() {
super();
this._initModel('avatars');
}
};

@ -104,6 +104,7 @@ Package.onUse(function(api) {
// SERVER MODELS
api.addFiles('server/models/_Base.js', 'server');
api.addFiles('server/models/Avatars.js', 'server');
api.addFiles('server/models/Messages.coffee', 'server');
api.addFiles('server/models/Reports.js', 'server');
api.addFiles('server/models/Rooms.coffee', 'server');
@ -195,6 +196,7 @@ Package.onUse(function(api) {
// CLIENT MODELS
api.addFiles('client/models/_Base.coffee', 'client');
api.addFiles('client/models/Avatars.js', 'client');
api.addFiles('client/models/Uploads.coffee', 'client');
// CLIENT VIEWS

@ -0,0 +1,105 @@
RocketChat.models.Avatars = new class extends RocketChat.models._Base {
constructor() {
super('avatars');
this.tryEnsureIndex({ name: 1 });
}
insertAvatarFileInit(name, userId, store, file, extra) {
const fileData = {
_id: name,
name,
userId,
store,
complete: false,
uploading: true,
progress: 0,
extension: s.strRightBack(file.name, '.'),
uploadedAt: new Date()
};
_.extend(fileData, file, extra);
return this.insertOrUpsert(fileData);
}
updateFileComplete(fileId, userId, file) {
if (!fileId) {
return;
}
const filter = {
_id: fileId,
userId
};
const update = {
$set: {
complete: true,
uploading: false,
progress: 1
}
};
update.$set = _.extend(file, update.$set);
if (this.model.direct && this.model.direct.update) {
return this.model.direct.update(filter, update);
} else {
return this.update(filter, update);
}
}
findOneByName(name) {
return this.findOne({ name });
}
updateFileNameById(fileId, name) {
const filter = { _id: fileId };
const update = {
$set: {
name
}
};
if (this.model.direct && this.model.direct.update) {
return this.model.direct.update(filter, update);
} else {
return this.update(filter, update);
}
}
// @TODO deprecated
updateFileCompleteByNameAndUserId(name, userId, url) {
if (!name) {
return;
}
const filter = {
name,
userId
};
const update = {
$set: {
complete: true,
uploading: false,
progress: 1,
url
}
};
if (this.model.direct && this.model.direct.update) {
return this.model.direct.update(filter, update);
} else {
return this.update(filter, update);
}
}
deleteFile(fileId) {
if (this.model.direct && this.model.direct.remove) {
return this.model.direct.remove({ _id: fileId });
} else {
return this.remove({ _id: fileId });
}
}
};

@ -48,23 +48,6 @@ RocketChat.models.Uploads = new class extends RocketChat.models._Base
return file
insertAvatarFileInit: (name, userId, store, file, extra) ->
fileData =
name: "#{name}.avatar"
userId: userId
store: store
complete: false
uploading: true
progress: 0
extension: s.strRightBack(file.name, '.')
uploadedAt: new Date()
_.extend(fileData, file, extra);
file = @insertOrUpsert fileData
return file
updateFileComplete: (fileId, userId, file) ->
if not fileId
return
@ -88,42 +71,8 @@ RocketChat.models.Uploads = new class extends RocketChat.models._Base
return result
# @TODO deprecated
updateFileCompleteByNameAndUserId: (name, userId, url) ->
if not name
return
filter =
name: name
userId: userId
update =
$set:
complete: true
uploading: false
progress: 1
url: url
if @model.direct?.update?
result = @model.direct.update filter, update
else
result = @update filter, update
return result
findOneByName: (name) ->
return @findOne name: name
deleteFile: (fileId) ->
if @model.direct?.remove?
return @model.direct.remove { _id: fileId }
else
return @remove { _id: fileId }
updateFileNameById: (fileId, name) ->
filter = _id: fileId
update = $set: name: name
if @model.direct?.update?
return @model.direct.update filter, update
else
return @update filter, update

@ -39,7 +39,11 @@ Meteor.methods({
}
const user = RocketChat.models.Users.findOneById(Meteor.userId());
const fileSaved = RocketChat.models.Uploads.findOneById(file._id);
const fileSaved = RocketChat.models.Avatars.findOneById(file._id);
if (!fileSaved) {
return;
}
if (fileSaved.userId !== user._id) {
// this file is not user's avatar
@ -51,7 +55,8 @@ Meteor.methods({
return true;
}
RocketChat.models.Uploads.updateFileCompleteByNameAndUserId(`${ user.username }.avatar`, Meteor.userId(), file.url);
RocketChat.models.Avatars.updateFileCompleteByNameAndUserId(user.username, user._id, file.url);
return true;
}
});

@ -62,7 +62,7 @@ Meteor.startup(function() {
return;
}
}
file = RocketChat.models.Uploads.findOneByName(`${ username }.avatar`);
file = RocketChat.models.Avatars.findOneByName(username);
}
if (file) {

Loading…
Cancel
Save