diff --git a/package.json b/package.json index fe07e6e69..70dfa56fd 100644 --- a/package.json +++ b/package.json @@ -14,12 +14,12 @@ "extract": "ngx-translate-extract --input ./src --output ./src/assets/i18n/app.pot --clean --sort --format pot" }, "dependencies": { - "@angular/common": "4.1.3", - "@angular/core": "4.1.3", - "@angular/forms": "4.1.3", - "@angular/http": "4.1.3", - "@angular/platform-browser": "4.1.3", - "@angular/platform-browser-dynamic": "4.1.3", + "@angular/common": "4.2.3", + "@angular/core": "4.2.3", + "@angular/forms": "4.2.3", + "@angular/http": "4.2.3", + "@angular/platform-browser": "4.2.3", + "@angular/platform-browser-dynamic": "4.2.3", "@angular/tsc-wrapped": "^4.3.2", "@biesbjerg/ngx-translate-po-http-loader": "^1.0.1", "@ionic-native/core": "3.12.1", @@ -38,9 +38,9 @@ "zone.js": "0.8.12" }, "devDependencies": { - "@angular/cli": "^1.2.5", - "@angular/compiler": "^4.3.1", - "@angular/compiler-cli": "^4.3.1", + "@angular/cli": "^1.2.7", + "@angular/compiler": "4.2.3", + "@angular/compiler-cli": "4.2.3", "@ionic/app-scripts": "2.0.2", "@ionic/cli-plugin-cordova": "1.5.0", "@ionic/cli-plugin-ionic-angular": "1.4.0", @@ -50,7 +50,7 @@ "@types/node": "^8.0.19", "codecov": "^2.2.0", "@biesbjerg/ngx-translate-extract": "^2.3.2", - "ionic": "3.6.0", + "ionic": "3.7.0", "pre-commit": "^1.2.2", "jasmine-core": "^2.6.4", "jasmine-spec-reporter": "^4.1.1", diff --git a/src/app/app.module.ts b/src/app/app.module.ts index a4f90e359..a7fe739b7 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -2,7 +2,7 @@ import { NgModule, ErrorHandler } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { HttpModule, Http } from '@angular/http'; -import { NgLoggerModule, Level } from '@nsalaun/ng-logger'; +import { NgLoggerModule, Logger, Level } from '@nsalaun/ng-logger'; import { TranslateModule, TranslateLoader } from '@ngx-translate/core'; import { TranslatePoHttpLoader } from '@biesbjerg/ngx-translate-po-http-loader'; @@ -22,12 +22,12 @@ import { StatusBar } from '@ionic-native/status-bar'; import { SplashScreen } from '@ionic-native/splash-screen'; import { WalletProvider } from '../providers/wallet/wallet'; -import { PersistenceProvider } from '../providers/persistence/persistence'; +import { PersistenceProvider, persistenceProviderFactory } from '../providers/persistence/persistence'; import { AppProvider } from '../providers/app/app'; import { PlatformProvider } from '../providers/platform/platform'; export function createTranslateLoader(http: Http) { - return new TranslatePoHttpLoader(http, './assets/i18n/', '.po'); + return new TranslatePoHttpLoader(http, './assets/i18n/', '.po'); } @NgModule({ @@ -70,7 +70,7 @@ export function createTranslateLoader(http: Http) { SplashScreen, { provide: ErrorHandler, useClass: IonicErrorHandler }, WalletProvider, - PersistenceProvider, + { provide: PersistenceProvider, useFactory: persistenceProviderFactory, deps: [PlatformProvider, Logger], multi: true }, AppProvider, PlatformProvider ] diff --git a/src/providers/persistence/persistence.spec.ts b/src/providers/persistence/persistence.spec.ts index 389244500..8afe5f9c9 100644 --- a/src/providers/persistence/persistence.spec.ts +++ b/src/providers/persistence/persistence.spec.ts @@ -2,15 +2,19 @@ import { TestBed, inject } from '@angular/core/testing'; import { PersistenceProvider } from './persistence'; import { IStorage, ISTORAGE, KeyAlreadyExistsError } from './storage/istorage'; import { RamStorage } from './storage/ram-storage'; -import { Logger } from '@nsalaun/ng-logger'; +import { LocalStorage } from './storage/local-storage'; +import { Logger, Level as LoggerLevel } from '@nsalaun/ng-logger'; +import { PlatformProvider } from '../platform/platform'; +import { Platform } from 'ionic-angular'; describe('Storage Service', () => { beforeEach(() => { TestBed.configureTestingModule({ providers: [ PersistenceProvider, - { provide: ISTORAGE, useClass: RamStorage }, - { provide: Logger }, + { provide: Logger, useValue: new Logger(LoggerLevel.DEBUG) }, + { provide: PlatformProvider }, + { provide: ISTORAGE, useClass: RamStorage, deps: [PlatformProvider, Logger] }, ] }); }); @@ -22,20 +26,25 @@ describe('Storage Service', () => { })); it('should correctly perform a profile roundtrip', () => { let p = { name: 'My profile' }; - service.storeNewProfile(p).then(() => { - service.getProfile().then((profile) => { + service.storeNewProfile(p) + .catch((err) => expect(err).toBeNull) + .then(() => { + return service.getProfile(); + }) + .then((profile) => { expect(typeof profile).toEqual('object'); expect(profile.name).toEqual('My profile'); }); - }); }); + it('should fail to create a profile when one already exists', () => { let p = { name: 'My profile' }; - service.storeNewProfile(p).then(() => { - service.storeNewProfile(p).catch((err) => { + service.storeNewProfile(p) + .then(() => { + return service.storeNewProfile(p); + }).catch((err) => { expect(err.message).toEqual('Key already exists'); }); - }); }); }); -}); \ No newline at end of file +}); diff --git a/src/providers/persistence/persistence.ts b/src/providers/persistence/persistence.ts index 12fd460af..23c3e9186 100644 --- a/src/providers/persistence/persistence.ts +++ b/src/providers/persistence/persistence.ts @@ -1,9 +1,13 @@ import { Injectable } from '@angular/core'; import { InjectionToken, Inject } from '@angular/core'; -import { IStorage, ISTORAGE } from './storage/istorage'; import { Logger } from '@nsalaun/ng-logger'; import * as _ from 'lodash'; +import { IStorage, ISTORAGE } from './storage/istorage'; +import { PlatformProvider } from '../platform/platform'; +import { LocalStorage } from './storage/local-storage'; +import { RamStorage } from './storage/ram-storage'; + const Keys = { ADDRESS_BOOK: network => 'addressbook-' + network, AGREE_DISCLAIMER: 'agreeDisclaimer', @@ -33,10 +37,15 @@ const Keys = { TX_HISTORY: walletId => 'txsHistory-' + walletId, }; +export let persistenceProviderFactory = (platform: PlatformProvider, log: Logger) => { + let storage = new RamStorage(platform, log); + return new PersistenceProvider(storage, log); +}; + @Injectable() export class PersistenceProvider { constructor( @Inject(ISTORAGE) public storage: IStorage, private log: Logger) { - } + }; storeNewProfile(profile): Promise { return this.storage.create(Keys.PROFILE, profile); @@ -305,11 +314,8 @@ export class PersistenceProvider { removeAllWalletData(walletId: string): Promise { return this.clearLastAddress(walletId) - .then(() => { - return this.removeTxHistory(walletId); - }).then(() => { - return this.clearBackupFlag(walletId); - }); + .then(() => { return this.removeTxHistory(walletId); }) + .then(() => { return this.clearBackupFlag(walletId); }); }; setAmazonGiftCards(network: string, gcs: any): Promise { @@ -394,12 +400,13 @@ export class PersistenceProvider { // token: card token // ] setBitpayDebitCards(network: string, email: string, cards: any): Promise { - return this.getBitpayAccounts(network).then(allAccounts => { - allAccounts = allAccounts || {}; - if (!allAccounts[email]) throw new Error('Cannot set cards for unknown account ' + email); - allAccounts[email].cards = cards; - return this.storage.set(Keys.BITPAY_ACCOUNTS_V2(network), allAccounts); - }); + return this.getBitpayAccounts(network) + .then(allAccounts => { + allAccounts = allAccounts || {}; + if (!allAccounts[email]) throw new Error('Cannot set cards for unknown account ' + email); + allAccounts[email].cards = cards; + return this.storage.set(Keys.BITPAY_ACCOUNTS_V2(network), allAccounts); + }); }; // cards: [ @@ -410,32 +417,34 @@ export class PersistenceProvider { // email: account email // ] getBitpayDebitCards(network: string): Promise { - return this.getBitpayAccounts(network).then(allAccounts => { - let allCards = []; - _.each(allAccounts, (account, email) => { - if (account.cards) { - // Add account's email to each card - var cards = _.clone(account.cards); - _.each(cards, function (x) { - x.email = email; - }); + return this.getBitpayAccounts(network) + .then(allAccounts => { + let allCards = []; + _.each(allAccounts, (account, email) => { + if (account.cards) { + // Add account's email to each card + var cards = _.clone(account.cards); + _.each(cards, function (x) { + x.email = email; + }); - allCards = allCards.concat(cards); - } + allCards = allCards.concat(cards); + } + }); + return allCards; }); - return allCards; - }); }; removeBitpayDebitCard(network: string, cardEid: string): Promise { - return this.getBitpayAccounts(network).then(allAccounts => { - _.each(allAccounts, function (account) { - account.cards = _.reject(account.cards, { - eid: cardEid + return this.getBitpayAccounts(network) + .then(allAccounts => { + return _.each(allAccounts, function (account) { + account.cards = _.reject(account.cards, { + eid: cardEid + }); }); + }).then(allAccounts => { + return this.storage.set(Keys.BITPAY_ACCOUNTS_V2(network), allAccounts); }); - - return this.storage.set(Keys.BITPAY_ACCOUNTS_V2(network), allAccounts); - }); }; } diff --git a/src/providers/persistence/storage/local-storage.ts b/src/providers/persistence/storage/local-storage.ts index 0be6ec308..1d232be5d 100644 --- a/src/providers/persistence/storage/local-storage.ts +++ b/src/providers/persistence/storage/local-storage.ts @@ -28,7 +28,7 @@ export class LocalStorage implements IStorage { } set(k: string, v: any): Promise { - return new Promise((resolve) => { + return Promise.resolve().then(() => { if (_.isObject(v)) { v = JSON.stringify(v); } @@ -37,7 +37,6 @@ export class LocalStorage implements IStorage { } this.ls.setItem(k, v); - resolve(); }); } diff --git a/src/providers/persistence/storage/ram-storage.ts b/src/providers/persistence/storage/ram-storage.ts index 5b7c57aca..734779c7a 100644 --- a/src/providers/persistence/storage/ram-storage.ts +++ b/src/providers/persistence/storage/ram-storage.ts @@ -1,13 +1,17 @@ import { IStorage, KeyAlreadyExistsError } from './istorage'; +import { PlatformProvider } from '../../platform/platform'; +import { Logger } from '@nsalaun/ng-logger'; export class RamStorage implements IStorage { hash = {}; + constructor(private platform: PlatformProvider, private log: Logger) { } + get(k: string): Promise { return Promise.resolve(this.hash[k]); }; set(k: string, v: any): Promise { - return Promise.resolve().then(() => this.hash[k] = v); + return Promise.resolve().then(() => { this.hash[k] = v }); }; remove(k: string): Promise { return Promise.resolve().then(() => { delete this.hash[k]; });