1- import requireAll from 'require-all' ;
21import slug from 'slug' ;
3- import _ from 'lodash' ;
4- import * as uuid from 'node-uuid' ;
2+ import uuid from 'uuid/v4' ;
53
64function SlugsHook ( sails ) {
75
8- function transformModels ( models ) {
9- return _ . chain ( models )
10- . mapValues ( ( model , key ) => {
11- return _ . defaults ( model , {
12- globalId : key ,
13- identity : key . toLowerCase ( )
14- } ) ;
15- } )
16- . mapKeys ( ( model , key ) => key . toLowerCase ( ) )
17- . value ( ) ;
18- }
6+ /**
7+ * Indicate whether a given slug can be used as it is or not.
8+ *
9+ * @param {string } slugName Slug to check
10+ * @param {string } modelName Name of the model
11+ * @param {string } attributeName Attribute on which the slug is defined
12+ * @param {Array } blacklist List of names to not use
13+ * @returns {Promise }
14+ */
15+ function slugCanBeUsed ( slugName , modelName , attributeName , blacklist ) {
16+
17+ return new Promise ( ( resolve , reject ) => {
18+
19+ if ( sails . config . slugs . blacklist . indexOf ( slugName ) !== - 1 ||
20+ ( Array . isArray ( blacklist ) && blacklist . indexOf ( slugName ) !== - 1 ) ) {
21+ return resolve ( false ) ;
22+ }
1923
20- function loadModels ( ) {
21- console . log ( 'Loading Models...' ) ;
22- try {
23- let models = requireAll ( {
24- dirname : __dirname + '/models' ,
25- filter : / ( .+ ) \. j s $ /
24+ let criteria = { } ;
25+ criteria [ attributeName ] = slugName ;
26+
27+ sails . models [ modelName ] . count ( criteria )
28+ . then ( ( found ) => {
29+ resolve ( ! found ) ;
30+ } )
31+ . catch ( ( err ) => {
32+ reject ( err ) ;
2633 } ) ;
27-
28- _ . merge ( sails . models || { } , transformModels ( models ) ) ;
29- }
30- catch ( e ) {
31- console . log ( 'No Models found' ) ;
32- }
34+ } ) ;
3335 }
3436
3537 function patchModels ( ) {
36- _ . forOwn ( sails . models , function ( model , modelName ) {
3738
38- _ . forOwn ( model . attributes , function ( attr , name ) {
39+ for ( let modelName of Object . keys ( sails . models ) ) {
40+ let model = sails . models [ modelName ] ;
41+
42+ for ( let name of Object . keys ( model . attributes ) ) {
43+ let attr = model . attributes [ name ] ;
3944 if ( attr . type === 'slug' && attr . from ) {
4045 attr . type = 'string' ;
4146
42- model . beforeCreate = ( ( previousBeforeCreate , from ) => function ( values , cb ) {
47+ model . beforeCreate = ( ( previousBeforeCreate , from , blacklist ) => function ( values , cb ) {
4348
4449 let slugName = slug ( values [ from ] , { lower : sails . config . slugs . lowercase } ) ;
4550
46- let criteria = { } ;
47- criteria [ name ] = slugName ;
48-
4951 // Check that slug is not already used
50- sails . models [ modelName ] . count ( criteria )
51- . then ( function ( found ) {
52- if ( found ) {
53- values [ name ] = slugName + '-' + uuid . v4 ( ) ;
52+ slugCanBeUsed ( slugName , modelName , name , blacklist )
53+ . then ( ( ok ) => {
54+ if ( ok ) {
55+ values [ name ] = slugName ;
5456 }
5557 else {
56- values [ name ] = slugName ;
58+ values [ name ] = slugName + '-' + uuid ( ) ;
5759 }
5860
5961 if ( typeof previousBeforeCreate === 'function' ) {
@@ -65,26 +67,25 @@ function SlugsHook(sails) {
6567 } )
6668 . catch ( cb ) ;
6769
68- } ) ( model . beforeCreate , attr . from ) ;
70+ } ) ( model . beforeCreate , attr . from , attr . blacklist ) ;
6971
7072 delete attr . from ;
7173 }
72- } ) ;
73- } ) ;
74+ }
75+ }
7476 }
7577
7678 return {
7779
7880 defaults : {
7981 __configKey__ : {
80- lowercase : true
82+ lowercase : true ,
83+ blacklist : [ ]
8184 }
8285 } ,
8386
8487 initialize : function ( next ) {
8588
86- //loadModels();
87-
8889 sails . after ( [ 'hook:moduleloader:loaded' ] , function ( ) {
8990
9091 patchModels ( ) ;
0 commit comments