From 1dc8b22eaf9bb5bc8c4e5bfeaa4348fcb0426141 Mon Sep 17 00:00:00 2001 From: Ivan Socolsky Date: Mon, 7 Aug 2017 14:29:34 -0300 Subject: [PATCH] add storage provider --- package.json | 4 +- src/app/app.component.ts | 4 +- src/app/app.module.ts | 14 +++--- src/pages/about/about.ts | 4 +- src/pages/setting/setting.ts | 2 +- src/providers/storage/istorage.ts | 10 ++++ src/providers/storage/local-storage.spec.ts | 11 ----- src/providers/storage/local-storage.ts | 50 ++++++++++++++++++- src/providers/storage/storage.spec.ts | 53 +++++++++++++++++++-- src/providers/storage/storage.ts | 30 ++++++++++-- tsconfig.json | 1 + 11 files changed, 147 insertions(+), 36 deletions(-) create mode 100644 src/providers/storage/istorage.ts delete mode 100644 src/providers/storage/local-storage.spec.ts diff --git a/package.json b/package.json index c8d36b4d1..a9989b0e5 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,6 @@ }, "dependencies": { "@angular/common": "4.1.3", - "@angular/compiler": "4.1.3", - "@angular/compiler-cli": "4.1.3", "@angular/core": "4.1.3", "@angular/forms": "4.1.3", "@angular/http": "4.1.3", @@ -46,7 +44,7 @@ "@types/chrome": "0.0.47", "@types/jasmine": "^2.5.53", "@types/lodash": "^4.14.71", - "@types/node": "^8.0.17", + "@types/node": "^8.0.19", "codecov": "^2.2.0", "ionic": "3.6.0", "jasmine-core": "^2.6.4", diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 957b5b54c..93b7bd2b3 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -4,7 +4,7 @@ import { StatusBar } from '@ionic-native/status-bar'; import { SplashScreen } from '@ionic-native/splash-screen'; import { Logger } from '@nsalaun/ng-logger'; -import { AppProvider } from '../providers/app-provider/app-provider'; +import { AppProvider } from '../providers/app/app'; import { TabsPage } from '../pages/tabs/tabs'; @@ -12,7 +12,7 @@ import { TabsPage } from '../pages/tabs/tabs'; templateUrl: 'app.html' }) export class Copay { - rootPage:any = TabsPage; + rootPage: any = TabsPage; constructor( platform: Platform, diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 0fcbf0bdb..266733251 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -19,15 +19,15 @@ import { TermsOfUsePage } from '../pages/terms-of-use/terms-of-use'; import { StatusBar } from '@ionic-native/status-bar'; import { SplashScreen } from '@ionic-native/splash-screen'; -import { WalletProvider } from '../providers/wallet-provider/wallet-provider'; -import { StorageProvider } from '../providers/storage-provider/storage-provider'; -import { AppProvider } from '../providers/app-provider/app-provider'; +import { WalletProvider } from '../providers/wallet/wallet'; +import { StorageProvider } from '../providers/storage/storage'; +import { AppProvider } from '../providers/app/app'; import { PlatformProvider } from '../providers/platform/platform'; // Set different log level depending on environment. const LOG_LEVEL = Level.LOG; -if (isDevMode()){ - const LOG_LEVEL = Level.ERROR; +if (isDevMode()) { + const LOG_LEVEL = Level.ERROR; } @NgModule({ @@ -61,11 +61,11 @@ if (isDevMode()){ providers: [ StatusBar, SplashScreen, - {provide: ErrorHandler, useClass: IonicErrorHandler}, + { provide: ErrorHandler, useClass: IonicErrorHandler }, WalletProvider, StorageProvider, AppProvider, PlatformProvider ] }) -export class AppModule {} +export class AppModule { } diff --git a/src/pages/about/about.ts b/src/pages/about/about.ts index 987998599..690b22be6 100644 --- a/src/pages/about/about.ts +++ b/src/pages/about/about.ts @@ -5,7 +5,7 @@ import { Logger } from '@nsalaun/ng-logger'; import { TermsOfUsePage } from '../terms-of-use/terms-of-use'; -import { AppProvider } from '../../providers/app-provider/app-provider'; +import { AppProvider } from '../../providers/app/app'; @Component({ selector: 'page-about', @@ -20,7 +20,7 @@ export class AboutPage { public navParams: NavParams, private app: AppProvider, private log: Logger - ) {} + ) { } ionViewDidLoad() { this.log.log('ionViewDidLoad AboutPage'); diff --git a/src/pages/setting/setting.ts b/src/pages/setting/setting.ts index e6e8ebb2c..d05aa2608 100644 --- a/src/pages/setting/setting.ts +++ b/src/pages/setting/setting.ts @@ -1,7 +1,7 @@ import { Component } from '@angular/core'; import { NavController, NavParams } from 'ionic-angular'; -import { AppProvider } from '../../providers/app-provider/app-provider'; +import { AppProvider } from '../../providers/app/app'; import { AboutPage } from '../about/about'; diff --git a/src/providers/storage/istorage.ts b/src/providers/storage/istorage.ts new file mode 100644 index 000000000..794d57e27 --- /dev/null +++ b/src/providers/storage/istorage.ts @@ -0,0 +1,10 @@ +import { InjectionToken } from '@angular/core'; + +export interface IStorage { + get(k: string, cb: (err: Error, v: string) => void); + set(k: string, v: any, cb: (err: Error) => void); + remove(k: string, cb: (err: Error) => void); + create(k: string, v: any, cb: (err: Error) => void); +} + +export let ISTORAGE = new InjectionToken('storage'); diff --git a/src/providers/storage/local-storage.spec.ts b/src/providers/storage/local-storage.spec.ts deleted file mode 100644 index fa7895e67..000000000 --- a/src/providers/storage/local-storage.spec.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { LocalStorage } from './local-storage'; - -describe('Local Storage', () => { - it('should do nothing', () => { - expect(true).toBeTruthy(); - }); - it('should get', () => { - var storage = new LocalStorage(); - expect(storage.get('myKey')).toEqual('myKey'); - }); -}); \ No newline at end of file diff --git a/src/providers/storage/local-storage.ts b/src/providers/storage/local-storage.ts index e509e9e48..741f2f52a 100644 --- a/src/providers/storage/local-storage.ts +++ b/src/providers/storage/local-storage.ts @@ -1,7 +1,53 @@ +import { Injectable } from '@angular/core'; import { PlatformProvider } from '../platform/platform'; import { Logger } from '@nsalaun/ng-logger'; +import * as _ from 'lodash'; -export class LocalStorage { - constructor(private platform: PlatformProvider, private log: Logger) { +import { IStorage } from './istorage'; + +export class KeyAlreadyExistsError extends Error { + constructor() { + super('Key already exists'); + } +} + +@Injectable() +export class LocalStorage implements IStorage { + ls: Storage; + constructor(private platform: PlatformProvider, private log: Logger) { + this.ls = (typeof window.localStorage !== "undefined") ? window.localStorage : null; + if (!this.ls) throw new Error('localstorage not available'); + } + + get(k: string, cb: (err: Error, v: string) => void) { + return cb(null, this.ls.getItem(k)); + } + + set(k: string, v: any, cb: (err: Error) => void) { + if (_.isObject(v)) { + v = JSON.stringify(v); + } + if (v && !_.isString(v)) { + v = v.toString(); + } + + this.ls.setItem(k, v); + return cb(null); + } + + remove(k: string, cb: (err: Error) => void) { + this.ls.removeItem(k); + return cb(null); + } + + create(k: string, v: any, cb: (err: Error) => void) { + this.get(k, + function (err, data) { + if (data) { + return cb(new KeyAlreadyExistsError()); + } else { + return this.set(k, v, cb); + } + }) } } diff --git a/src/providers/storage/storage.spec.ts b/src/providers/storage/storage.spec.ts index bdadf5b39..6bf673637 100644 --- a/src/providers/storage/storage.spec.ts +++ b/src/providers/storage/storage.spec.ts @@ -1,7 +1,52 @@ -import { StorageProvider } from './storage-provider'; - +import { TestBed, inject } from '@angular/core/testing'; +import { StorageProvider } from './storage'; +import { LocalStorage, KeyAlreadyExistsError } from './local-storage'; +import { IStorage, ISTORAGE } from './istorage'; + +class StorageMock implements IStorage { + hash = {}; + + get(k: string, cb: (err: Error, v: string) => void) { + return cb(null, this.hash[k]); + }; + set(k: string, v: any, cb: (err: Error) => void) { + this.hash[k] = v.toString(); + return cb(null); + }; + remove(k: string, cb: (err: Error) => void) { + delete this.hash[k]; + return cb(null); + }; + create(k: string, v: any, cb: (err: Error) => void) { + this.get(k, + function (err, data) { + if (data) { + return cb(new KeyAlreadyExistsError()); + } else { + this.set(k, v, cb); + } + }) + }; +} + describe('Storage Service', () => { - it('should do nothing', () => { - expect(true).toBeTruthy(); + let storage: IStorage = new StorageMock(); + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [ + StorageProvider, + { provide: ISTORAGE, useValue: storage }, + ] }); + }); + + it('should do nothing', inject([StorageProvider], (service: StorageProvider) => { + storage.set('profile', { name: 'john doe' }, (err) => { + service.getProfile((err, profile) => { + expect(err).toBeNull; + console.log(JSON.stringify(profile)); + expect(profile.name).toEqual('john doe'); + }); + }); + })); }); \ No newline at end of file diff --git a/src/providers/storage/storage.ts b/src/providers/storage/storage.ts index 08298e3f2..7e95f3eb5 100644 --- a/src/providers/storage/storage.ts +++ b/src/providers/storage/storage.ts @@ -1,10 +1,32 @@ import { Injectable } from '@angular/core'; -import { Platform } from 'ionic-angular'; - +import { InjectionToken, Inject } from '@angular/core'; +import { IStorage, ISTORAGE } from './istorage'; @Injectable() export class StorageProvider { - storage: - constructor(public platform: Platform) { + constructor( @Inject(ISTORAGE) private storage: IStorage) { } + + storeNewProfile(profile, cb) { + this.storage.create('profile', profile.toObj(), cb); + }; + + storeProfile(profile, cb) { + this.storage.set('profile', profile.toObj(), cb); + }; + + getProfile(cb) { + this.storage.get('profile', cb); + // decryptOnMobile(str, function (err, str) { + // if (err) return cb(err); + // var p, err; + // try { + // p = Profile.fromString(str); + // } catch (e) { + // $log.debug('Could not read profile:', e); + // err = new Error('Could not read profile:' + p); + // } + // return cb(err, p); + // }); + }; } diff --git a/tsconfig.json b/tsconfig.json index 0bc9009af..78eec9988 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -26,5 +26,6 @@ "types": [ "chrome", "lodash" + "node" ] }