Meteor.publishComposite 'adminCollectionDoc', (collection, id) -> check collection, String check id, Match.OneOf(String, Mongo.ObjectID) if Roles.userIsInRole this.userId, ['admin'] find: -> adminCollectionObject(collection).find(id) children: AdminConfig?.collections?[collection]?.children or [] else @ready() Meteor.publish 'adminUsers', -> if Roles.userIsInRole @userId, ['admin'] Meteor.users.find() else @ready() Meteor.publish 'adminUser', -> Meteor.users.find @userId Meteor.publish 'adminCollectionsCount', -> handles = [] self = @ _.each AdminTables, (table, name) -> id = new Mongo.ObjectID count = 0 table = AdminTables[name] ready = false selector = if table.selector then table.selector(self.userId) else {} handles.push table.collection.find().observeChanges added: -> count += 1 ready and self.changed 'adminCollectionsCount', id, {count: count} removed: -> count -= 1 ready and self.changed 'adminCollectionsCount', id, {count: count} ready = true self.added 'adminCollectionsCount', id, {collection: name, count: count} self.onStop -> _.each handles, (handle) -> handle.stop() self.ready() Meteor.publish null, -> Meteor.roles.find({})