Compare commits
9 Commits
Author | SHA1 | Date | |
---|---|---|---|
ce1dceb60c | |||
16add8bff0 | |||
11149b2712 | |||
e508a942e3 | |||
5b093c68e4 | |||
d1b0a65993 | |||
316030be7c | |||
411b0b1ae9 | |||
50a6a1a690 |
59
README.md
59
README.md
@ -2,3 +2,62 @@
|
|||||||
|
|
||||||
smartdata is a ODM that adheres to TypeScript practices and uses classes to organize data.
|
smartdata is a ODM that adheres to TypeScript practices and uses classes to organize data.
|
||||||
It uses MongoDB as persistent storage.
|
It uses MongoDB as persistent storage.
|
||||||
|
|
||||||
|
## Intention
|
||||||
|
There are many ODMs out there, however when we searched for a ODM that uses TypeScript,
|
||||||
|
acts smart while still embracing an easy the NoSQL idea we didn't find a matching solution.
|
||||||
|
This is why we started smartdata
|
||||||
|
|
||||||
|
How MongoDB terms map to smartdata classes
|
||||||
|
|
||||||
|
MongoDB term | smartdata class
|
||||||
|
--- | ---
|
||||||
|
Database | smartdata.Db
|
||||||
|
Collection | smartdata.DbCollection
|
||||||
|
Document | smartdata.DbDoc
|
||||||
|
|
||||||
|
### class Db
|
||||||
|
represents a Database. Naturally it has .connect() etc. methods on it.
|
||||||
|
Since it is a class you can have multiple DBs defined.
|
||||||
|
```TypeScript
|
||||||
|
import * as smartdata from 'smartdata'
|
||||||
|
|
||||||
|
let myDb1 = new smartdata.Db('someConnectionUrl')
|
||||||
|
let myDb2 = new smartdata.Db('someConnectionUrl')
|
||||||
|
|
||||||
|
myDb1.connect()
|
||||||
|
myDb2.connect()
|
||||||
|
```
|
||||||
|
|
||||||
|
### class Collection
|
||||||
|
represents a collection of objects.
|
||||||
|
A collection is defined by the object class (that is extending smartdata.dbdoc) it respresents
|
||||||
|
|
||||||
|
So to get to get access to a specific collection you document
|
||||||
|
```
|
||||||
|
class myObject extends DbDoc {
|
||||||
|
property1:string
|
||||||
|
property2:number
|
||||||
|
constructor(optionsArg:{
|
||||||
|
queryArg?:any,
|
||||||
|
dataArg?:{
|
||||||
|
property1:string,
|
||||||
|
property2:string
|
||||||
|
}
|
||||||
|
}) {
|
||||||
|
super(this,optionsArg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let myCollection = myDb1.getCollection(myObject)
|
||||||
|
```
|
||||||
|
|
||||||
|
> Alert: You NEVER instantiate a collection.
|
||||||
|
This is done for you!!!
|
||||||
|
|
||||||
|
### class DbDoc
|
||||||
|
represents a individual document in a collection.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[](https://push.rocks)
|
||||||
|
14
dist/smartdata.classes.dbcollection.d.ts
vendored
14
dist/smartdata.classes.dbcollection.d.ts
vendored
@ -1,3 +1,4 @@
|
|||||||
|
/// <reference types="q" />
|
||||||
import * as plugins from './smartdata.plugins';
|
import * as plugins from './smartdata.plugins';
|
||||||
import { DbConnection } from './smartdata.classes.dbconnection';
|
import { DbConnection } from './smartdata.classes.dbconnection';
|
||||||
export declare class DbCollection<T> {
|
export declare class DbCollection<T> {
|
||||||
@ -6,13 +7,18 @@ export declare class DbCollection<T> {
|
|||||||
/**
|
/**
|
||||||
* adds a validation function that all newly inserted and updated objects have to pass
|
* adds a validation function that all newly inserted and updated objects have to pass
|
||||||
*/
|
*/
|
||||||
addObjectValidation(): void;
|
addObjectValidation(funcArg: any): void;
|
||||||
/**
|
/**
|
||||||
* inserts am object into the DbCollection
|
* finds an object in the DbCollection
|
||||||
*/
|
*/
|
||||||
insert(objectArg: T): void;
|
find(docMatchArg: T | any): plugins.q.Promise<T[]>;
|
||||||
|
/**
|
||||||
|
* inserts object into the DbCollection
|
||||||
|
*/
|
||||||
|
insertOne(docArg: T): plugins.q.Promise<void>;
|
||||||
/**
|
/**
|
||||||
* inserts many objects at once into the DbCollection
|
* inserts many objects at once into the DbCollection
|
||||||
*/
|
*/
|
||||||
insertMany(objectArrayArg: T[]): void;
|
insertMany(docArrayArg: T[]): plugins.q.Promise<void>;
|
||||||
|
private checkDoc(doc);
|
||||||
}
|
}
|
||||||
|
47
dist/smartdata.classes.dbcollection.js
vendored
47
dist/smartdata.classes.dbcollection.js
vendored
@ -1,4 +1,5 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
const plugins = require('./smartdata.plugins');
|
||||||
class DbCollection {
|
class DbCollection {
|
||||||
constructor(nameArg, dbConnectionArg) {
|
constructor(nameArg, dbConnectionArg) {
|
||||||
this.collection = dbConnectionArg.db.collection(nameArg);
|
this.collection = dbConnectionArg.db.collection(nameArg);
|
||||||
@ -6,15 +7,51 @@ class DbCollection {
|
|||||||
/**
|
/**
|
||||||
* adds a validation function that all newly inserted and updated objects have to pass
|
* adds a validation function that all newly inserted and updated objects have to pass
|
||||||
*/
|
*/
|
||||||
addObjectValidation() { }
|
addObjectValidation(funcArg) { }
|
||||||
/**
|
/**
|
||||||
* inserts am object into the DbCollection
|
* finds an object in the DbCollection
|
||||||
*/
|
*/
|
||||||
insert(objectArg) { }
|
find(docMatchArg) {
|
||||||
|
let done = plugins.q.defer();
|
||||||
|
this.collection.find(docMatchArg).toArray((err, docs) => {
|
||||||
|
if (err) {
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
done.resolve(docs);
|
||||||
|
});
|
||||||
|
return done.promise;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* inserts object into the DbCollection
|
||||||
|
*/
|
||||||
|
insertOne(docArg) {
|
||||||
|
let done = plugins.q.defer();
|
||||||
|
this.checkDoc(docArg).then(() => {
|
||||||
|
this.collection.insertOne(docArg)
|
||||||
|
.then(() => { done.resolve(); });
|
||||||
|
});
|
||||||
|
return done.promise;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* inserts many objects at once into the DbCollection
|
* inserts many objects at once into the DbCollection
|
||||||
*/
|
*/
|
||||||
insertMany(objectArrayArg) { }
|
insertMany(docArrayArg) {
|
||||||
|
let done = plugins.q.defer();
|
||||||
|
let checkDocPromiseArray = [];
|
||||||
|
for (let docArg of docArrayArg) {
|
||||||
|
checkDocPromiseArray.push(this.checkDoc(docArg));
|
||||||
|
}
|
||||||
|
plugins.q.all(checkDocPromiseArray).then(() => {
|
||||||
|
this.collection.insertMany(docArrayArg)
|
||||||
|
.then(() => { done.resolve(); });
|
||||||
|
});
|
||||||
|
return done.promise;
|
||||||
|
}
|
||||||
|
checkDoc(doc) {
|
||||||
|
let done = plugins.q.defer();
|
||||||
|
done.resolve();
|
||||||
|
return done.promise;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
exports.DbCollection = DbCollection;
|
exports.DbCollection = DbCollection;
|
||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRkYXRhLmNsYXNzZXMuZGJjb2xsZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRkYXRhLmNsYXNzZXMuZGJjb2xsZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFHQTtJQUVJLFlBQVksT0FBZSxFQUFFLGVBQTZCO1FBQ3RELElBQUksQ0FBQyxVQUFVLEdBQUcsZUFBZSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDNUQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsbUJBQW1CLEtBQUcsQ0FBQztJQUV2Qjs7T0FFRztJQUNILE1BQU0sQ0FBQyxTQUFZLElBQUcsQ0FBQztJQUV2Qjs7T0FFRztJQUNILFVBQVUsQ0FBQyxjQUFtQixJQUFHLENBQUM7QUFDdEMsQ0FBQztBQXBCWSxvQkFBWSxlQW9CeEIsQ0FBQSJ9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRkYXRhLmNsYXNzZXMuZGJjb2xsZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRkYXRhLmNsYXNzZXMuZGJjb2xsZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxNQUFZLE9BQU8sV0FBTSxxQkFDekIsQ0FBQyxDQUQ2QztBQUc5QztJQUVJLFlBQVksT0FBZSxFQUFFLGVBQTZCO1FBQ3RELElBQUksQ0FBQyxVQUFVLEdBQUcsZUFBZSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDNUQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsbUJBQW1CLENBQUMsT0FBTyxJQUFJLENBQUM7SUFFaEM7O09BRUc7SUFDSCxJQUFJLENBQUMsV0FBb0I7UUFDckIsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQU8sQ0FBQTtRQUNqQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSTtZQUNoRCxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUFDLE1BQU0sR0FBRyxDQUFBO1lBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3RCLENBQUMsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUE7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsU0FBUyxDQUFDLE1BQVM7UUFDZixJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBUSxDQUFBO1FBQ2xDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztpQkFDNUIsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDdkMsQ0FBQyxDQUFDLENBQUE7UUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQTtJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVLENBQUMsV0FBZ0I7UUFDdkIsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQVEsQ0FBQTtRQUNsQyxJQUFJLG9CQUFvQixHQUE4QixFQUFFLENBQUE7UUFDeEQsR0FBRyxDQUFDLENBQUMsSUFBSSxNQUFNLElBQUksV0FBVyxDQUFDLENBQUEsQ0FBQztZQUM1QixvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO1FBQ3BELENBQUM7UUFDRCxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNyQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUM7aUJBQ2xDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3ZDLENBQUMsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUE7SUFDdkIsQ0FBQztJQUVPLFFBQVEsQ0FBQyxHQUFNO1FBQ25CLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFRLENBQUE7UUFDbEMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQ2QsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUE7SUFDdkIsQ0FBQztBQUNMLENBQUM7QUF4RFksb0JBQVksZUF3RHhCLENBQUEifQ==
|
19
docs/index.md
Normal file
19
docs/index.md
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
# smartdata
|
||||||
|
|
||||||
|
smartdata is a ODM that adheres to TypeScript practices and uses classes to organize data.
|
||||||
|
It uses MongoDB as persistent storage.
|
||||||
|
|
||||||
|
## Intention
|
||||||
|
There are many ODMs out there, however when we searched for a ODM that uses TypeScript,
|
||||||
|
acts smart while still embracing an easy the NoSQL idea we didn't find a matching solution.
|
||||||
|
This is why we started smartdata
|
||||||
|
|
||||||
|
How MongoDB terms map to smartdata classes
|
||||||
|
|
||||||
|
MongoDB term | smartdata class
|
||||||
|
--- | ---
|
||||||
|
Database | smartdata.DbConnection
|
||||||
|
Collection | smartdata.DbCollection
|
||||||
|
Document | smartdata.DbDoc
|
||||||
|
|
||||||
|
[](https://push.rocks)
|
@ -1,11 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "smartdata",
|
"name": "smartdata",
|
||||||
"version": "1.0.5",
|
"version": "1.0.8",
|
||||||
"description": "do more with data",
|
"description": "do more with data",
|
||||||
"main": "dist/index.js",
|
"main": "dist/index.js",
|
||||||
"typings": "dist/index.d.ts",
|
"typings": "dist/index.d.ts",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "(npmts)"
|
"test": "(npm run prepareMongo && npmts)",
|
||||||
|
"prepareMongo": "(rm -rf ./test/data && mkdir ./test/data/)"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@ -30,6 +31,7 @@
|
|||||||
"@types/should": "^8.1.29",
|
"@types/should": "^8.1.29",
|
||||||
"shelljs": "^0.7.4",
|
"shelljs": "^0.7.4",
|
||||||
"should": "^11.1.0",
|
"should": "^11.1.0",
|
||||||
|
"smartstring": "^2.0.17",
|
||||||
"typings-test": "^1.0.3"
|
"typings-test": "^1.0.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
52
test/test.js
52
test/test.js
@ -1,15 +1,27 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
require('typings-test');
|
require('typings-test');
|
||||||
const shelljs = require('shelljs');
|
const shelljs = require('shelljs');
|
||||||
|
const should = require('should');
|
||||||
|
const smartstring = require('smartstring');
|
||||||
|
// the tested module
|
||||||
const smartdata = require('../dist/index');
|
const smartdata = require('../dist/index');
|
||||||
let mongoChildProcess;
|
let mongoChildProcess;
|
||||||
let testDbConnection;
|
let testDbConnection;
|
||||||
let testDbCollection;
|
let testDbCollection;
|
||||||
describe('mongodb', function () {
|
describe('mongodb', function () {
|
||||||
it('should start mongodb', function (done) {
|
it('should start mongodb', function (done) {
|
||||||
this.timeout(10000);
|
this.timeout(30000);
|
||||||
mongoChildProcess = shelljs.exec('mongod --dbpath=./test/data --port 27017', { async: true });
|
mongoChildProcess = shelljs.exec('mongod --dbpath=./test/data --port 27017', { async: true, silent: true });
|
||||||
setTimeout(() => { done(); }, 5000); // give mongodb it some time to complete startup
|
let doneCalled = false;
|
||||||
|
mongoChildProcess.stdout.on('data', function (data) {
|
||||||
|
console.log(smartstring.indent.indentWithPrefix(data, "*** MongoDB Process *** : "));
|
||||||
|
if (!doneCalled) {
|
||||||
|
if (/waiting for connections on port 27017/.test(data)) {
|
||||||
|
doneCalled = true;
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
describe('smartdata', function () {
|
describe('smartdata', function () {
|
||||||
@ -20,15 +32,43 @@ describe('smartdata', function () {
|
|||||||
it('should create a collection', function () {
|
it('should create a collection', function () {
|
||||||
testDbCollection = new smartdata.DbCollection('something', testDbConnection);
|
testDbCollection = new smartdata.DbCollection('something', testDbConnection);
|
||||||
});
|
});
|
||||||
|
it('should insert a doc into the collection', function (done) {
|
||||||
|
testDbCollection.insertOne({ value1: 'test' }).then(() => { done(); });
|
||||||
|
});
|
||||||
|
it('should find all docs of testDbCollection', function (done) {
|
||||||
|
testDbCollection.find({}).then((resultArray) => {
|
||||||
|
console.log(resultArray);
|
||||||
|
should(resultArray[0].value1).equal('test');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it('should insert many docs into the collection', function (done) {
|
||||||
|
testDbCollection.insertMany([
|
||||||
|
{ value1: 'test2' },
|
||||||
|
{ value1: 'test', value2: 3, value3: 'hi' }
|
||||||
|
]).then(() => { done(); });
|
||||||
|
});
|
||||||
|
it('should find a specified doc', function (done) {
|
||||||
|
testDbCollection.find({ 'value3': { '$exists': true } }).then((resultArray) => {
|
||||||
|
console.log(resultArray);
|
||||||
|
should(resultArray[0].value3).equal('hi');
|
||||||
|
done();
|
||||||
|
}).catch(console.log);
|
||||||
|
});
|
||||||
it('should close the db Connection', function () {
|
it('should close the db Connection', function () {
|
||||||
testDbConnection.close();
|
testDbConnection.close();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
describe('mongodb', function () {
|
describe('mongodb', function () {
|
||||||
it('should kill mongodb', function () {
|
it('should kill mongodb', function (done) {
|
||||||
this.timeout(10000);
|
this.timeout(30000);
|
||||||
|
mongoChildProcess.stdout.on('data', function (data) {
|
||||||
|
if (/dbexit: rc: 0/.test(data)) {
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
});
|
||||||
shelljs.exec('mongod --dbpath=./test/data --shutdown');
|
shelljs.exec('mongod --dbpath=./test/data --shutdown');
|
||||||
mongoChildProcess.kill('SIGTERM');
|
mongoChildProcess.kill('SIGTERM');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLFFBQU8sY0FDUCxDQUFDLENBRG9CO0FBQ3JCLE1BQVksT0FBTyxXQUFNLFNBQ3pCLENBQUMsQ0FEaUM7QUFFbEMsTUFBWSxTQUFTLFdBQU0sZUFHM0IsQ0FBQyxDQUh5QztBQUcxQyxJQUFJLGlCQUFpQixDQUFBO0FBQ3JCLElBQUksZ0JBQXdDLENBQUE7QUFDNUMsSUFBSSxnQkFBNkMsQ0FBQTtBQUdqRCxRQUFRLENBQUMsU0FBUyxFQUFDO0lBQ2YsRUFBRSxDQUFDLHNCQUFzQixFQUFDLFVBQVMsSUFBSTtRQUNuQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ25CLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsMENBQTBDLEVBQUMsRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtRQUMxRixVQUFVLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQSxDQUFDLGdEQUFnRDtJQUN2RixDQUFDLENBQUMsQ0FBQTtBQUNOLENBQUMsQ0FBQyxDQUFBO0FBQ0YsUUFBUSxDQUFDLFdBQVcsRUFBQztJQUNqQixFQUFFLENBQUMsMENBQTBDLEVBQUMsVUFBUyxJQUFJO1FBQ3ZELGdCQUFnQixHQUFHLElBQUksU0FBUyxDQUFDLFlBQVksQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFBO1FBQ3BGLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDckQsQ0FBQyxDQUFDLENBQUE7SUFDRixFQUFFLENBQUMsNEJBQTRCLEVBQUM7UUFDNUIsZ0JBQWdCLEdBQUcsSUFBSSxTQUFTLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBQyxnQkFBZ0IsQ0FBQyxDQUFBO0lBQy9FLENBQUMsQ0FBQyxDQUFBO0lBQ0YsRUFBRSxDQUFDLGdDQUFnQyxFQUFDO1FBQ2hDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFBO0lBQzVCLENBQUMsQ0FBQyxDQUFBO0FBQ04sQ0FBQyxDQUFDLENBQUE7QUFFRixRQUFRLENBQUMsU0FBUyxFQUFDO0lBQ2YsRUFBRSxDQUFDLHFCQUFxQixFQUFDO1FBQ3JCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDbkIsT0FBTyxDQUFDLElBQUksQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFBO1FBQ3RELGlCQUFpQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUNyQyxDQUFDLENBQUMsQ0FBQTtBQUNOLENBQUMsQ0FBQyxDQUFBIn0=
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLFFBQU8sY0FFUCxDQUFDLENBRm9CO0FBRXJCLE1BQVksT0FBTyxXQUFNLFNBQ3pCLENBQUMsQ0FEaUM7QUFDbEMsTUFBWSxNQUFNLFdBQU0sUUFDeEIsQ0FBQyxDQUQrQjtBQUNoQyxNQUFZLFdBQVcsV0FBTSxhQUc3QixDQUFDLENBSHlDO0FBRTFDLG9CQUFvQjtBQUNwQixNQUFZLFNBQVMsV0FBTSxlQUUzQixDQUFDLENBRnlDO0FBRTFDLElBQUksaUJBQWlCLENBQUE7QUFDckIsSUFBSSxnQkFBd0MsQ0FBQTtBQVE1QyxJQUFJLGdCQUFzRCxDQUFBO0FBSTFELFFBQVEsQ0FBQyxTQUFTLEVBQUU7SUFDaEIsRUFBRSxDQUFDLHNCQUFzQixFQUFFLFVBQVUsSUFBSTtRQUNyQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ25CLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsMENBQTBDLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQzNHLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQTtRQUN0QixpQkFBaUIsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxVQUFVLElBQUk7WUFDOUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSw0QkFBNEIsQ0FBQyxDQUFDLENBQUE7WUFDcEYsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUNkLEVBQUUsQ0FBQyxDQUFDLHVDQUF1QyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3JELFVBQVUsR0FBRyxJQUFJLENBQUE7b0JBQ2pCLElBQUksRUFBRSxD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
|
71
test/test.ts
71
test/test.ts
@ -1,28 +1,78 @@
|
|||||||
import 'typings-test'
|
import 'typings-test'
|
||||||
|
|
||||||
import * as shelljs from 'shelljs'
|
import * as shelljs from 'shelljs'
|
||||||
import * as should from 'should'
|
import * as should from 'should'
|
||||||
import * as smartdata from '../dist/index'
|
import * as smartstring from 'smartstring'
|
||||||
|
|
||||||
|
// the tested module
|
||||||
|
import * as smartdata from '../dist/index'
|
||||||
|
|
||||||
let mongoChildProcess
|
let mongoChildProcess
|
||||||
let testDbConnection: smartdata.DbConnection
|
let testDbConnection: smartdata.DbConnection
|
||||||
let testDbCollection: smartdata.DbCollection<any>
|
|
||||||
|
interface ITestObject1 {
|
||||||
|
value1: string
|
||||||
|
value2?: number
|
||||||
|
value3?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
let testDbCollection: smartdata.DbCollection<ITestObject1>
|
||||||
|
|
||||||
|
class testCar {
|
||||||
|
color: string
|
||||||
|
constructor(colorArg:string) {
|
||||||
|
this.color = colorArg
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
describe('mongodb', function () {
|
describe('mongodb', function () {
|
||||||
it('should start mongodb', function (done) {
|
it('should start mongodb', function (done) {
|
||||||
this.timeout(10000)
|
this.timeout(30000)
|
||||||
mongoChildProcess = shelljs.exec('mongod --dbpath=./test/data --port 27017',{async: true})
|
mongoChildProcess = shelljs.exec('mongod --dbpath=./test/data --port 27017', { async: true, silent: true })
|
||||||
setTimeout(() => { done() }, 5000) // give mongodb it some time to complete startup
|
let doneCalled = false
|
||||||
|
mongoChildProcess.stdout.on('data', function (data) {
|
||||||
|
console.log(smartstring.indent.indentWithPrefix(data, "*** MongoDB Process *** : "))
|
||||||
|
if (!doneCalled) {
|
||||||
|
if (/waiting for connections on port 27017/.test(data)) {
|
||||||
|
doneCalled = true
|
||||||
|
done()
|
||||||
|
}
|
||||||
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
})
|
||||||
|
|
||||||
describe('smartdata', function () {
|
describe('smartdata', function () {
|
||||||
it('should establish a connection to mongodb', function (done) {
|
it('should establish a connection to mongodb', function (done) {
|
||||||
testDbConnection = new smartdata.DbConnection('mongodb://localhost:27017/smartdata')
|
testDbConnection = new smartdata.DbConnection('mongodb://localhost:27017/smartdata')
|
||||||
testDbConnection.connect().then(() => { done() })
|
testDbConnection.connect().then(() => { done() })
|
||||||
})
|
})
|
||||||
it('should create a collection', function () {
|
it('should create a collection', function () {
|
||||||
testDbCollection = new smartdata.DbCollection('something',testDbConnection)
|
testDbCollection = new smartdata.DbCollection<ITestObject1>('something', testDbConnection)
|
||||||
|
})
|
||||||
|
it('should insert a doc into the collection', function (done) {
|
||||||
|
testDbCollection.insertOne({ value1: 'test' }).then(() => { done() })
|
||||||
|
})
|
||||||
|
it('should find all docs of testDbCollection', function (done) {
|
||||||
|
testDbCollection.find({}).then((resultArray) => {
|
||||||
|
console.log(resultArray)
|
||||||
|
should(resultArray[0].value1).equal('test')
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
it('should insert many docs into the collection', function (done) {
|
||||||
|
testDbCollection.insertMany([
|
||||||
|
{ value1: 'test2' },
|
||||||
|
{ value1: 'test', value2: 3, value3: 'hi' }
|
||||||
|
]).then(() => { done() })
|
||||||
|
})
|
||||||
|
it('should find a specified doc', function (done) {
|
||||||
|
testDbCollection.find({'value3': {'$exists': true}}).then((resultArray) => {
|
||||||
|
console.log(resultArray)
|
||||||
|
should(resultArray[0].value3).equal('hi')
|
||||||
|
done()
|
||||||
|
}).catch(console.log)
|
||||||
})
|
})
|
||||||
it('should close the db Connection', function () {
|
it('should close the db Connection', function () {
|
||||||
testDbConnection.close()
|
testDbConnection.close()
|
||||||
@ -30,8 +80,13 @@ describe('smartdata',function(){
|
|||||||
})
|
})
|
||||||
|
|
||||||
describe('mongodb', function () {
|
describe('mongodb', function () {
|
||||||
it('should kill mongodb',function(){
|
it('should kill mongodb', function (done) {
|
||||||
this.timeout(10000)
|
this.timeout(30000)
|
||||||
|
mongoChildProcess.stdout.on('data', function (data) {
|
||||||
|
if (/dbexit: rc: 0/.test(data)) {
|
||||||
|
done()
|
||||||
|
}
|
||||||
|
})
|
||||||
shelljs.exec('mongod --dbpath=./test/data --shutdown')
|
shelljs.exec('mongod --dbpath=./test/data --shutdown')
|
||||||
mongoChildProcess.kill('SIGTERM')
|
mongoChildProcess.kill('SIGTERM')
|
||||||
})
|
})
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import * as plugins from './smartdata.plugins'
|
import * as plugins from './smartdata.plugins'
|
||||||
|
|
||||||
export * from './smartdata.classes.dbcollection'
|
export * from './smartdata.classes.dbcollection'
|
||||||
export * from './smartdata.classes.dbconnection'
|
export * from './smartdata.classes.db'
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
import * as plugins from './smartdata.plugins'
|
import * as plugins from './smartdata.plugins'
|
||||||
|
|
||||||
export type TDbConnectionStatus = 'disconnected' | 'connected' | 'failed'
|
export type TConnectionStatus = 'disconnected' | 'connected' | 'failed'
|
||||||
|
|
||||||
export class DbConnection {
|
export class Db {
|
||||||
dbUrl: string
|
dbUrl: string
|
||||||
db: plugins.mongodb.Db
|
db: plugins.mongodb.Db
|
||||||
status: TDbConnectionStatus
|
status: TConnectionStatus
|
||||||
|
|
||||||
constructor(dbUrl: string) {
|
constructor(dbUrl: string) {
|
||||||
this.dbUrl = dbUrl
|
this.dbUrl = dbUrl
|
@ -1,24 +1,60 @@
|
|||||||
import * as plugins from './smartdata.plugins'
|
import * as plugins from './smartdata.plugins'
|
||||||
import { DbConnection } from './smartdata.classes.dbconnection'
|
import { Db } from './smartdata.classes.db'
|
||||||
|
|
||||||
export class DbCollection<T> {
|
export class DbCollection<T> {
|
||||||
collection: plugins.mongodb.Collection
|
collection: plugins.mongodb.Collection
|
||||||
constructor(nameArg: string, dbConnectionArg: DbConnection) {
|
constructor(nameArg: string, dbArg: Db) {
|
||||||
this.collection = dbConnectionArg.db.collection(nameArg)
|
this.collection = dbArg.db.collection(nameArg)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* adds a validation function that all newly inserted and updated objects have to pass
|
* adds a validation function that all newly inserted and updated objects have to pass
|
||||||
*/
|
*/
|
||||||
addObjectValidation(){}
|
addObjectValidation(funcArg) { }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* inserts am object into the DbCollection
|
* finds an object in the DbCollection
|
||||||
*/
|
*/
|
||||||
insert(objectArg: T) {}
|
find(docMatchArg: T | any): plugins.q.Promise<T[]> {
|
||||||
|
let done = plugins.q.defer<T[]>()
|
||||||
|
this.collection.find(docMatchArg).toArray((err, docs) => {
|
||||||
|
if (err) { throw err }
|
||||||
|
done.resolve(docs)
|
||||||
|
})
|
||||||
|
return done.promise
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* inserts object into the DbCollection
|
||||||
|
*/
|
||||||
|
insertOne(docArg: T): plugins.q.Promise<void> {
|
||||||
|
let done = plugins.q.defer<void>()
|
||||||
|
this.checkDoc(docArg).then(() => {
|
||||||
|
this.collection.insertOne(docArg)
|
||||||
|
.then(() => { done.resolve() })
|
||||||
|
})
|
||||||
|
return done.promise
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* inserts many objects at once into the DbCollection
|
* inserts many objects at once into the DbCollection
|
||||||
*/
|
*/
|
||||||
insertMany(objectArrayArg: T[]) {}
|
insertMany(docArrayArg: T[]): plugins.q.Promise<void> {
|
||||||
|
let done = plugins.q.defer<void>()
|
||||||
|
let checkDocPromiseArray: plugins.q.Promise<void>[] = []
|
||||||
|
for (let docArg of docArrayArg){
|
||||||
|
checkDocPromiseArray.push(this.checkDoc(docArg))
|
||||||
|
}
|
||||||
|
plugins.q.all(checkDocPromiseArray).then(() => {
|
||||||
|
this.collection.insertMany(docArrayArg)
|
||||||
|
.then(() => { done.resolve() })
|
||||||
|
})
|
||||||
|
return done.promise
|
||||||
|
}
|
||||||
|
|
||||||
|
private checkDoc(doc: T): plugins.q.Promise<void> {
|
||||||
|
let done = plugins.q.defer<void>()
|
||||||
|
done.resolve()
|
||||||
|
return done.promise
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user