Skip to content

Commit f143bae

Browse files
committed
Added: a route with schema binding can contain filter
1 parent b6d2753 commit f143bae

8 files changed

Lines changed: 51 additions & 9 deletions

File tree

builders.js

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -979,7 +979,7 @@ SchemaBuilderEntity.prototype.query = function(helper, callback) {
979979
* @param {ErrorBuilder} builder ErrorBuilder, INTERNAL.
980980
* @return {ErrorBuilder}
981981
*/
982-
SchemaBuilderEntity.prototype.validate = function(model, resourcePrefix, resourceName, builder) {
982+
SchemaBuilderEntity.prototype.validate = function(model, resourcePrefix, resourceName, builder, filter) {
983983

984984
var self = this;
985985
var fn = self.onValidation;
@@ -1007,7 +1007,12 @@ SchemaBuilderEntity.prototype.validate = function(model, resourcePrefix, resourc
10071007

10081008
// self._setStateToModel(model, 1, 1);
10091009
//return framework_utils.validate.call(self, model, self.name, fn, builder, undefined, self.name, self.parent.collection);
1010-
return framework_utils.validate_builder.call(self, model, builder, self.name, self.parent.collection, self.name);
1010+
1011+
if (filter)
1012+
filter = self.filter(filter);
1013+
1014+
1015+
return framework_utils.validate_builder.call(self, model, builder, self.name, self.parent.collection, self.name, undefined, filter);
10111016
};
10121017

10131018
/**
@@ -1335,7 +1340,7 @@ SchemaBuilderEntity.prototype.default = function() {
13351340
return self.$make(item);
13361341
};
13371342

1338-
SchemaBuilderEntity.prototype.make = SchemaBuilderEntity.prototype.load = function(model, callback) {
1343+
SchemaBuilderEntity.prototype.make = SchemaBuilderEntity.prototype.load = function(model, callback, filter) {
13391344

13401345
var self = this;
13411346

@@ -1350,7 +1355,7 @@ SchemaBuilderEntity.prototype.make = SchemaBuilderEntity.prototype.load = functi
13501355
return output;
13511356
}
13521357

1353-
var builder = self.validate(output);
1358+
var builder = self.validate(output, undefined, undefined, undefined, filter);
13541359
if (builder.hasError()) {
13551360

13561361
if (self.onError)

changes.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
BETA ======= 1.9.3 (HOTFIX)
22

33
- added: (IMPORTANT) merging supports BLOCKS (.js,.css), e.g. F.merge('merge.js', 'fileA.js#management,common', 'fileB.js#management')
4+
- added: (IMPORTANT) a route with schema binding can contain filter e.g. `*Schema#update` or `*Group\Schema#create` --> the framework validates only fields by filter
45
- added: MAKE([transform], function(obj))
56
- added: TRANSFORM([transform], obj)
67
- added: NEWTRANSFORM(name, fn, [isDefault]) --> alias for TransformBuilder.addTransform()

index.js

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1105,6 +1105,12 @@ Framework.prototype.route = function(url, funcExecute, flags, length, middleware
11051105
schema[1] = schema[0];
11061106
schema[0] = 'default';
11071107
}
1108+
1109+
index = schema[1].indexOf('#');
1110+
if (index !== -1) {
1111+
schema[2] = schema[1].substring(index + 1);
1112+
schema[1] = schema[1].substring(0, index);
1113+
}
11081114
continue;
11091115
}
11101116

@@ -3085,7 +3091,7 @@ Framework.prototype.onValidation = null;
30853091
* @param {String} name
30863092
* @param {Function(err, body)} callback
30873093
*/
3088-
Framework.prototype.onSchema = function(req, group, name, callback) {
3094+
Framework.prototype.onSchema = function(req, group, name, callback, filter) {
30893095

30903096
var schema = GETSCHEMA(group, name);
30913097

@@ -3099,7 +3105,7 @@ Framework.prototype.onSchema = function(req, group, name, callback) {
30993105
callback(err);
31003106
else
31013107
callback(null, result);
3102-
});
3108+
}, filter);
31033109
};
31043110

31053111
/**
@@ -9116,7 +9122,7 @@ Subscribe.prototype.doEnd = function() {
91169122

91179123
req.body = body;
91189124
self.prepare(req.flags, req.uri.pathname);
9119-
});
9125+
}, route.schema[2]);
91209126

91219127
return self;
91229128
}
@@ -9174,7 +9180,7 @@ Subscribe.prototype.doEnd = function() {
91749180

91759181
req.body = body;
91769182
self.prepare(req.flags, req.uri.pathname);
9177-
});
9183+
}, route.schema[2]);
91789184

91799185
return self;
91809186
};

test/controllers/default.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ exports.install = function() {
3737
framework.route('/html-compressor/', view_compressor);
3838
framework.route('/html-nocompress/', view_nocompress);
3939
framework.route('/sync/', synchronize);
40+
framework.route('/schema-filter/', ['post', '*filter#update']);
4041
framework.route('/package/', '@testpackage/test');
4142
framework.route('/precompile/', view_precomile);
4243
framework.route('/homepage/', view_homepage);

test/models/user.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,12 @@ var User = SCHEMA('test').add('User');
44
User.define('name', 'string(10)', true);
55
User.setValidation(function(name, value) {
66
return value.length > 0;
7+
});
8+
9+
NEWSCHEMA('filter').make(function(schema) {
10+
schema.define('name', String, true, 'create');
11+
schema.define('age', Number, true, 'update');
12+
schema.setValidation(function() {
13+
return false;
14+
});
715
});

test/test-framework-debug.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,15 @@ function test_routing(next) {
395395
});
396396
});
397397

398+
async.await('post-schema-filter', function(complete) {
399+
utils.request(url + 'schema-filter/', ['post'], 'EMPTY', function(error, data, code, headers) {
400+
if (error)
401+
throw error;
402+
assert(data === '[{"name":"age","error":"The field \\"age\\" is required.","path":"filter.age"}]', 'schema filter');
403+
complete();
404+
});
405+
});
406+
398407
async.await('post-schema', function(complete) {
399408
utils.request(url + 'post/schema/', ['post'], 'name=Peter123456789012345678901234567890#', function(error, data, code, headers) {
400409
if (error)

test/test-framework-release.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,15 @@ function test_routing(next) {
395395
});
396396
});
397397

398+
async.await('post-schema-filter', function(complete) {
399+
utils.request(url + 'schema-filter/', ['post'], 'EMPTY', function(error, data, code, headers) {
400+
if (error)
401+
throw error;
402+
assert(data === '[{"name":"age","error":"The field \\"age\\" is required.","path":"filter.age"}]', 'schema filter');
403+
complete();
404+
});
405+
});
406+
398407
async.await('post-schema', function(complete) {
399408
utils.request(url + 'post/schema/', ['post'], 'name=Peter123456789012345678901234567890#', function(error, data, code, headers) {
400409
if (error)

utils.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1524,7 +1524,7 @@ exports.validate = function(model, properties, prepare, builder, resource, path,
15241524
return error;
15251525
};
15261526

1527-
exports.validate_builder = function(model, error, schema, collection, path, index) {
1527+
exports.validate_builder = function(model, error, schema, collection, path, index, fields) {
15281528

15291529
var entity = collection[schema];
15301530
var prepare = entity.onValidation || framework.onValidation;
@@ -1541,6 +1541,9 @@ exports.validate_builder = function(model, error, schema, collection, path, inde
15411541
for (var i = 0; i < properties.length; i++) {
15421542

15431543
var name = properties[i].toString();
1544+
if (fields && fields.indexOf(name) === -1)
1545+
continue;
1546+
15441547
var value = model[name];
15451548
var type = typeof(value);
15461549

0 commit comments

Comments
 (0)