Merge pull request #2116 from RocketChat/improvements/remove-files-on-message-deletion

Closes #1367; Add ability to delete files
pull/2120/head
Gabriel Engel 9 years ago
commit bfbd810bc4
  1. 2
      HISTORY.md
  2. 5
      lib/fileUpload.coffee
  3. 3
      packages/rocketchat-lib/client/models/Uploads.coffee
  4. 44
      packages/rocketchat-lib/client/models/_Base.coffee
  5. 7
      packages/rocketchat-lib/package.js
  6. 6
      packages/rocketchat-lib/server/models/Uploads.coffee
  7. 2
      packages/rocketchat-lib/server/models/_Base.coffee
  8. 9
      server/methods/deleteMessage.coffee
  9. 4
      server/publications/roomFiles.coffee
  10. 2
      server/startup/migrations/v15.coffee
  11. 2
      server/startup/migrations/v20.coffee

@ -1,5 +1,7 @@
## NEXT
- Closes #1367; Add ability to delete files
## 0.16.0, 2016-Feb-01
- Added option for admins to manually add new users

@ -1,6 +1,5 @@
if UploadFS?
@fileCollection = new Mongo.Collection 'rocketchat_uploads'
fileCollection.allow
RocketChat.models.Uploads.model.allow
insert: (userId, doc) ->
return userId
@ -38,7 +37,7 @@ if UploadFS?
cookie.send()
Meteor.fileStore = new UploadFS.store.GridFS
collection: fileCollection
collection: RocketChat.models.Uploads.model
name: 'rocketchat_uploads'
collectionName: 'rocketchat_uploads'
filter: new UploadFS.Filter

@ -0,0 +1,3 @@
RocketChat.models.Uploads = new class extends RocketChat.models._Base
constructor: ->
@_initModel 'uploads'

@ -0,0 +1,44 @@
RocketChat.models._Base = class
_baseName: ->
return 'rocketchat_'
_initModel: (name) ->
check name, String
@model = new Mongo.Collection @_baseName() + name
find: ->
return @model.find.apply @model, arguments
findOne: ->
return @model.findOne.apply @model, arguments
insert: ->
return @model.insert.apply @model, arguments
update: ->
return @model.update.apply @model, arguments
upsert: ->
return @model.upsert.apply @model, arguments
remove: ->
return @model.remove.apply @model, arguments
allow: ->
return @model.allow.apply @model, arguments
deny: ->
return @model.deny.apply @model, arguments
ensureIndex: ->
return
dropIndex: ->
return
tryEnsureIndex: ->
return
tryDropIndex: ->
return

@ -17,8 +17,10 @@ Package.onUse(function(api) {
api.use('tracker');
api.use('ddp-rate-limiter');
api.use('underscore');
api.use('mongo');
api.use('underscorestring:underscore.string');
api.use('monbro:mongodb-mapreduce-aggregation@1.0.1');
api.use('matb33:collection-hooks');
api.use('service-configuration');
api.use('check');
api.use('arunoda:streams');
@ -48,6 +50,7 @@ Package.onUse(function(api) {
api.addFiles('server/models/Rooms.coffee', 'server');
api.addFiles('server/models/Settings.coffee', 'server');
api.addFiles('server/models/Subscriptions.coffee', 'server');
api.addFiles('server/models/Uploads.coffee', 'server');
api.addFiles('server/models/Users.coffee', 'server');
// SERVER PUBLICATIONS
@ -104,6 +107,10 @@ Package.onUse(function(api) {
api.addFiles('client/defaultTabBars.js', 'client');
// CLIENT MODELS
api.addFiles('client/models/_Base.coffee', 'client');
api.addFiles('client/models/Uploads.coffee', 'client');
// VERSION
api.addFiles('rocketchat.info');

@ -0,0 +1,6 @@
RocketChat.models.Uploads = new class extends RocketChat.models._Base
constructor: ->
@_initModel 'uploads'
@tryEnsureIndex { 'rid': 1 }
@tryEnsureIndex { 'uploadedAt': 1 }

@ -5,7 +5,7 @@ RocketChat.models._Base = class
_initModel: (name) ->
check name, String
@model = new Meteor.Collection @_baseName() + name
@model = new Mongo.Collection @_baseName() + name
find: ->
return @model.find.apply @model, arguments

@ -3,7 +3,7 @@ Meteor.methods
if not Meteor.userId()
throw new Meteor.Error('invalid-user', "[methods] deleteMessage -> Invalid user")
originalMessage = RocketChat.models.Messages.findOneById message._id, {fields: {u: 1, rid: 1}}
originalMessage = RocketChat.models.Messages.findOneById message._id, {fields: {u: 1, rid: 1, file: 1}}
if not originalMessage?
throw new Meteor.Error 'message-deleting-not-allowed', "[methods] deleteMessage -> Message with id [#{message._id} dos not exists]"
@ -24,10 +24,17 @@ Meteor.methods
else
RocketChat.models.Messages.setHiddenById originalMessage._id, true
if originalMessage.file?._id?
RocketChat.models.Uploads.update originalMessage.file._id, {$set: {_hidden: true}}
else
if not showDeletedStatus
RocketChat.models.Messages.removeById originalMessage._id
if originalMessage.file?._id?
RocketChat.models.Uploads.remove originalMessage.file._id
Meteor.fileStore.delete originalMessage.file._id
if showDeletedStatus
RocketChat.models.Messages.setAsDeletedById originalMessage._id
else

@ -8,6 +8,8 @@ Meteor.publish 'roomFiles', (rid, limit = 50) ->
rid: rid
complete: true
uploading: false
_hidden:
$ne: true
fileOptions =
limit: limit
@ -20,7 +22,7 @@ Meteor.publish 'roomFiles', (rid, limit = 50) ->
type: 1
url: 1
cursorFileListHandle = fileCollection.find(fileQuery, fileOptions).observeChanges
cursorFileListHandle = RocketChat.models.Uploads.find(fileQuery, fileOptions).observeChanges
added: (_id, record) ->
pub.added('room_files', _id, record)

@ -7,7 +7,7 @@ RocketChat.Migrations.add
oldGridFSCollection = new Meteor.Collection 'cfs_gridfs.files.files'
oldChunkCollection = new Meteor.Collection 'cfs_gridfs.files.chunks'
newFilesCollection = fileCollection
newFilesCollection = RocketChat.models.Uploads
newGridFSCollection = new Meteor.Collection 'rocketchat_uploads.files'
newChunkCollection = new Meteor.Collection 'rocketchat_uploads.chunks'

@ -20,7 +20,7 @@ RocketChat.Migrations.add
return unless cursorFileMessages.count()
_.each( cursorFileMessages.fetch(), (msg) ->
fileCollection.update({ _id: msg?.file?._id }, { $set: { rid: msg.rid } }, { $multi: true })
RocketChat.models.Uploads.update({ _id: msg?.file?._id }, { $set: { rid: msg.rid } }, { $multi: true })
)
console.log 'Updated rocketchat_uploads documents to include the room Id in which they were sent.'

Loading…
Cancel
Save