UNPKG

blow-data-service

Version:

Observable data service for Blow.

70 lines (57 loc) 2.22 kB
'use strict'; import {Query} from 'blow-query'; import {Collection} from 'blow-collection'; import {Observable} from 'rxjs'; import {ConnectorSettings} from 'blow-service'; import {DataConnector} from './DataConnector'; import {Entity} from '../Entity'; function copyObject(obj) { return Object.assign({}, obj); } export class MemoryConnector extends DataConnector { protected _db: Map<string, Collection<any>>; constructor(settings: ConnectorSettings) { super(settings); this._db = new Map(); } protected _collection<T>(collectionName: string): Collection<T> { if (!this._db.has(collectionName)) { this._db.set(collectionName, new Collection<T>({ idKey: '_id' })); } return <Collection<T>>this._db.get(collectionName); } find<T>(collectionName: string, query?: Query): Observable<T> { return this._collection(collectionName) .find(this._prepareQuery(query)).map(copyObject); } count(collectionName: string, query?: Query): Observable<number> { return this._collection(collectionName) .count(this._prepareQuery(query).where); } delete(collectionName: string, query?: Query): Observable<number> { return this._collection(collectionName) .destroy(this._prepareQuery(query).where); } deleteById(collectionName: string, id: string): Observable<boolean> { return this._collection(collectionName).destroyById(id); } get<T>(collectionName: string, id: string): Observable<T> { return this._collection(collectionName).findById(id).map(copyObject); } save<T>(collectionName: string, doc: Entity): Observable<T> { const hasId = Object.keys(doc).indexOf('_id') > -1 && doc['_id']; if (!hasId) { return this._collection(collectionName).create(doc).map(copyObject); } else { return this._collection(collectionName) .update(this._buildQueryWhereForId(doc['_id']), doc) .mapTo(doc); } } updateAttributes<T>(collectionName: string, id: string, attributes: Entity): Observable<T> { delete attributes['_id']; return this.get<T>(collectionName, id) .map(result => Object.assign(result, attributes)) .mergeMap(doc => this.save<T>(collectionName, doc)); } }