Compare commits
38 Commits
Author | SHA1 | Date | |
---|---|---|---|
67db1325c1 | |||
6683c05c22 | |||
f7f7852b7f | |||
df4346e0a2 | |||
eb54fbcd0d | |||
f13c12cd47 | |||
08d53f22f5 | |||
5b6523e6f4 | |||
138290a7b8 | |||
036cafc282 | |||
7764ba5cb8 | |||
7f77634ea1 | |||
acf3c29939 | |||
925cd639b4 | |||
af8de58dcd | |||
f39703b8d9 | |||
fa1951b4dd | |||
8c37a367a0 | |||
37f388e998 | |||
78bdb6760e | |||
ce1dceb60c | |||
16add8bff0 | |||
11149b2712 | |||
e508a942e3 | |||
5b093c68e4 | |||
d1b0a65993 | |||
316030be7c | |||
411b0b1ae9 | |||
50a6a1a690 | |||
ee3c3580d3 | |||
6dd82994a6 | |||
295096de24 | |||
50b5f84955 | |||
1557c713cd | |||
4ce457fadf | |||
56d6e0fd45 | |||
89ebf23d46 | |||
a861444c30 |
83
README.md
Normal file
83
README.md
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
# smartdata
|
||||||
|
|
||||||
|
> Note: Still in Beta
|
||||||
|
|
||||||
|
smartdata is an 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 an ODM that uses TypeScript,
|
||||||
|
acts smart while still embracing an 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()
|
||||||
|
|
||||||
|
// continues in next block...
|
||||||
|
```
|
||||||
|
|
||||||
|
### class DbCollection
|
||||||
|
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
|
||||||
|
```typescript
|
||||||
|
// continues from the block before...
|
||||||
|
|
||||||
|
@Collection(myDb1)
|
||||||
|
class myObject extends smartdata.DbDoc { // read the next block about DbDoc
|
||||||
|
property1:string
|
||||||
|
property2:number
|
||||||
|
constructor(optionsArg:{
|
||||||
|
property1:string,
|
||||||
|
property2:number
|
||||||
|
}) {
|
||||||
|
super()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let myCollection = myDb1.getCollectionByName<myObject>(myObject)
|
||||||
|
```
|
||||||
|
|
||||||
|
> Alert: You NEVER instantiate a collection.
|
||||||
|
This is done for you!!!
|
||||||
|
|
||||||
|
### class DbDoc
|
||||||
|
represents a individual document in a collection
|
||||||
|
and thereby is ideally suited to extend the class you want to actually store.
|
||||||
|
|
||||||
|
DbDoc extends your class with the following methods:
|
||||||
|
|
||||||
|
* `.save()` will save (or update) the object you call it on only. Any referenced non-savable objects will not get stored.
|
||||||
|
* `.saveDeep()` does the same like `.save()`.
|
||||||
|
In addition it will look for properties that reference an object
|
||||||
|
that extends DbDoc as well and call .saveDeep() on them as well.
|
||||||
|
Loops are prevented
|
||||||
|
|
||||||
|
So now we can **store** instances of classes to Db...
|
||||||
|
How do we **get** a new class instance from a Doc in the DB?
|
||||||
|
|
||||||
|
## TypeScript
|
||||||
|
How does TypeScript play into this?
|
||||||
|
Since you define your classes in TypeScript and types flow through smartdata in a generic way
|
||||||
|
you should get all the Intellisense and type checking you love when using smartdata.
|
||||||
|
smartdata itself also bundles typings.
|
||||||
|
So you don't need to install any additional types when importing smartdata.
|
||||||
|
|
||||||
|
[](https://push.rocks)
|
17
dist/index.d.ts
vendored
17
dist/index.d.ts
vendored
@ -1,14 +1,3 @@
|
|||||||
/// <reference types="q" />
|
export * from './smartdata.classes.db';
|
||||||
import * as plugins from './smartdata.plugins';
|
export * from './smartdata.classes.dbcollection';
|
||||||
export declare class DbCollection<T> {
|
export * from './smartdata.classes.dbdoc';
|
||||||
constructor(nameArg: string, db: plugins.mongodb.Db);
|
|
||||||
}
|
|
||||||
export declare type TDbConnectionStatus = 'disconnected' | 'connected' | 'failed';
|
|
||||||
export declare class DbConnection {
|
|
||||||
dbUrl: string;
|
|
||||||
db: plugins.mongodb.Db;
|
|
||||||
status: TDbConnectionStatus;
|
|
||||||
constructor(dbUrl: string);
|
|
||||||
connect(): plugins.q.Promise<any>;
|
|
||||||
close(): plugins.q.Promise<any>;
|
|
||||||
}
|
|
||||||
|
39
dist/index.js
vendored
39
dist/index.js
vendored
@ -1,35 +1,8 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
const plugins = require('./smartdata.plugins');
|
function __export(m) {
|
||||||
class DbCollection {
|
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
|
||||||
constructor(nameArg, db) {
|
|
||||||
let collection = db.collection(nameArg);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
exports.DbCollection = DbCollection;
|
__export(require('./smartdata.classes.db'));
|
||||||
class DbConnection {
|
__export(require('./smartdata.classes.dbcollection'));
|
||||||
constructor(dbUrl) {
|
__export(require('./smartdata.classes.dbdoc'));
|
||||||
this.dbUrl = dbUrl;
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBRUEsaUJBQWMsd0JBQ2QsQ0FBQyxFQURxQztBQUN0QyxpQkFBYyxrQ0FDZCxDQUFDLEVBRCtDO0FBQ2hELGlCQUFjLDJCQUNkLENBQUMsRUFEd0MifQ==
|
||||||
}
|
|
||||||
connect() {
|
|
||||||
let done = plugins.q.defer();
|
|
||||||
plugins.mongodb.MongoClient.connect(this.dbUrl, (err, db) => {
|
|
||||||
if (err) {
|
|
||||||
console.log(err);
|
|
||||||
}
|
|
||||||
plugins.assert.equal(null, err);
|
|
||||||
this.db = db;
|
|
||||||
plugins.beautylog.success(`connected to database at ${this.dbUrl}`);
|
|
||||||
done.resolve(this.db);
|
|
||||||
});
|
|
||||||
return done.promise;
|
|
||||||
}
|
|
||||||
close() {
|
|
||||||
let done = plugins.q.defer();
|
|
||||||
this.db.close();
|
|
||||||
plugins.beautylog.ok(`disconnected to database at ${this.dbUrl}`);
|
|
||||||
done.resolve();
|
|
||||||
return done.promise;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.DbConnection = DbConnection;
|
|
||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsTUFBWSxPQUFPLFdBQU0scUJBRXpCLENBQUMsQ0FGNkM7QUFFOUM7SUFDSSxZQUFZLE9BQWUsRUFBRSxFQUFzQjtRQUMvQyxJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQzNDLENBQUM7QUFDTCxDQUFDO0FBSlksb0JBQVksZUFJeEIsQ0FBQTtBQUlEO0lBS0ksWUFBWSxLQUFhO1FBQ3JCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO0lBQ3RCLENBQUM7SUFFRCxPQUFPO1FBQ0gsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUM1QixPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3BELEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUFDLENBQUM7WUFDN0IsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFBO1lBQy9CLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFBO1lBQ1osT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsNEJBQTRCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO1lBQ25FLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ3pCLENBQUMsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUE7SUFDdkIsQ0FBQztJQUVELEtBQUs7UUFDRCxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQzVCLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDZixPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQywrQkFBK0IsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUE7UUFDakUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQ2QsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUE7SUFDdkIsQ0FBQztBQUNMLENBQUM7QUE1Qlksb0JBQVksZUE0QnhCLENBQUEifQ==
|
|
25
dist/smartdata.classes.db.d.ts
vendored
Normal file
25
dist/smartdata.classes.db.d.ts
vendored
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
/// <reference types="q" />
|
||||||
|
import * as plugins from './smartdata.plugins';
|
||||||
|
import { Objectmap } from 'lik';
|
||||||
|
import { DbCollection } from './smartdata.classes.dbcollection';
|
||||||
|
export declare type TConnectionStatus = 'disconnected' | 'connected' | 'failed';
|
||||||
|
export declare class Db {
|
||||||
|
dbUrl: string;
|
||||||
|
db: plugins.mongodb.Db;
|
||||||
|
status: TConnectionStatus;
|
||||||
|
collections: Objectmap<DbCollection<any>>;
|
||||||
|
constructor(dbUrl: string);
|
||||||
|
/**
|
||||||
|
* connects to the database that was specified during instance creation
|
||||||
|
*/
|
||||||
|
connect(): plugins.q.Promise<any>;
|
||||||
|
/**
|
||||||
|
* closes the connection to the databse
|
||||||
|
*/
|
||||||
|
close(): plugins.q.Promise<any>;
|
||||||
|
/**
|
||||||
|
* gets a collection by name: string
|
||||||
|
*/
|
||||||
|
getCollectionByName<T>(nameArg: string): plugins.q.Promise<DbCollection<T>>;
|
||||||
|
addCollection(dbCollectionArg: DbCollection<any>): void;
|
||||||
|
}
|
56
dist/smartdata.classes.db.js
vendored
Normal file
56
dist/smartdata.classes.db.js
vendored
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
"use strict";
|
||||||
|
const plugins = require('./smartdata.plugins');
|
||||||
|
const lik_1 = require('lik');
|
||||||
|
class Db {
|
||||||
|
constructor(dbUrl) {
|
||||||
|
this.collections = new lik_1.Objectmap();
|
||||||
|
this.dbUrl = dbUrl;
|
||||||
|
}
|
||||||
|
// basic connection stuff ----------------------------------------------
|
||||||
|
/**
|
||||||
|
* connects to the database that was specified during instance creation
|
||||||
|
*/
|
||||||
|
connect() {
|
||||||
|
let done = plugins.q.defer();
|
||||||
|
plugins.mongodb.MongoClient.connect(this.dbUrl, (err, db) => {
|
||||||
|
if (err) {
|
||||||
|
console.log(err);
|
||||||
|
}
|
||||||
|
plugins.assert.equal(null, err);
|
||||||
|
this.db = db;
|
||||||
|
plugins.beautylog.success(`connected to database at ${this.dbUrl}`);
|
||||||
|
done.resolve(this.db);
|
||||||
|
});
|
||||||
|
return done.promise;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* closes the connection to the databse
|
||||||
|
*/
|
||||||
|
close() {
|
||||||
|
let done = plugins.q.defer();
|
||||||
|
this.db.close();
|
||||||
|
plugins.beautylog.ok(`disconnected to database at ${this.dbUrl}`);
|
||||||
|
done.resolve();
|
||||||
|
return done.promise;
|
||||||
|
}
|
||||||
|
// advanced communication with the database --------------------------------
|
||||||
|
/**
|
||||||
|
* gets a collection by name: string
|
||||||
|
*/
|
||||||
|
getCollectionByName(nameArg) {
|
||||||
|
let done = plugins.q.defer();
|
||||||
|
let resultCollection = this.collections.find((dbCollectionArg) => {
|
||||||
|
return dbCollectionArg.name === nameArg;
|
||||||
|
});
|
||||||
|
if (resultCollection !== null) {
|
||||||
|
done.resolve(resultCollection);
|
||||||
|
}
|
||||||
|
return done.promise;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
addCollection(dbCollectionArg) {
|
||||||
|
this.collections.add(dbCollectionArg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.Db = Db;
|
||||||
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRkYXRhLmNsYXNzZXMuZGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydGRhdGEuY2xhc3Nlcy5kYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsTUFBWSxPQUFPLFdBQU0scUJBQ3pCLENBQUMsQ0FENkM7QUFDOUMsc0JBQTBCLEtBRTFCLENBQUMsQ0FGOEI7QUFNL0I7SUFNSSxZQUFZLEtBQWE7UUFGekIsZ0JBQVcsR0FBRyxJQUFJLGVBQVMsRUFBcUIsQ0FBQTtRQUc1QyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtJQUN0QixDQUFDO0lBRUQsd0VBQXdFO0lBRXhFOztPQUVHO0lBQ0gsT0FBTztRQUNILElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDNUIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNwRCxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7WUFBQyxDQUFDO1lBQzdCLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQTtZQUMvQixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQTtZQUNaLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLDRCQUE0QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQTtZQUNuRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUN6QixDQUFDLENBQUMsQ0FBQTtRQUNGLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFBO0lBQ3ZCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUs7UUFDRCxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQzVCLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDZixPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQywrQkFBK0IsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUE7UUFDakUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQ2QsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUE7SUFDdkIsQ0FBQztJQUVELDRFQUE0RTtJQUU1RTs7T0FFRztJQUNILG1CQUFtQixDQUFJLE9BQWU7UUFDbEMsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQXFCLENBQUE7UUFDL0MsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLGVBQWU7WUFDekQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFBO1FBQzNDLENBQUMsQ0FBQyxDQUFBO1FBQ0YsRUFBRSxDQUFDLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUE7UUFDbEMsQ0FBQztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFBO0lBQ3ZCLENBQUM7O0lBRUQsYUFBYSxDQUFDLGVBQWtDO1FBQzVDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFBO0lBQ3pDLENBQUM7QUFDTCxDQUFDO0FBekRZLFVBQUUsS0F5RGQsQ0FBQSJ9
|
29
dist/smartdata.classes.dbcollection.d.ts
vendored
Normal file
29
dist/smartdata.classes.dbcollection.d.ts
vendored
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
/// <reference types="q" />
|
||||||
|
import * as plugins from './smartdata.plugins';
|
||||||
|
import { Db } from './smartdata.classes.db';
|
||||||
|
export interface IFindOptions {
|
||||||
|
limit?: number;
|
||||||
|
}
|
||||||
|
export declare function Collection(db: Db): (constructor: any) => void;
|
||||||
|
export declare class DbCollection<T> {
|
||||||
|
collection: plugins.mongodb.Collection;
|
||||||
|
name: string;
|
||||||
|
constructor(nameArg: string, dbArg: Db);
|
||||||
|
/**
|
||||||
|
* adds a validation function that all newly inserted and updated objects have to pass
|
||||||
|
*/
|
||||||
|
addObjectValidation(funcArg: any): void;
|
||||||
|
/**
|
||||||
|
* finds an object in the DbCollection
|
||||||
|
*/
|
||||||
|
find(docMatchArg: T | any, optionsArg?: IFindOptions): plugins.q.Promise<T[]>;
|
||||||
|
/**
|
||||||
|
* inserts object into the DbCollection
|
||||||
|
*/
|
||||||
|
insertOne(docArg: T): plugins.q.Promise<void>;
|
||||||
|
/**
|
||||||
|
* inserts many objects at once into the DbCollection
|
||||||
|
*/
|
||||||
|
insertMany(docArrayArg: T[]): plugins.q.Promise<void>;
|
||||||
|
private checkDoc(doc);
|
||||||
|
}
|
70
dist/smartdata.classes.dbcollection.js
vendored
Normal file
70
dist/smartdata.classes.dbcollection.js
vendored
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
"use strict";
|
||||||
|
const plugins = require('./smartdata.plugins');
|
||||||
|
function Collection(db) {
|
||||||
|
return function (constructor) {
|
||||||
|
constructor['dbCollection'] = new DbCollection(constructor.name, db);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
exports.Collection = Collection;
|
||||||
|
class DbCollection {
|
||||||
|
constructor(nameArg, dbArg) {
|
||||||
|
this.name = nameArg;
|
||||||
|
this.collection = dbArg.db.collection(nameArg);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* adds a validation function that all newly inserted and updated objects have to pass
|
||||||
|
*/
|
||||||
|
addObjectValidation(funcArg) { }
|
||||||
|
/**
|
||||||
|
* finds an object in the DbCollection
|
||||||
|
*/
|
||||||
|
find(docMatchArg, optionsArg) {
|
||||||
|
let done = plugins.q.defer();
|
||||||
|
let findCursor = this.collection.find(docMatchArg);
|
||||||
|
if (optionsArg) {
|
||||||
|
if (optionsArg.limit) {
|
||||||
|
findCursor = findCursor.limit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
findCursor.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
|
||||||
|
*/
|
||||||
|
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;
|
||||||
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRkYXRhLmNsYXNzZXMuZGJjb2xsZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRkYXRhLmNsYXNzZXMuZGJjb2xsZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxNQUFZLE9BQU8sV0FBTSxxQkFDekIsQ0FBQyxDQUQ2QztBQU85QyxvQkFBMkIsRUFBTTtJQUM3QixNQUFNLENBQUMsVUFBUyxXQUFXO1FBQ3ZCLFdBQVcsQ0FBQyxjQUFjLENBQUMsR0FBRyxJQUFJLFlBQVksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQ3hFLENBQUMsQ0FBQTtBQUNMLENBQUM7QUFKZSxrQkFBVSxhQUl6QixDQUFBO0FBRUQ7SUFHSSxZQUFZLE9BQWUsRUFBRSxLQUFTO1FBQ2xDLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFBO1FBQ25CLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDbEQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsbUJBQW1CLENBQUMsT0FBTyxJQUFJLENBQUM7SUFFaEM7O09BRUc7SUFDSCxJQUFJLENBQUMsV0FBb0IsRUFBRSxVQUF5QjtRQUNoRCxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBTyxDQUFBO1FBQ2pDLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQ2xELEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDYixFQUFFLENBQUMsQ0FBRSxVQUFVLENBQUMsS0FBTSxDQUFDLENBQUMsQ0FBQztnQkFBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUFDLENBQUM7UUFDaEUsQ0FBQztRQUNELFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSTtZQUN6QixFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUFDLE1BQU0sR0FBRyxDQUFBO1lBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3RCLENBQUMsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUE7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsU0FBUyxDQUFDLE1BQVM7UUFDZixJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBUSxDQUFBO1FBQ2xDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztpQkFDNUIsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDdkMsQ0FBQyxDQUFDLENBQUE7UUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQTtJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVLENBQUMsV0FBZ0I7UUFDdkIsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQVEsQ0FBQTtRQUNsQyxJQUFJLG9CQUFvQixHQUE4QixFQUFFLENBQUE7UUFDeEQsR0FBRyxDQUFDLENBQUMsSUFBSSxNQUFNLElBQUksV0FBVyxDQUFDLENBQUEsQ0FBQztZQUM1QixvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO1FBQ3BELENBQUM7UUFDRCxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNyQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUM7aUJBQ2xDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3ZDLENBQUMsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUE7SUFDdkIsQ0FBQztJQUVPLFFBQVEsQ0FBQyxHQUFNO1FBQ25CLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFRLENBQUE7UUFDbEMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQ2QsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUE7SUFDdkIsQ0FBQztBQUNMLENBQUM7QUE5RFksb0JBQVksZUE4RHhCLENBQUEifQ==
|
9
dist/smartdata.classes.dbdoc.d.ts
vendored
Normal file
9
dist/smartdata.classes.dbdoc.d.ts
vendored
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import { DbCollection } from './smartdata.classes.dbcollection';
|
||||||
|
export declare type TDocCreation = 'db' | 'data' | 'mixed';
|
||||||
|
export declare class DbDoc<T> {
|
||||||
|
collection: DbCollection<T>;
|
||||||
|
creationType: TDocCreation;
|
||||||
|
constructor();
|
||||||
|
save(): void;
|
||||||
|
saveDeep(): void;
|
||||||
|
}
|
12
dist/smartdata.classes.dbdoc.js
vendored
Normal file
12
dist/smartdata.classes.dbdoc.js
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
"use strict";
|
||||||
|
class DbDoc {
|
||||||
|
constructor() {
|
||||||
|
this.collection = this.constructor['dbCollection'];
|
||||||
|
}
|
||||||
|
save() {
|
||||||
|
}
|
||||||
|
saveDeep() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.DbDoc = DbDoc;
|
||||||
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRkYXRhLmNsYXNzZXMuZGJkb2MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydGRhdGEuY2xhc3Nlcy5kYmRvYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBUUE7SUFHSTtRQUNJLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQTtJQUN0RCxDQUFDO0lBQ0QsSUFBSTtJQUVKLENBQUM7SUFDRCxRQUFRO0lBRVIsQ0FBQztBQUNMLENBQUM7QUFaWSxhQUFLLFFBWWpCLENBQUEifQ==
|
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.1",
|
"version": "1.0.15",
|
||||||
"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",
|
||||||
@ -21,6 +22,7 @@
|
|||||||
"@types/mongodb": "^2.1.32",
|
"@types/mongodb": "^2.1.32",
|
||||||
"@types/q": "0.0.30",
|
"@types/q": "0.0.30",
|
||||||
"beautylog": "^5.0.23",
|
"beautylog": "^5.0.23",
|
||||||
|
"lik": "^1.0.15",
|
||||||
"mongodb": "^2.2.9",
|
"mongodb": "^2.2.9",
|
||||||
"q": "^1.4.1",
|
"q": "^1.4.1",
|
||||||
"typings-global": "^1.0.14"
|
"typings-global": "^1.0.14"
|
||||||
@ -30,6 +32,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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
87
test/test.js
87
test/test.js
@ -1,30 +1,101 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
||||||
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
||||||
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
||||||
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
||||||
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
||||||
|
};
|
||||||
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 testDb;
|
||||||
|
let testDbCollection;
|
||||||
describe('mongodb', function () {
|
describe('mongodb', function () {
|
||||||
it('should start mongodb', function (done) {
|
it('should start mongodb', function (done) {
|
||||||
mongoChildProcess = shelljs.exec('mongod --dbpath=./test/data --port 27017', { async: true });
|
this.timeout(30000);
|
||||||
setTimeout(() => { done(); }, 1500);
|
mongoChildProcess = shelljs.exec('mongod --dbpath=./test/data --port 27017', { async: true, silent: true });
|
||||||
|
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');
|
testDb = new smartdata.Db('mongodb://localhost:27017/smartdata');
|
||||||
testDbConnection.connect().then(() => { done(); });
|
testDb.connect().then(() => { done(); });
|
||||||
});
|
});
|
||||||
it('should create a collection', function () {
|
it('should create a collection', function () {
|
||||||
|
testDbCollection = new smartdata.DbCollection('something', testDb);
|
||||||
|
});
|
||||||
|
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();
|
testDb.close();
|
||||||
|
});
|
||||||
|
it('should create an extended class', function () {
|
||||||
|
let TestCar = class TestCar extends smartdata.DbDoc {
|
||||||
|
constructor(optionsArg) {
|
||||||
|
super();
|
||||||
|
this.color = optionsArg.color;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
TestCar = __decorate([
|
||||||
|
smartdata.Collection(testDb)
|
||||||
|
], TestCar);
|
||||||
|
;
|
||||||
|
let testCarInstance = new TestCar({
|
||||||
|
color: 'red',
|
||||||
|
property2: 2
|
||||||
|
});
|
||||||
|
should(testCarInstance.collection).be.instanceof(smartdata.DbCollection);
|
||||||
|
should(testCarInstance).be.instanceof(smartdata.DbDoc);
|
||||||
|
testCarInstance.save();
|
||||||
|
it('should get a collection for testCar', function () {
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
describe('mongodb', function () {
|
describe('mongodb', function () {
|
||||||
it('should kill mongodb', function () {
|
it('should kill mongodb', function (done) {
|
||||||
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLFFBQU8sY0FDUCxDQUFDLENBRG9CO0FBQ3JCLE1BQVksT0FBTyxXQUFNLFNBQ3pCLENBQUMsQ0FEaUM7QUFFbEMsTUFBWSxTQUFTLFdBQU0sZUFHM0IsQ0FBQyxDQUh5QztBQUcxQyxJQUFJLGlCQUFpQixDQUFBO0FBQ3JCLElBQUksZ0JBQXdDLENBQUE7QUFHNUMsUUFBUSxDQUFDLFNBQVMsRUFBQztJQUNmLEVBQUUsQ0FBQyxzQkFBc0IsRUFBQyxVQUFTLElBQUk7UUFDbkMsaUJBQWlCLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQywwQ0FBMEMsRUFBQyxFQUFDLEtBQUssRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO1FBQzFGLFVBQVUsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFBLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ3RDLENBQUMsQ0FBQyxDQUFBO0FBQ04sQ0FBQyxDQUFDLENBQUE7QUFDRixRQUFRLENBQUMsV0FBVyxFQUFDO0lBQ2pCLEVBQUUsQ0FBQywwQ0FBMEMsRUFBQyxVQUFTLElBQUk7UUFDdkQsZ0JBQWdCLEdBQUcsSUFBSSxTQUFTLENBQUMsWUFBWSxDQUFDLHFDQUFxQyxDQUFDLENBQUE7UUFDcEYsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNyRCxDQUFDLENBQUMsQ0FBQTtJQUNGLEVBQUUsQ0FBQyw0QkFBNEIsRUFBQztJQUVoQyxDQUFDLENBQUMsQ0FBQTtJQUNGLEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBQztRQUNoQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUM1QixDQUFDLENBQUMsQ0FBQTtBQUNOLENBQUMsQ0FBQyxDQUFBO0FBRUYsUUFBUSxDQUFDLFNBQVMsRUFBQztJQUNmLEVBQUUsQ0FBQyxxQkFBcUIsRUFBQztRQUNyQixPQUFPLENBQUMsSUFBSSxDQUFDLHdDQUF3QyxDQUFDLENBQUE7UUFDdEQsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQ3JDLENBQUMsQ0FBQyxDQUFBO0FBQ04sQ0FBQyxDQUFDLENBQUEifQ==
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLFFBQU8sY0FFUCxDQUFDLENBRm9CO0FBRXJCLE1BQVksT0FBTyxXQUFNLFNBQ3pCLENBQUMsQ0FEaUM7QUFDbEMsTUFBWSxNQUFNLFdBQU0sUUFDeEIsQ0FBQyxDQUQrQjtBQUNoQyxNQUFZLFdBQVcsV0FBTSxhQUc3QixDQUFDLENBSHlDO0FBRTFDLG9CQUFvQjtBQUNwQixNQUFZLFNBQVMsV0FBTSxlQUUzQixDQUFDLENBRnlDO0FBRTFDLElBQUksaUJBQWlCLENBQUE7QUFDckIsSUFBSSxNQUFvQixDQUFBO0FBUXhCLElBQUksZ0JBQXNELENBQUE7QUFFMUQsUUFBUSxDQUFDLFNBQVMsRUFBRTtJQUNoQixFQUFFLENBQUMsc0JBQXNCLEVBQUUsVUFBVSxJQUFJO1FBQ3JDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDbkIsaUJBQWlCLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQywwQ0FBMEMsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7UUFDM0csSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFBO1FBQ3RCLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLFVBQVUsSUFBSTtZQUM5QyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLDRCQUE0QixDQUFDLENBQUMsQ0FBQTtZQUNwRixFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2QsRUFBRSxDQUFDLENBQUMsdUNBQXVDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDckQsVUFBVSxHQUFHLElBQUksQ0FBQTtvQkFDakIsSUFBSSxF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
|
111
test/test.ts
111
test/test.ts
@ -1,34 +1,107 @@
|
|||||||
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 smartstring from 'smartstring'
|
||||||
|
|
||||||
|
// the tested module
|
||||||
import * as smartdata from '../dist/index'
|
import * as smartdata from '../dist/index'
|
||||||
|
|
||||||
|
|
||||||
let mongoChildProcess
|
let mongoChildProcess
|
||||||
let testDbConnection: smartdata.DbConnection
|
let testDb: smartdata.Db
|
||||||
|
|
||||||
|
interface ITestObject1 {
|
||||||
|
value1: string
|
||||||
|
value2?: number
|
||||||
|
value3?: string
|
||||||
|
}
|
||||||
|
|
||||||
describe('mongodb',function(){
|
let testDbCollection: smartdata.DbCollection<ITestObject1>
|
||||||
it('should start mongodb',function(done){
|
|
||||||
mongoChildProcess = shelljs.exec('mongod --dbpath=./test/data --port 27017',{async: true})
|
|
||||||
setTimeout(() => { done() }, 1500)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
describe('smartdata',function(){
|
|
||||||
it('should establish a connection to mongodb',function(done){
|
|
||||||
testDbConnection = new smartdata.DbConnection('mongodb://localhost:27017/smartdata')
|
|
||||||
testDbConnection.connect().then(() => { done() })
|
|
||||||
})
|
|
||||||
it('should create a collection',function(){
|
|
||||||
|
|
||||||
})
|
describe('mongodb', function () {
|
||||||
it('should close the db Connection',function(){
|
it('should start mongodb', function (done) {
|
||||||
testDbConnection.close()
|
this.timeout(30000)
|
||||||
|
mongoChildProcess = shelljs.exec('mongod --dbpath=./test/data --port 27017', { async: true, silent: true })
|
||||||
|
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('mongodb',function(){
|
describe('smartdata', function () {
|
||||||
it('should kill mongodb',function(){
|
it('should establish a connection to mongodb', function (done) {
|
||||||
|
testDb = new smartdata.Db('mongodb://localhost:27017/smartdata')
|
||||||
|
testDb.connect().then(() => { done() })
|
||||||
|
})
|
||||||
|
it('should create a collection', function () {
|
||||||
|
testDbCollection = new smartdata.DbCollection<ITestObject1>('something', testDb)
|
||||||
|
})
|
||||||
|
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 () {
|
||||||
|
testDb.close()
|
||||||
|
})
|
||||||
|
it('should create an extended class', function () {
|
||||||
|
@smartdata.Collection(testDb)
|
||||||
|
class TestCar extends smartdata.DbDoc<TestCar> {
|
||||||
|
color: string
|
||||||
|
constructor(optionsArg: {
|
||||||
|
color: string,
|
||||||
|
property2: number
|
||||||
|
}) {
|
||||||
|
super()
|
||||||
|
this.color = optionsArg.color
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let testCarInstance = new TestCar({
|
||||||
|
color: 'red',
|
||||||
|
property2: 2
|
||||||
|
})
|
||||||
|
should(testCarInstance.collection).be.instanceof(smartdata.DbCollection)
|
||||||
|
should(testCarInstance).be.instanceof(smartdata.DbDoc)
|
||||||
|
testCarInstance.save()
|
||||||
|
it('should get a collection for testCar',function() {
|
||||||
|
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('mongodb', function () {
|
||||||
|
it('should kill mongodb', function (done) {
|
||||||
|
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')
|
||||||
})
|
})
|
||||||
|
40
ts/index.ts
40
ts/index.ts
@ -1,39 +1,5 @@
|
|||||||
import * as plugins from './smartdata.plugins'
|
import * as plugins from './smartdata.plugins'
|
||||||
|
|
||||||
export class DbCollection<T> {
|
export * from './smartdata.classes.db'
|
||||||
constructor(nameArg: string, db: plugins.mongodb.Db) {
|
export * from './smartdata.classes.dbcollection'
|
||||||
let collection = db.collection(nameArg)
|
export * from './smartdata.classes.dbdoc'
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export type TDbConnectionStatus = 'disconnected' | 'connected' | 'failed'
|
|
||||||
|
|
||||||
export class DbConnection {
|
|
||||||
dbUrl: string
|
|
||||||
db: plugins.mongodb.Db
|
|
||||||
status: TDbConnectionStatus
|
|
||||||
|
|
||||||
constructor(dbUrl: string) {
|
|
||||||
this.dbUrl = dbUrl
|
|
||||||
}
|
|
||||||
|
|
||||||
connect(): plugins.q.Promise<any> {
|
|
||||||
let done = plugins.q.defer()
|
|
||||||
plugins.mongodb.MongoClient.connect(this.dbUrl, (err, db) => {
|
|
||||||
if (err) { console.log(err) }
|
|
||||||
plugins.assert.equal(null, err)
|
|
||||||
this.db = db
|
|
||||||
plugins.beautylog.success(`connected to database at ${this.dbUrl}`)
|
|
||||||
done.resolve(this.db)
|
|
||||||
})
|
|
||||||
return done.promise
|
|
||||||
}
|
|
||||||
|
|
||||||
close(): plugins.q.Promise<any> {
|
|
||||||
let done = plugins.q.defer()
|
|
||||||
this.db.close()
|
|
||||||
plugins.beautylog.ok(`disconnected to database at ${this.dbUrl}`)
|
|
||||||
done.resolve()
|
|
||||||
return done.promise
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
65
ts/smartdata.classes.db.ts
Normal file
65
ts/smartdata.classes.db.ts
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
import * as plugins from './smartdata.plugins'
|
||||||
|
import { Objectmap } from 'lik'
|
||||||
|
|
||||||
|
import { DbCollection } from './smartdata.classes.dbcollection'
|
||||||
|
|
||||||
|
export type TConnectionStatus = 'disconnected' | 'connected' | 'failed'
|
||||||
|
|
||||||
|
export class Db {
|
||||||
|
dbUrl: string
|
||||||
|
db: plugins.mongodb.Db
|
||||||
|
status: TConnectionStatus
|
||||||
|
collections = new Objectmap<DbCollection<any>>()
|
||||||
|
|
||||||
|
constructor(dbUrl: string) {
|
||||||
|
this.dbUrl = dbUrl
|
||||||
|
}
|
||||||
|
|
||||||
|
// basic connection stuff ----------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* connects to the database that was specified during instance creation
|
||||||
|
*/
|
||||||
|
connect(): plugins.q.Promise<any> {
|
||||||
|
let done = plugins.q.defer()
|
||||||
|
plugins.mongodb.MongoClient.connect(this.dbUrl, (err, db) => {
|
||||||
|
if (err) { console.log(err) }
|
||||||
|
plugins.assert.equal(null, err)
|
||||||
|
this.db = db
|
||||||
|
plugins.beautylog.success(`connected to database at ${this.dbUrl}`)
|
||||||
|
done.resolve(this.db)
|
||||||
|
})
|
||||||
|
return done.promise
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* closes the connection to the databse
|
||||||
|
*/
|
||||||
|
close(): plugins.q.Promise<any> {
|
||||||
|
let done = plugins.q.defer()
|
||||||
|
this.db.close()
|
||||||
|
plugins.beautylog.ok(`disconnected to database at ${this.dbUrl}`)
|
||||||
|
done.resolve()
|
||||||
|
return done.promise
|
||||||
|
}
|
||||||
|
|
||||||
|
// advanced communication with the database --------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gets a collection by name: string
|
||||||
|
*/
|
||||||
|
getCollectionByName<T>(nameArg: string): plugins.q.Promise<DbCollection<T>> {
|
||||||
|
let done = plugins.q.defer<DbCollection<any>>()
|
||||||
|
let resultCollection = this.collections.find((dbCollectionArg) => {
|
||||||
|
return dbCollectionArg.name === nameArg
|
||||||
|
})
|
||||||
|
if (resultCollection !== null) {
|
||||||
|
done.resolve(resultCollection)
|
||||||
|
}
|
||||||
|
return done.promise
|
||||||
|
};
|
||||||
|
|
||||||
|
addCollection(dbCollectionArg: DbCollection<any>) {
|
||||||
|
this.collections.add(dbCollectionArg)
|
||||||
|
}
|
||||||
|
}
|
76
ts/smartdata.classes.dbcollection.ts
Normal file
76
ts/smartdata.classes.dbcollection.ts
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
import * as plugins from './smartdata.plugins'
|
||||||
|
import { Db } from './smartdata.classes.db'
|
||||||
|
|
||||||
|
export interface IFindOptions {
|
||||||
|
limit?: number
|
||||||
|
}
|
||||||
|
|
||||||
|
export function Collection(db: Db) {
|
||||||
|
return function(constructor){
|
||||||
|
constructor['dbCollection'] = new DbCollection(constructor.name, db)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class DbCollection<T> {
|
||||||
|
collection: plugins.mongodb.Collection
|
||||||
|
name: string
|
||||||
|
constructor(nameArg: string, dbArg: Db) {
|
||||||
|
this.name = nameArg
|
||||||
|
this.collection = dbArg.db.collection(nameArg)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* adds a validation function that all newly inserted and updated objects have to pass
|
||||||
|
*/
|
||||||
|
addObjectValidation(funcArg) { }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* finds an object in the DbCollection
|
||||||
|
*/
|
||||||
|
find(docMatchArg: T | any, optionsArg?: IFindOptions): plugins.q.Promise<T[]> {
|
||||||
|
let done = plugins.q.defer<T[]>()
|
||||||
|
let findCursor = this.collection.find(docMatchArg)
|
||||||
|
if (optionsArg) {
|
||||||
|
if ( optionsArg.limit ) { findCursor = findCursor.limit(1) }
|
||||||
|
}
|
||||||
|
findCursor.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
|
||||||
|
*/
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
21
ts/smartdata.classes.dbdoc.ts
Normal file
21
ts/smartdata.classes.dbdoc.ts
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
import * as plugins from './smartdata.plugins'
|
||||||
|
|
||||||
|
import { Db } from './smartdata.classes.db'
|
||||||
|
import { DbCollection } from './smartdata.classes.dbcollection'
|
||||||
|
|
||||||
|
export type TDocCreation = 'db' | 'data' | 'mixed'
|
||||||
|
|
||||||
|
|
||||||
|
export class DbDoc<T> {
|
||||||
|
collection: DbCollection<T>
|
||||||
|
creationType: TDocCreation
|
||||||
|
constructor() {
|
||||||
|
this.collection = this.constructor['dbCollection']
|
||||||
|
}
|
||||||
|
save() {
|
||||||
|
|
||||||
|
}
|
||||||
|
saveDeep() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user