Compare commits

..

12 Commits

Author SHA1 Message Date
ae7d101ab9 3.1.3 2019-01-07 02:38:30 +01:00
3825b15a65 fix(core): update 2019-01-07 02:38:30 +01:00
3fc41678d2 3.1.2 2018-07-10 21:45:26 +02:00
39f1b7ada1 fix(test): fix import 2018-07-10 21:45:26 +02:00
f763de2403 3.1.1 2018-07-10 21:33:49 +02:00
cba1d031b6 fix(ci): fix tools install 2018-07-10 21:33:49 +02:00
d31e6a5931 3.1.0 2018-07-10 21:27:17 +02:00
46514a2743 feat(SmartdataDoc): add custom unique indexes 2018-07-10 21:27:16 +02:00
1cf02157c4 3.0.5 2018-07-10 00:19:23 +02:00
72efa14da8 fix(test): update npmts 2018-07-10 00:19:22 +02:00
a73c2084c0 3.0.4 2018-07-10 00:17:17 +02:00
5ed557a21a fix(test): test now throws correctly 2018-07-10 00:17:16 +02:00
10 changed files with 1401 additions and 419 deletions

View File

@ -1,29 +0,0 @@
# smartdata
do more with data
## Availabililty
[![npm](https://pushrocks.gitlab.io/assets/repo-button-npm.svg)](https://www.npmjs.com/package/smartdata)
[![git](https://pushrocks.gitlab.io/assets/repo-button-git.svg)](https://GitLab.com/pushrocks/smartdata)
[![git](https://pushrocks.gitlab.io/assets/repo-button-mirror.svg)](https://github.com/pushrocks/smartdata)
[![docs](https://pushrocks.gitlab.io/assets/repo-button-docs.svg)](https://pushrocks.gitlab.io/smartdata/)
## Status for master
[![build status](https://GitLab.com/pushrocks/smartdata/badges/master/build.svg)](https://GitLab.com/pushrocks/smartdata/commits/master)
[![coverage report](https://GitLab.com/pushrocks/smartdata/badges/master/coverage.svg)](https://GitLab.com/pushrocks/smartdata/commits/master)
[![npm downloads per month](https://img.shields.io/npm/dm/smartdata.svg)](https://www.npmjs.com/package/smartdata)
[![Dependency Status](https://david-dm.org/pushrocks/smartdata.svg)](https://david-dm.org/pushrocks/smartdata)
[![bitHound Dependencies](https://www.bithound.io/github/pushrocks/smartdata/badges/dependencies.svg)](https://www.bithound.io/github/pushrocks/smartdata/master/dependencies/npm)
[![bitHound Code](https://www.bithound.io/github/pushrocks/smartdata/badges/code.svg)](https://www.bithound.io/github/pushrocks/smartdata)
[![TypeScript](https://img.shields.io/badge/TypeScript-2.x-blue.svg)](https://nodejs.org/dist/latest-v6.x/docs/api/)
[![node](https://img.shields.io/badge/node->=%206.x.x-blue.svg)](https://nodejs.org/dist/latest-v6.x/docs/api/)
[![JavaScript Style Guide](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](http://standardjs.com/)
For further information read the linked docs at the top of this README.
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh)
> | By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html)
[![repo-footer](https://pushrocks.gitlab.io/assets/repo-footer.svg)](https://push.rocks)

View File

@ -6,7 +6,7 @@
}, },
"npmci": { "npmci": {
"npmGlobalTools": [ "npmGlobalTools": [
"npmts" "@gitzone/npmts"
], ],
"npmAccessLevel": "public" "npmAccessLevel": "public"
}, },

1693
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{ {
"name": "@pushrocks/smartdata", "name": "@pushrocks/smartdata",
"version": "3.0.3", "version": "3.1.3",
"private": false, "private": false,
"description": "do more with data", "description": "do more with data",
"main": "dist/index.js", "main": "dist/index.js",
@ -21,20 +21,23 @@
}, },
"homepage": "https://gitlab.com/pushrocks/smartdata#README", "homepage": "https://gitlab.com/pushrocks/smartdata#README",
"dependencies": { "dependencies": {
"@pushrocks/smartlog": "^1.0.6", "@pushrocks/lik": "^3.0.4",
"@pushrocks/smartlog": "^2.0.9",
"@pushrocks/smartpromise": "^2.0.5", "@pushrocks/smartpromise": "^2.0.5",
"@types/lodash": "^4.14.110", "@pushrocks/smartstring": "^3.0.5",
"@types/mongodb": "^3.1.1", "@types/lodash": "^4.14.119",
"lik": "^2.0.5", "@types/mongodb": "^3.1.18",
"lodash": "^4.17.10", "lodash": "^4.17.11",
"mongodb": "^3.1.1", "mongodb": "^3.1.10",
"runtime-type-checks": "0.0.4", "runtime-type-checks": "0.0.4"
"smartstring": "^2.0.28"
}, },
"devDependencies": { "devDependencies": {
"@gitzone/tsrun": "^1.1.2", "@gitzone/tsrun": "^1.1.17",
"@types/node": "^10.5.2", "@pushrocks/qenv": "^3.0.2",
"qenv": "^1.1.7", "@pushrocks/tapbundle": "^3.0.7",
"tapbundle": "^2.0.2" "@types/node": "^10.12.18",
"@types/shortid": "0.0.29",
"mongodb-memory-server": "^2.9.1",
"shortid": "^2.2.14"
} }
} }

View File

@ -1,4 +1,4 @@
vars: required:
- MONGO_URL - MONGO_URL
- MONGO_DBNAME - MONGO_DBNAME
- MONGO_PASS - MONGO_PASS

View File

@ -1,12 +1,13 @@
import { tap, expect } from 'tapbundle'; import { tap, expect } from '@pushrocks/tapbundle';
import * as smartpromise from '@pushrocks/smartpromise'; import * as smartpromise from '@pushrocks/smartpromise';
import { Qenv } from 'qenv'; import { Qenv } from '@pushrocks/qenv';
let testQenv = new Qenv(process.cwd(), process.cwd() + '/.nogit/'); let testQenv = new Qenv(process.cwd(), process.cwd() + '/.nogit/');
// the tested module // the tested module
import * as smartdata from '../ts'; import * as smartdata from '../ts/index';
import { smartstring } from '../ts/smartdata.plugins'; import { smartstring } from '../ts/smartdata.plugins';
import * as shortid from 'shortid';
// ======================================= // =======================================
// Connecting to the database server // Connecting to the database server
@ -32,6 +33,7 @@ tap.test('should establish a connection to the rethink Db cluster', async () =>
@smartdata.Collection(testDb) @smartdata.Collection(testDb)
class Car extends smartdata.SmartDataDbDoc<Car> { class Car extends smartdata.SmartDataDbDoc<Car> {
@smartdata.unI() index: string = shortid();
@smartdata.svDb() color: string; @smartdata.svDb() color: string;
@smartdata.svDb() brand: string; @smartdata.svDb() brand: string;
constructor(colorArg: string, brandArg: string) { constructor(colorArg: string, brandArg: string) {
@ -60,4 +62,4 @@ tap.test('should close the database connection', async tools => {
await testDb.close(); await testDb.close();
}); });
tap.start(); tap.start({throwOnError: true});

View File

@ -31,6 +31,7 @@ export class SmartdataCollection<T> {
objectValidation: IDocValidationFunc<T> = null; objectValidation: IDocValidationFunc<T> = null;
collectionName: string; collectionName: string;
smartdataDb: SmartdataDb; smartdataDb: SmartdataDb;
uniqueIndexes: string[] = [];
constructor(collectedClassArg: T & SmartDataDbDoc<T>, smartDataDbArg: SmartdataDb) { constructor(collectedClassArg: T & SmartDataDbDoc<T>, smartDataDbArg: SmartdataDb) {
// tell the collection where it belongs // tell the collection where it belongs
@ -59,6 +60,21 @@ export class SmartdataCollection<T> {
} }
} }
/**
* mark unique index
*/
markUniqueIndexes(keyArrayArg: string[] = []) {
for(let key of keyArrayArg) {
if(!this.uniqueIndexes.includes(key)) {
this.mongoDbCollection.createIndex(key, {
unique: true
});
// make sure we only call this once and not for every doc we create
this.uniqueIndexes.push(key);
}
}
}
/** /**
* 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
*/ */
@ -81,6 +97,7 @@ export class SmartdataCollection<T> {
async insert(dbDocArg: T & SmartDataDbDoc<T>): Promise<any> { async insert(dbDocArg: T & SmartDataDbDoc<T>): Promise<any> {
await this.init(); await this.init();
await this.checkDoc(dbDocArg); await this.checkDoc(dbDocArg);
this.markUniqueIndexes(dbDocArg.uniqueIndexes);
const saveableObject = await dbDocArg.createSavableObject(); const saveableObject = await dbDocArg.createSavableObject();
console.log(saveableObject); console.log(saveableObject);
const result = await this.mongoDbCollection.insertOne(saveableObject); const result = await this.mongoDbCollection.insertOne(saveableObject);

View File

@ -1,5 +1,5 @@
import * as plugins from './smartdata.plugins'; import * as plugins from './smartdata.plugins';
import { Objectmap } from 'lik'; import { Objectmap } from '@pushrocks/lik';
import { SmartdataCollection } from './smartdata.classes.collection'; import { SmartdataCollection } from './smartdata.classes.collection';
@ -71,8 +71,8 @@ export class SmartdataDb {
await this.mongoDbClient.close(); await this.mongoDbClient.close();
this.status = 'disconnected'; this.status = 'disconnected';
plugins.smartlog plugins.smartlog
.getDefaultLogger() .defaultLogger
.info(`disconnected from database ${this.smartdataOptions.mongoDbName}`); .log('info', `disconnected from database ${this.smartdataOptions.mongoDbName}`);
} }
// handle table to class distribution // handle table to class distribution

View File

@ -12,7 +12,28 @@ export type TDocCreation = 'db' | 'new' | 'mixed';
*/ */
export function svDb() { export function svDb() {
return (target: SmartDataDbDoc<any>, key: string) => { return (target: SmartDataDbDoc<any>, key: string) => {
console.log('called sva'); console.log(`called svDb() on ${key}`);
if (!target.saveableProperties) {
target.saveableProperties = [];
}
target.saveableProperties.push(key);
};
}
/**
* unique index - decorator to mark a unique index
*/
export function unI() {
return (target: SmartDataDbDoc<any>, key: string) => {
console.log('called unI');
// mark the index as unique
if (!target.uniqueIndexes) {
target.uniqueIndexes = [];
}
target.uniqueIndexes.push(key);
// and also save it
if (!target.saveableProperties) { if (!target.saveableProperties) {
target.saveableProperties = []; target.saveableProperties = [];
} }
@ -31,6 +52,11 @@ export class SmartDataDbDoc<T> {
*/ */
creationStatus: TDocCreation = 'new'; creationStatus: TDocCreation = 'new';
/**
* unique indexes
*/
uniqueIndexes: string[];
/** /**
* an array of saveable properties of a doc * an array of saveable properties of a doc
*/ */

View File

@ -2,7 +2,7 @@ import * as assert from 'assert';
import * as smartlog from '@pushrocks/smartlog'; import * as smartlog from '@pushrocks/smartlog';
import * as lodash from 'lodash'; import * as lodash from 'lodash';
import * as mongodb from 'mongodb'; import * as mongodb from 'mongodb';
import * as smartq from 'smartq'; import * as smartq from '@pushrocks/smartpromise';
import * as smartstring from 'smartstring'; import * as smartstring from '@pushrocks/smartstring';
export { assert, smartlog, lodash, smartq, mongodb, smartstring }; export { assert, smartlog, lodash, smartq, mongodb, smartstring };