'use strict';
const flatten = require('flat');
const ObjectId = require('./object_id');
/**
* proxy for creating new loki documents
*
* @class lowkieSchema
*/
class lowkieSchema {
constructor(scheme, lowkieSingleton) {
this.scheme = scheme;
this.flattenedScheme = flatten(scheme);
this.validNames = Object.keys(scheme);
this.lowkie = lowkieSingleton;
this.createDoc = this.createDocument.bind(this);
this.validNames.push('_id');
// console.log(this.lowkie.config);
// this.properties = properties;
return this;
}
/**
* returns validated document for lokijs
*
* @param {any} doc
* @returns object
*
* @memberOf lowkieSchema
*/
createDocument(doc) {
let newDoc = Object.assign({
_id: ObjectId.createId(),
}, doc);
let validDoc = this.validNames.reduce((result, key) => {
// if (this.lowkie.config.strictSchemas) {
// if (typeof newDoc[ key ] === 'string' && (this.scheme[ key ] !== String || (this.scheme[key].type !== String))) {
// throw new Error(`${key} (${newDoc[ key ] } - ${typeof newDoc[ key ]}) must be a valid String`);
// }
// }
if (newDoc[ key ]) {
if (typeof newDoc[ key ] === 'string' && this.scheme[ key ] === String) {
result[ key ] = newDoc[ key ].toString();
} else if (this.scheme[ key ] === Boolean) {
result[ key ] = (newDoc[ key ]) ? true : false;
} else if (this.scheme[ key ] === Number) {
result[ key ] = Number(newDoc[ key ]);
} else if (typeof newDoc[ key ] === 'object') {
result[ key ] = newDoc[ key ];
} else {
result[ key ] = newDoc[ key ];
}
}
return result;
}, {});
return validDoc;
}
/**
* overwrites the default insert method
*
* @param {any} options
* @returns Promise
*
* @memberOf lowkieSchema
*/
insert(options = {}) {
let lokiCollectionInsert = options.target;
let lowkieInstance = options.thisArg;
let lowkieDocument = options.argumentsList;
// let { target, thisArg, argumentsList, } = options;
return new Promise((resolve, reject) => {
try {
let newDoc = (Array.isArray(lowkieDocument))
? lowkieDocument.map(lowkiedoc=>this.createDoc(lowkiedoc))
: this.createDoc(lowkieDocument);
lokiCollectionInsert.call(lowkieInstance, newDoc);
this.lowkie.db.saveDatabase((err) => {
if (err) reject(err);
else return resolve(newDoc);
});
} catch (e) {
reject(e);
}
});
}
}
/**
* schema data types
*/
lowkieSchema.Types = {
String,
Buffer,
Date,
Number,
ObjectId,
Array,
Mixed:Object,
};
module.exports = lowkieSchema;