diff --git a/README.md b/README.md index 3f6697fa..af5838d0 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # angel_mongo -[![version 1.1.3](https://img.shields.io/badge/pub-1.1.3-brightgreen.svg)](https://pub.dartlang.org/packages/angel_mongo) +[![version 1.1.4](https://img.shields.io/badge/pub-1.1.4-brightgreen.svg)](https://pub.dartlang.org/packages/angel_mongo) [![build status](https://travis-ci.org/angel-dart/mongo.svg?branch=master)](https://travis-ci.org/angel-dart/mongo) MongoDB-enabled services for the Angel framework. diff --git a/lib/mongo_service.dart b/lib/mongo_service.dart index 6874c3d1..17dc115f 100644 --- a/lib/mongo_service.dart +++ b/lib/mongo_service.dart @@ -8,12 +8,65 @@ class MongoService extends Service { /// /// `false` by default. final bool allowRemoveAll; + + /// If set to `true`, parameters in `req.query` are applied to the database query. + final bool allowQuery; + final bool debug; MongoService(DbCollection this.collection, - {this.allowRemoveAll: false, this.debug: true}) + {this.allowRemoveAll: false, this.allowQuery: true, this.debug: true}) : super(); + SelectorBuilder _makeQuery([Map params_]) { + Map params = params_ ?? {}; + params = params..remove('provider'); + SelectorBuilder result = where.exists('_id'); + + // You can pass a SelectorBuilder as 'query'; + if (params['query'] is SelectorBuilder) { + return params['query']; + } + + for (var key in params.keys) { + if (key == r'$sort' || + key == r'$query' && + (allowQuery == true || !params.containsKey('provider'))) { + if (params[key] is Map) { + // If they send a map, then we'll sort by every key in the map + for (String fieldName in params[key].keys.where((x) => x is String)) { + var sorter = params[key][fieldName]; + if (sorter is num) { + result = result.sortBy(fieldName, descending: sorter == -1); + } else if (sorter is String) { + result = result.sortBy(fieldName, descending: sorter == "-1"); + } else if (sorter is SelectorBuilder) { + result = result.and(sorter); + } + } + } else if (params[key] is String && key == r'$sort') { + // If they send just a string, then we'll sort + // by that, ascending + result = result.sortBy(params[key]); + } + } else if (key == 'query' && + (allowQuery == true || !params.containsKey('provider'))) { + Map query = params[key]; + query.forEach((key, v) { + var value = v is Map ? _filterNoQuery(v) : v; + + if (!_NO_QUERY.contains(key) && + value is! RequestContext && + value is! ResponseContext) { + result = result.and(where.eq(key, value)); + } + }); + } + } + + return result; + } + _jsonify(Map doc, [Map params]) { Map result = {}; diff --git a/lib/services.dart b/lib/services.dart index 9c163224..d01a7976 100644 --- a/lib/services.dart +++ b/lib/services.dart @@ -48,52 +48,6 @@ Map _removeSensitive(Map data) { const List _NO_QUERY = const ['__requestctx', '__responsectx']; -SelectorBuilder _makeQuery([Map params_]) { - Map params = params_ ?? {}; - params = params..remove('provider'); - SelectorBuilder result = where.exists('_id'); - - // You can pass a SelectorBuilder as 'query'; - if (params['query'] is SelectorBuilder) { - return params['query']; - } - - for (var key in params.keys) { - if (key == r'$sort' || key == r'$query') { - if (params[key] is Map) { - // If they send a map, then we'll sort by every key in the map - for (String fieldName in params[key].keys.where((x) => x is String)) { - var sorter = params[key][fieldName]; - if (sorter is num) { - result = result.sortBy(fieldName, descending: sorter == -1); - } else if (sorter is String) { - result = result.sortBy(fieldName, descending: sorter == "-1"); - } else if (sorter is SelectorBuilder) { - result = result.and(sorter); - } - } - } else if (params[key] is String && key == r'$sort') { - // If they send just a string, then we'll sort - // by that, ascending - result = result.sortBy(params[key]); - } - } else if (key == 'query') { - Map query = params[key]; - query.forEach((key, v) { - var value = v is Map ? _filterNoQuery(v) : v; - - if (!_NO_QUERY.contains(key) && - value is! RequestContext && - value is! ResponseContext) { - result = result.and(where.eq(key, value)); - } - }); - } - } - - return result; -} - Map _filterNoQuery(Map data) { return data.keys.fold({}, (map, key) { var value = data[key]; diff --git a/pubspec.yaml b/pubspec.yaml index a74e091d..08e1c9f3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: angel_mongo -version: 1.1.3 +version: 1.1.4 description: MongoDB-enabled services for the Angel framework. author: Tobe O homepage: https://github.com/angel-dart/angel_mongo