summaryrefslogtreecommitdiff
path: root/lib/db
diff options
context:
space:
mode:
authorJules Laplace <julescarbon@gmail.com>2017-07-19 00:50:05 +0200
committerJules Laplace <julescarbon@gmail.com>2017-07-19 00:50:05 +0200
commit64e8c03dea044752bf3f2f228462721fe565f950 (patch)
tree41b48b67f69979bfc97be166129ee41c8dcb0c7f /lib/db
parent11a70bc347587219b2ec7b63cf4a6ff69bb4199b (diff)
refactor all the worker stuff
Diffstat (limited to 'lib/db')
-rw-r--r--lib/db/crud.js40
-rw-r--r--lib/db/index.js79
-rw-r--r--lib/db/model.js160
-rw-r--r--lib/db/models.js43
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,
+ }
+ }),
+}