diff --git a/server/models/entry.coffee b/server/models/entry.coffee index d13f58f..6e5ecb7 100755 --- a/server/models/entry.coffee +++ b/server/models/entry.coffee @@ -119,10 +119,15 @@ entrySchema.statics.findByParams = (params, callback) -> (callback) -> if settings.bucket? filteredBuckets = settings.bucket.split '|' + excludedBuckets = _.chain(filteredBuckets) + .filter (bucket) -> bucket.indexOf('-') == 0 + .map (bucket) -> bucket.substring(1) + .value() + queryObject = if excludedBuckets.length > 0 then {slug: $nin: excludedBuckets} else {slug: $in: filteredBuckets} searchQuery.bucket = $in: [] - mongoose.model('Bucket').find {slug: $in: filteredBuckets}, (err, buckets) => - filteredBucketIDs = _.pluck _.filter(buckets, (bkt) -> bkt.slug in filteredBuckets), '_id' + mongoose.model('Bucket').find queryObject, (err, buckets) => + filteredBucketIDs = _.pluck _.filter(buckets, (bkt) -> bkt.slug?), '_id' searchQuery.bucket = $in: filteredBucketIDs callback null else diff --git a/test/server/models/entry.coffee b/test/server/models/entry.coffee index 08a3eea..d80b0c6 100644 --- a/test/server/models/entry.coffee +++ b/test/server/models/entry.coffee @@ -122,3 +122,20 @@ describe 'Entry', -> expect(entries).to.have.length 1 expect(entries?[0]?.title).to.equal 'Test Article' done() + + it 'filters by negative bucket slug', (done) -> + Entry.findByParams bucket: '-photos', (e, entries) -> + expect(entries).to.have.length 1 + expect(entries?[0]?.title).to.equal 'Test Article' + done() + + it 'filters by multiple negative bucket slugs', (done) -> + Entry.findByParams bucket: '-photos|-articles', (e, entries) -> + expect(entries).to.have.length 0 + done() + + it 'filters by negative and positive bucket slug', (done) -> + Entry.findByParams bucket: '-photos|articles', (e, entries) -> + expect(entries).to.have.length 1 + expect(entries?[0]?.title).to.equal 'Test Article' + done()