UNPKG

2.31 kBJavaScriptView Raw
1var _ = require('lodash');
2
3//options : {only: [], except: []}
4//only: only expose specified methods, disable others
5//except: expose all methods, except specified ones
6// symbol @ donates the method is static
7
8module.exports = function(Model, options) {
9 options = options || {};
10
11 var methods =[
12 '@create',
13 '@upsert',
14 '@exists',
15 '@findById',
16 '@deleteById',
17 '@count',
18 '@find',
19 '@findOne',
20 '@createChangeStream',
21 '@updateAll',
22 'updateAttributes'
23 ]
24
25 if (Model.modelName === 'User' || Model.base.modelName === 'User') {
26 methods = _(methods).concat([
27 '@login',
28 '@logout',
29 '@confirm',
30 '@resetPassword']).value();
31 }
32
33 methods = methods.concat(getRelationMethods(Model));
34
35 if (options.only && options.only.length) {
36 methods = _.difference(methods, options.only);
37 }
38
39 if (options.except && options.except.length) {
40 methods = _.filter(methods, function(method){
41 return _.includes(options.except, method);
42 });
43 }
44
45 //always disable changeStream related endpoints
46 methods.push('@createChangeStream');
47
48 methods.forEach(function(method){
49 if (/^@/.test(method)) {
50 Model.disableRemoteMethod(method.replace(/^@/, ''), true);
51 } else {
52 Model.disableRemoteMethod(method, false);
53 }
54 });
55}
56
57function getRelationMethods(Model) {
58 var relations = Model.definition.settings.relations;
59 var remoteMethods = [];
60
61 if (!relations) return remoteMethods;
62
63 var hasManyPrefixs = [
64 '__create__',
65 '__get__',
66 '__delete__',
67 '__findById__',
68 '__updateById__',
69 '__destroyById__',
70 '__count__',
71 '__exists__',
72 '__link__',
73 '__unlink__'
74 ];
75
76 var hasOnePrefixs = [
77 '__create__',
78 '__get__',
79 '__update__',
80 '__destroy__'
81 ];
82
83 var belongsToPrefixs = [
84 '__get__'
85 ];
86
87 Object.keys(relations).forEach(function(targetModel){
88 switch(relations[targetModel].type) {
89 case 'hasMany':
90 case 'hasAndBelongsToMany':
91 hasManyPrefixs.forEach(disableIt);
92 break;
93 case 'hasOne':
94 hasOnePrefixs.forEach(disableIt);
95 break;
96 case 'belongsTo':
97 belongsToPrefixs.forEach(disableIt);
98 break;
99 }
100 function disableIt(prefix) {
101 remoteMethods.push(prefix+targetModel);
102 }
103 })
104
105 return remoteMethods;
106}