Skip to content

Commit 31342b0

Browse files
committed
[feat] Add Archtype, Extend functionality of Model config.
1 parent ff8463b commit 31342b0

File tree

9 files changed

+106
-9
lines changed

9 files changed

+106
-9
lines changed

archetype/config/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
exports.stores = require('./stores')
2+
exports.models = require('./models')

archetype/config/models.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/**
2+
* Models Configuration
3+
*
4+
* @see {@link http://trailsjs.io/doc/trailpack/config
5+
*/
6+
module.exports = {
7+
/**
8+
* The default store if not defined by model
9+
*/
10+
defaultStore: 'sqlitedev',
11+
/**
12+
* The default migration strategy if not defined by the store or model
13+
* ENUM: none, safe, drop, alter,
14+
*/
15+
migrate: 'drop'
16+
17+
/**
18+
* You can also define model by model which store, migration, etc it will use.
19+
* A la carte model definitions
20+
* eg:
21+
*
22+
* Test: {
23+
* store: 'sqlitedev',
24+
* migrate: 'drop',
25+
* tableName: 'test',
26+
* options: {}
27+
* }
28+
*/
29+
}

archetype/config/stores.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/**
2+
* Stores Configuration
3+
*
4+
* @see {@link http://trailsjs.io/doc/trailpack/config
5+
*/
6+
module.exports = {
7+
/**
8+
* Define the database stores. A store is typically a single database.
9+
*
10+
* Use the SQLite3 by default for development purposes.
11+
*
12+
* Set production connection info in config/env/production.js
13+
*/
14+
15+
16+
/**
17+
* Define a store called "sqlitedev" which uses SQLite3 to persist data.
18+
*/
19+
sqlitedev: {
20+
database: 'dev',
21+
storage: './.tmp/dev.sqlite',
22+
host: '127.0.0.1',
23+
dialect: 'sqlite'
24+
/**
25+
* The default migration strategy for this store.
26+
migrate: 'drop'
27+
*/
28+
}
29+
}

index.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,16 @@ module.exports = class SequelizeTrailpack extends Trailpack {
1111
* Validate the database config, and api.model definitions
1212
*/
1313
async validate() {
14-
const stores = _.get(this.app.config, 'database.stores')
14+
const stores = this.app.config.get('stores')
15+
const models = this.app.config.get('models')
16+
1517
if (stores && Object.keys(stores).length === 0) {
16-
this.app.config.log.logger.warn('No store configured at config.database.stores, models will be ignored')
18+
this.app.config.log.logger.warn('No store configured at config.stores, models will be ignored')
1719
}
20+
1821
return Promise.all([
19-
lib.Validator.validateStoresConfig(stores)
22+
lib.Validator.validateStoresConfig(stores),
23+
lib.Validator.validateModelsConfig(models)
2024
])
2125
}
2226

lib/schemas.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ module.exports = {
66
orm: joi.string()
77
}).unknown(),
88

9+
modelsConfig: joi.object().keys({
10+
defaultStore: joi.string(),
11+
migrate: joi.string()
12+
}).unknown(),
13+
914
models: joi.object().keys({
1015
autoPK: joi.boolean(),
1116
autoCreatedAt: joi.boolean(),

lib/transformer.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ module.exports = {
1313
// const models = app.models
1414

1515
return _.mapValues(app.models, (model, modelName) => {
16+
17+
const configOverrides = app.config.get(`models.${modelName}`) || {}
1618
const config = model.constructor.config(app, Sequelize) || {}
1719
const schema = model.constructor.schema(app, Sequelize) || {}
1820

@@ -42,22 +44,22 @@ module.exports = {
4244
},
4345
tableName: {
4446
enumerable: false,
45-
value: config.tableName || modelName.toLowerCase(),
47+
value: configOverrides.tableName || config.tableName || modelName.toLowerCase(),
4648
writable: false
4749
},
4850
store: {
4951
enumerable: false,
50-
value: config.store || app.config.get('models.defaultStore'),
52+
value: configOverrides.store || config.store || app.config.get('models.defaultStore'),
5153
writable: false
5254
},
5355
migrate: {
5456
enumerable: false,
55-
value: config.migrate || app.config.get('models.migrate'),
57+
value: configOverrides.migrate || config.migrate || app.config.get('models.migrate'),
5658
writable: false
5759
},
5860
options: {
5961
enumerable: false,
60-
value: config.options,
62+
value: configOverrides.options || config.options,
6163
writable: true
6264
},
6365
config: {

lib/validator.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,15 @@ module.exports = {
77
joi.validate(config, lib.Schemas.storesConfig, (err, value) => {
88
if (err) return reject(err)
99

10+
return resolve(value)
11+
})
12+
})
13+
},
14+
validateModelsConfig (config) {
15+
return new Promise((resolve, reject) => {
16+
joi.validate(config, lib.Schemas.modelsConfig, (err, value) => {
17+
if (err) return reject(err)
18+
1019
return resolve(value)
1120
})
1221
})

test/app.js

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,20 @@ module.exports = _.defaultsDeep({
178178
afterValidate: Sequelize.INTEGER
179179
}
180180
}
181-
}
181+
},
182+
Override: class Override extends Model {
183+
static config() {
184+
return {
185+
store: 'teststore',
186+
tableName: 'shouldoverride'
187+
}
188+
}
189+
static schema(app, Sequelize) {
190+
return {
191+
status: Sequelize.STRING
192+
}
193+
}
194+
},
182195
}
183196
},
184197
config: {
@@ -189,7 +202,10 @@ module.exports = _.defaultsDeep({
189202
},
190203
models: {
191204
defaultStore: 'teststore',
192-
migrate: 'drop'
205+
migrate: 'drop',
206+
Override: {
207+
tableName: 'override'
208+
}
193209
},
194210
stores: {
195211
teststore: {

test/lib/transformer.test.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ describe('lib.Transformer', () => {
2222

2323
assert.equal(models.User.store, 'teststore')
2424
assert.equal(models.Role.store, 'storeoverride')
25+
assert.equal(models.Override.tableName, 'override')
2526
})
2627
})
2728

0 commit comments

Comments
 (0)