This commit is contained in:
Tobe O 2018-12-10 12:51:10 -05:00
parent 161269bf82
commit 7d2b670231
6 changed files with 62 additions and 32 deletions

View file

@ -1,3 +1,6 @@
# 2.0.1
* Patch for updated body parsing.
# 2.0.0 # 2.0.0
* Finish update for Angel 2. * Finish update for Angel 2.

View file

@ -247,8 +247,8 @@ a `Validator` instance to the constructor, because it extends the
```dart ```dart
main() { main() {
var bio = new Validator({ var bio = new Validator({
'age*': [isInteger, greaterThanOrEqualTo(0)], 'age*': [isInt, greaterThanOrEqualTo(0)],
'birthYear*': isInteger, 'birthYear*': isInt,
'countryOfOrigin': isString 'countryOfOrigin': isString
}); });
@ -277,12 +277,12 @@ main() {
# Use with Angel # Use with Angel
`server.dart` exposes seven helper middleware: `server.dart` exposes seven helper middleware:
* `validate(validator)`: Validates and filters `req.body`, and throws an `AngelHttpException.BadRequest` if data is invalid. * `validate(validator)`: Validates and filters `req.bodyAsMap`, and throws an `AngelHttpException.BadRequest` if data is invalid.
* `validateEvent(validator)`: Sets `e.data` to the result of validation on a service event. * `validateEvent(validator)`: Sets `e.data` to the result of validation on a service event.
* `validateQuery(validator)`: Same as `validate`, but operates on `req.query`. * `validateQuery(validator)`: Same as `validate`, but operates on `req.query`.
* `autoParseBody(fields)`: Auto-parses numbers in `req.body`. * `autoParseBody(fields)`: Auto-parses numbers in `req.bodyAsMap`.
* `autoParseQuery(fields)`: Same as `autoParseBody`, but operates on `req.query`. * `autoParseQuery(fields)`: Same as `autoParseBody`, but operates on `req.query`.
* `filterBody(only)`: Filters unwanted data out of `req.body`. * `filterBody(only)`: Filters unwanted data out of `req.bodyAsMap`.
* `filterQuery(only)`: Same as `filterBody`, but operates on `req.query`. * `filterQuery(only)`: Same as `filterBody`, but operates on `req.query`.
```dart ```dart
@ -304,7 +304,7 @@ main() async {
var app = new Angel(); var app = new Angel();
app.chain(validate(echo)).post('/echo', (req, res) async { app.chain(validate(echo)).post('/echo', (req, res) async {
res.write('You said: "${req.body["message"]}"'); res.write('You said: "${req.bodyAsMap["message"]}"');
}); });
app.service('api/todos') app.service('api/todos')

29
example/main.dart Normal file
View file

@ -0,0 +1,29 @@
import 'package:angel_validate/angel_validate.dart';
main() {
var bio = new Validator({
'age*': [isInt, greaterThanOrEqualTo(0)],
'birthYear*': isInt,
'countryOfOrigin': isString
});
var book = new Validator({
'title*': isString,
'year*': [
isNum,
(year) {
return year <= new DateTime.now().year;
}
]
});
var author = new Validator({
'bio*': bio,
'books*': [
isList,
everyElement(book)
]
}, defaultValues: {
'books': []
});
}

View file

@ -9,62 +9,60 @@ import 'angel_validate.dart';
export 'src/async.dart'; export 'src/async.dart';
export 'angel_validate.dart'; export 'angel_validate.dart';
/// Auto-parses numbers in `req.body`. /// Auto-parses numbers in `req.bodyAsMap`.
RequestHandler autoParseBody(List<String> fields) { RequestHandler autoParseBody(List<String> fields) {
return (RequestContext req, res) async { return (RequestContext req, res) async {
var body = await req.parseBody(); await req.parseBody();
body.addAll(autoParse(body, fields)); req.bodyAsMap.addAll(autoParse(req.bodyAsMap, fields));
return true; return true;
}; };
} }
/// Auto-parses numbers in `req.query`. /// Auto-parses numbers in `req.queryParameters`.
RequestHandler autoParseQuery(List<String> fields) { RequestHandler autoParseQuery(List<String> fields) {
return (RequestContext req, res) async { return (RequestContext req, res) async {
var query = new Map<String, dynamic>.from(await req.parseQuery()); req.queryParameters.addAll(autoParse(req.queryParameters, fields));
(await req.parseQuery()).addAll(autoParse(query, fields));
return true; return true;
}; };
} }
/// Filters unwanted data out of `req.body`. /// Filters unwanted data out of `req.bodyAsMap`.
RequestHandler filterBody(Iterable<String> only) { RequestHandler filterBody(Iterable<String> only) {
return (RequestContext req, res) async { return (RequestContext req, res) async {
var body = await req.parseBody(); await req.parseBody();
var filtered = filter(body, only); var filtered = filter(req.bodyAsMap, only);
body req.bodyAsMap
..clear() ..clear()
..addAll(filtered); ..addAll(filtered);
return true; return true;
}; };
} }
/// Filters unwanted data out of `req.query`. /// Filters unwanted data out of `req.queryParameters`.
RequestHandler filterQuery(Iterable<String> only) { RequestHandler filterQuery(Iterable<String> only) {
return (RequestContext req, res) async { return (RequestContext req, res) async {
var query = await req.parseQuery(); var filtered = filter(req.queryParameters, only);
var filtered = filter(query, only); req.queryParameters
(await req.parseQuery())
..clear() ..clear()
..addAll(filtered); ..addAll(filtered);
return true; return true;
}; };
} }
/// Validates the data in `req.body`, and sets the body to /// Validates the data in `req.bodyAsMap`, and sets the body to
/// filtered data before continuing the response. /// filtered data before continuing the response.
RequestHandler validate(Validator validator, RequestHandler validate(Validator validator,
{String errorMessage: 'Invalid data.'}) { {String errorMessage: 'Invalid data.'}) {
return (RequestContext req, res) async { return (RequestContext req, res) async {
var body = await req.parseBody(); await req.parseBody();
var result = await asyncApplyValidator(validator, body, req.app); var result = await asyncApplyValidator(validator, req.bodyAsMap, req.app);
if (result.errors.isNotEmpty) { if (result.errors.isNotEmpty) {
throw new AngelHttpException.badRequest( throw new AngelHttpException.badRequest(
message: errorMessage, errors: result.errors); message: errorMessage, errors: result.errors);
} }
body req.bodyAsMap
..clear() ..clear()
..addAll(result.data); ..addAll(result.data);
@ -72,20 +70,20 @@ RequestHandler validate(Validator validator,
}; };
} }
/// Validates the data in `req.query`, and sets the query to /// Validates the data in `req.queryParameters`, and sets the query to
/// filtered data before continuing the response. /// filtered data before continuing the response.
RequestHandler validateQuery(Validator validator, RequestHandler validateQuery(Validator validator,
{String errorMessage: 'Invalid data.'}) { {String errorMessage: 'Invalid data.'}) {
return (RequestContext req, res) async { return (RequestContext req, res) async {
var query = await req.parseQuery(); var result =
var result = await asyncApplyValidator(validator, query, req.app); await asyncApplyValidator(validator, req.queryParameters, req.app);
if (result.errors.isNotEmpty) { if (result.errors.isNotEmpty) {
throw new AngelHttpException.badRequest( throw new AngelHttpException.badRequest(
message: errorMessage, errors: result.errors); message: errorMessage, errors: result.errors);
} }
(await req.parseQuery()) req.queryParameters
..clear() ..clear()
..addAll(result.data); ..addAll(result.data);

View file

@ -1,6 +1,6 @@
name: angel_validate name: angel_validate
description: Cross-platform validation library based on `matcher`. description: Cross-platform request body validation library based on `matcher`.
version: 2.0.0 version: 2.0.1
author: Tobe O <thosakwe@gmail.com> author: Tobe O <thosakwe@gmail.com>
homepage: https://github.com/angel-dart/validate homepage: https://github.com/angel-dart/validate
environment: environment:

View file

@ -26,8 +26,8 @@ main() {
app.chain([validate(echoSchema)]).post('/echo', app.chain([validate(echoSchema)]).post('/echo',
(RequestContext req, res) async { (RequestContext req, res) async {
var body = await req.parseBody(); await req.parseBody();
res.write('Hello, ${body['message']}!'); res.write('Hello, ${req.bodyAsMap['message']}!');
}); });
app.logger = new Logger('angel')..onRecord.listen(printRecord); app.logger = new Logger('angel')..onRecord.listen(printRecord);