diff options
| author | Jules Laplace <julescarbon@gmail.com> | 2017-07-19 00:50:05 +0200 |
|---|---|---|
| committer | Jules Laplace <julescarbon@gmail.com> | 2017-07-19 00:50:05 +0200 |
| commit | 64e8c03dea044752bf3f2f228462721fe565f950 (patch) | |
| tree | 41b48b67f69979bfc97be166129ee41c8dcb0c7f /lib/db | |
| parent | 11a70bc347587219b2ec7b63cf4a6ff69bb4199b (diff) | |
refactor all the worker stuff
Diffstat (limited to 'lib/db')
| -rw-r--r-- | lib/db/crud.js | 40 | ||||
| -rw-r--r-- | lib/db/index.js | 79 | ||||
| -rw-r--r-- | lib/db/model.js | 160 | ||||
| -rw-r--r-- | lib/db/models.js | 43 |
4 files changed, 247 insertions, 75 deletions
diff --git a/lib/db/crud.js b/lib/db/crud.js new file mode 100644 index 0000000..fb32690 --- /dev/null +++ b/lib/db/crud.js @@ -0,0 +1,40 @@ +module.exports = function(model) { + return { + index: (q) => { + return model.query( (qb) => { + const limit = q.limit || 100 + const offset = q.offset || 0 + if (limit) { + delete q.limit + } + if (q.offset) { + delete q.offset + } + if (Object.keys(q).length > 0) qb.where(q) + qb.orderBy("id", "desc") + if (limit) qb.limit( limit ) + if (offset) qb.offset( offset ) + // console.log(qb) + return qb + }).fetchAll() + }, + show: (id) => { + return new model({'id': id}).fetch() + }, + show_ids: (ids) => { + return model.query( (qb) => { + qb.whereIn('id', ids) + return qb + }).fetchAll() + }, + create: (data) => { + return new model(data).save() + }, + update: (id, data) => { + return new model({'id': id}).save(data) + }, + destroy: (id) => { + return new model({'id': id}).destroy(data) + }, + } +}
\ No newline at end of file diff --git a/lib/db/index.js b/lib/db/index.js index 1c7cc15..c89afc3 100644 --- a/lib/db/index.js +++ b/lib/db/index.js @@ -1,76 +1,5 @@ -var db = module.exports +let db = module.exports -var connection = require("./bookshelf") -var bookshelf = connection.bookshelf -var knex = connection.knex - -var Folder = db.Folder = bookshelf.Model.extend({ - tableName: 'folders', - hasTimestamps: true, -}) -var File = db.File = bookshelf.Model.extend({ - tableName: 'files', - hasTimestamps: true, -}) -var Job = db.Job = bookshelf.Model.extend({ - tableName: 'jobs', - hasTimestamps: true, -}) -var Task = db.Task = bookshelf.Model.extend({ - tableName: 'tasks', - hasTimestamps: true, -}) - -db.crud = function(model) { - return { - index: (q) => { - return model.query( (qb) => { - const limit = q.limit || 100 - const offset = q.offset || 0 - if (limit) { - delete q.limit - } - if (q.offset) { - delete q.offset - } - if (Object.keys(q).length > 0) qb.where(q) - qb.orderBy("id", "desc") - if (limit) qb.limit( limit ) - if (offset) qb.offset( offset ) - // console.log(qb) - return qb - }).fetchAll() - }, - show: (id) => { - return new model({'id': id}).fetch() - }, - show_ids: (ids) => { - return model.query( (qb) => { - qb.whereIn('id', ids) - return qb - }).fetchAll() - }, - create: (data) => { - return new model(data).save() - }, - update: (id, data) => { - return new model({'id': id}).save(data) - }, - destroy: (id) => { - return new model({'id': id}).destroy(data) - }, - } -} - -function memoize (f) { - const o = {} - return (model) => { - console.log(model) - t = model.toString() - if (o[t]) { - return o[t] - } - o[t] = f(model) - return o[t] - } -}
\ No newline at end of file +db.crud = require('./crud') +db.model = require('./model') +db.models = require('./models') diff --git a/lib/db/model.js b/lib/db/model.js new file mode 100644 index 0000000..f174656 --- /dev/null +++ b/lib/db/model.js @@ -0,0 +1,160 @@ +const Loader = require('../vendor/Loader') +const db_crud = require('./crud') + +module.exports = function modelScope(type, db_model, _props) { + + const props = Object.assign({ + hasOne: {}, + afterCreate: () => {}, + }, _props) + + const crud = db_crud(db_model) + + const model = { + type: type, + db_model: db_model, + crud: crud, + + index: (query) => { + + return new Promise( (resolve, reject) => { + crud.index(query).then( (data) => { + + if (! props.hasOne) { + resolve(data ? data.toJSON() : []) + } + else { + let recs = data.toJSON() + const loader = new Loader () + loader.onReady( () => { + console.log(type, 'ready') + resolve(recs) + }) + console.log('hasOne') + loader.register('hasOne') + Object.keys(props.hasOne).forEach( (key,i) => { + loader.register(key) + console.log('register', key) + const type = props.hasOne[key] + const id_lookup = {} + recs.forEach(r => { + const id = r[key + '_id'] + id_lookup[id] = id_lookup[id] || [] + id_lookup[id].push(r) + }) + // console.log('\n\n%%%%%%%%%%%%%%%%%%%%%%%% index > hasOne ' + key + '\n\n\n') + // console.log(recs.length, Object.keys(id_lookup).length) + db_crud(type).show_ids(Object.keys(id_lookup)).then( (sub_recs) => { + // console.log(key, 'sub_recs', sub_recs) + const short_key = key.replace('_id','') + sub_recs.toJSON().forEach(rec => { + id_lookup[rec.id].forEach( parent_rec => parent_rec[short_key] = rec ) + }) + console.log('ready', key) + loader.ready(key) + }) + }) + loader.ready('hasOne') + } + }) // }).catch( () => res.sendStatus(500) ) + }) + }, + + show: (id) => { + return new Promise( (resolve, reject) => { + crud.show(id).then( (data) => { + if (! props.hasOne) { + resolve(data.toJSON()) + } + else { + let rec = data.toJSON() + const loader = new Loader () + loader.onReady( () => { + resolve(rec) + }) + loader.register('hasOne') + Object.keys(props.hasOne).forEach( (key,i) => { + loader.register(key) + const type = props.hasOne[key] + db_crud(type).show(rec[key + '_id']).then( (sub_rec) => { + rec[key] = sub_rec + loader.ready(key) + }) + }) + loader.ready('hasOne') + } + }) // .catch( (err) => res.sendStatus(500) ) + }) + }, + + findOrCreate: (data) => { + return new Promise( (resolve, reject) => { + let query = Object.assign({}, data) + query.limit = 1 + crud.index(query).then( (recs) => { + if (recs && recs.length) { + const rec = recs.at(0) + console.log('found rec', data.name) + return resolve(rec) + } + console.log('creating rec', data.name) + model.create(data).then( (rec) => { + resolve(rec) + }) + }) + }) + }, + + create: (data) => { + return new Promise( (resolve, reject) => { + crud.create( model.sanitize(data) ).then( (data) => { + console.log('yooooooo') + resolve(data.toJSON()) + props.afterCreate && props.afterCreate(data) + }).catch( (e) => { + console.error('error creating', e) + reject() + }) + }) + }, + + update: (id, data) => { + console.log('update', id) + return new Promise( (resolve, reject) => { + crud.update(id, model.sanitize(data)).then( (data) => { + resolve(data.toJSON()) + }).catch( (e) => { + console.error('error updating', e) + reject() + }) + }) + }, + + destroy: (id) => { + return new Promise( (resolve, reject) => { + crud.destroy(id).then( (data) => { + res.json(data.toJSON()) + })// .catch( () => res.sendStatus(500) ) + }) + }, + + sanitize: (data) => { + var valid = {} + console.log('yooooooo') + Object.keys(data).forEach(key => { + console.log('yooooooo2', key) + if (props.hasOne[key]) { + return + } + console.log('yooooooo3') + valid[key] = data[key] + }) + console.log('yooooooo4') + console.log(valid) + return valid + }, + + } + + return model +} diff --git a/lib/db/models.js b/lib/db/models.js new file mode 100644 index 0000000..588ce58 --- /dev/null +++ b/lib/db/models.js @@ -0,0 +1,43 @@ + +let fs = require('fs') +let model = require('./model') + +let connection = require("./bookshelf") +let bookshelf = connection.bookshelf +let knex = connection.knex + +let Folder = bookshelf.Model.extend({ + tableName: 'folders', + hasTimestamps: true, +}) +let File = bookshelf.Model.extend({ + tableName: 'files', + hasTimestamps: true, +}) +let Job = bookshelf.Model.extend({ + tableName: 'jobs', + hasTimestamps: true, +}) +let Task = bookshelf.Model.extend({ + tableName: 'tasks', + hasTimestamps: true, +}) + +module.exports = { + folder: model('folder', Folder, { + afterCreate: (folder) => { + fs.mkdir('data/' + folder.get('id') + '/', function(){ + console.log('created folder', folder.get('id'), folder.get('name')) + }) + } + }), + file: model('file', File), + job: model('job', Job), + task: model('task', Task, { + hasOne: { + content_file: File, + style_file: File, + output_file: File, + } + }), +} |
