import {Injectable} from '@angular/core'; import {PouchDBService} from '../database/pouchdb.service'; import {RecordCollection} from './record-collection'; import _ from 'lodash'; import {Observable, Subject} from 'rxjs/Rx'; import 'rxjs/Rx'; @Injectable() export class RecordStoreService { db: PouchDB; streams: IRecordStoreEmitters; constructor(dbService: PouchDBService) { this.db = dbService.createDatabase('records-collection'); this.streams = { put: new Subject() }; } put(collection: RecordCollection): Observable { const observable = Observable.fromPromise( this.db.put(collection.serialize()) ); observable.subscribe(info => { collection.rev = info.rev; this.streams.put.next(collection); }); return observable; } get(id: string): Observable { return Observable.fromPromise(this.db.get(id)) .map(res => new RecordCollection(res)); } remove(collection: RecordCollection): Observable { return Observable.fromPromise( this.db.remove(collection.id, collection.rev) ); } allDocs( opts: PouchAllDocsOptions = {include_docs: true}) : Observable { return Observable.fromPromise(this.db.allDocs(opts)) .map((res: PouchAllDocsResponse) => { return _.map( res.rows, row => new RecordCollection(row.doc) ); }); } } export interface IRecordStoreEmitters { put: Subject; }