Skip to content

Commit 305da8a

Browse files
committed
Added RepositoryFactory
Fixed deadline test to work when your timezone is not UTC Updated services to use repositories rather than http objects.
1 parent 477e7e2 commit 305da8a

31 files changed

+696
-287
lines changed

e2e/infrastructure/AccountHttp.spec.ts

Lines changed: 85 additions & 75 deletions
Large diffs are not rendered by default.

e2e/service/TransactionService.spec.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import { SignedTransaction } from '../../src/model/transaction/SignedTransaction
4444
import { TransferTransaction } from '../../src/model/transaction/TransferTransaction';
4545
import { UInt64 } from '../../src/model/UInt64';
4646
import { TransactionService } from '../../src/service/TransactionService';
47+
import { ReceiptHttp } from "../../src/infrastructure/ReceiptHttp";
4748

4849
describe('TransactionService', () => {
4950
let account: Account;
@@ -454,7 +455,7 @@ describe('TransactionService', () => {
454455

455456
describe('should return resolved transaction', () => {
456457
it('call transaction service', (done) => {
457-
const transactionService = new TransactionService(url);
458+
const transactionService = new TransactionService(new TransactionHttp(url), new ReceiptHttp(url));
458459
transactionService.resolveAliases(transactionHashes).subscribe((transactions) => {
459460
expect(transactions.length).to.be.equal(8);
460461
transactions.map((tx) => {
@@ -480,7 +481,7 @@ describe('TransactionService', () => {
480481

481482
describe('Test resolve alias with multiple transaction in single block', () => {
482483
it('call transaction service', (done) => {
483-
const transactionService = new TransactionService(url);
484+
const transactionService = new TransactionService(new TransactionHttp(url), new ReceiptHttp(url));
484485
transactionService.resolveAliases(transactionHashesMultiple).subscribe((tx) => {
485486
expect(tx.length).to.be.equal(3);
486487
expect((tx[0] as TransferTransaction).mosaics[0].id.toHex()).to.be.equal(mosaicId.toHex());

e2e/service/TransactionService_AggregateBonded.spec.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import { TransferTransaction } from '../../src/model/transaction/TransferTransac
3535
import { UInt64 } from '../../src/model/UInt64';
3636
import { TransactionService } from '../../src/service/TransactionService';
3737
import { TransactionUtils } from '../infrastructure/TransactionUtils';
38+
import { ReceiptHttp } from "../../src/infrastructure/ReceiptHttp";
3839

3940
describe('TransactionService', () => {
4041
let account: Account;
@@ -69,7 +70,7 @@ describe('TransactionService', () => {
6970
generationHash = json.generationHash;
7071
transactionHttp = new TransactionHttp(url);
7172
namespaceHttp = new NamespaceHttp(url);
72-
transactionService = new TransactionService(url);
73+
transactionService = new TransactionService(new TransactionHttp(url), new ReceiptHttp(url));
7374
done();
7475
});
7576
});

src/infrastructure/BlockHttp.ts

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,22 @@
1414
* limitations under the License.
1515
*/
1616

17-
import {from as observableFrom, Observable, throwError} from 'rxjs';
18-
import {catchError, map} from 'rxjs/operators';
19-
import {PublicAccount} from '../model/account/PublicAccount';
20-
import {BlockInfo} from '../model/blockchain/BlockInfo';
17+
import { from as observableFrom, Observable, throwError } from 'rxjs';
18+
import { catchError, map } from 'rxjs/operators';
19+
import { PublicAccount } from '../model/account/PublicAccount';
20+
import { BlockInfo } from '../model/blockchain/BlockInfo';
2121
import { MerklePathItem } from '../model/blockchain/MerklePathItem';
2222
import { MerkleProofInfo } from '../model/blockchain/MerkleProofInfo';
23-
import { NetworkType } from '../model/blockchain/NetworkType';
24-
import {Transaction} from '../model/transaction/Transaction';
25-
import {UInt64} from '../model/UInt64';
23+
import { Transaction } from '../model/transaction/Transaction';
24+
import { UInt64 } from '../model/UInt64';
2625
import { BlockInfoDTO, BlockRoutesApi } from './api';
27-
import {BlockRepository} from './BlockRepository';
28-
import {Http} from './Http';
29-
import {QueryParams} from './QueryParams';
30-
import {CreateTransactionFromDTO, extractBeneficiary} from './transaction/CreateTransactionFromDTO';
26+
import { BlockRepository } from './BlockRepository';
27+
import { Http } from './Http';
28+
import { QueryParams } from './QueryParams';
29+
import {
30+
CreateTransactionFromDTO,
31+
extractBeneficiary
32+
} from './transaction/CreateTransactionFromDTO';
3133

3234
/**
3335
* Blocks returned limits:
@@ -43,6 +45,7 @@ export enum LimitType {
4345
N_100 = 100,
4446

4547
}
48+
4649
/**
4750
* Blockchain http repository.
4851
*
@@ -53,15 +56,14 @@ export class BlockHttp extends Http implements BlockRepository {
5356
* @internal
5457
* Nem2 Library block routes api
5558
*/
56-
private blockRoutesApi: BlockRoutesApi;
59+
private readonly blockRoutesApi: BlockRoutesApi;
5760

5861
/**
5962
* Constructor
6063
* @param url
61-
* @param networkType
6264
*/
63-
constructor(url: string, networkType?: NetworkType) {
64-
super(url, networkType);
65+
constructor(url: string) {
66+
super(url);
6567
this.blockRoutesApi = new BlockRoutesApi(url);
6668
}
6769

src/infrastructure/Http.ts

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -15,44 +15,37 @@
1515
*/
1616

1717
// tslint:disable-next-line: ordered-imports
18-
import {from as observableFrom, Observable, of as observableOf, throwError} from 'rxjs';
19-
import {catchError, map} from 'rxjs/operators';
20-
import {NetworkType} from '../model/blockchain/NetworkType';
21-
import { NodeRoutesApi } from './api/apis';
18+
import { from as observableFrom, Observable, of as observableOf, throwError } from 'rxjs';
19+
import { NetworkType } from '../model/blockchain/NetworkType';
2220
import { QueryParams } from './QueryParams';
21+
import { NodeRoutesApi } from "./api/nodeRoutesApi";
22+
import { catchError, map, share, shareReplay } from 'rxjs/operators';
23+
2324
/**
2425
* Http extended by all http services
2526
*/
2627
export abstract class Http {
2728
protected readonly url: string;
28-
protected networkType: NetworkType;
2929

3030
/**
3131
* Constructor
3232
* @param url Base catapult-rest url
33-
* @param networkType
3433
*/
35-
constructor(url: string, networkType?: NetworkType) {
36-
if (networkType) {
37-
this.networkType = networkType;
38-
}
34+
constructor(url: string) {
3935
this.url = url;
4036
}
4137

42-
getNetworkTypeObservable(): Observable<NetworkType> {
43-
let networkTypeResolve;
44-
if (!this.networkType) {
45-
networkTypeResolve = observableFrom(new NodeRoutesApi(this.url).getNodeInfo()).pipe(
46-
map(({body}) => {
47-
this.networkType = body.networkIdentifier;
48-
return body.networkIdentifier;
49-
}),
50-
catchError((error) => throwError(this.errorHandling(error))),
51-
);
38+
createNetworkTypeObservable(networkType?: NetworkType | Observable<NetworkType>): Observable<NetworkType> {
39+
if (networkType && networkType instanceof Observable) {
40+
return networkType as Observable<NetworkType>;
41+
} else if (networkType) {
42+
return observableOf(networkType as NetworkType);
5243
} else {
53-
networkTypeResolve = observableOf(this.networkType);
44+
return observableFrom(new NodeRoutesApi(this.url).getNodeInfo()).pipe(
45+
map(({body}) => body.networkIdentifier),
46+
catchError((error) => throwError(this.errorHandling(error))),
47+
).pipe(shareReplay(1));
5448
}
55-
return networkTypeResolve;
5649
}
5750

5851
queryParams(queryParams?: QueryParams): any {

src/infrastructure/MetadataHttp.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,16 +40,21 @@ export class MetadataHttp extends Http implements MetadataRepository {
4040
* @internal
4141
* Nem2 Library metadata routes api
4242
*/
43-
private metadataRoutesApi: MetadataRoutesApi;
44-
43+
private readonly metadataRoutesApi: MetadataRoutesApi;
44+
/**
45+
* @internal
46+
* network type for the mappings.
47+
*/
48+
private readonly networkTypeObservable: Observable<NetworkType>;
4549
/**
4650
* Constructor
4751
* @param url
4852
* @param networkType
4953
*/
50-
constructor(url: string, networkType?: NetworkType) {
51-
super(url, networkType);
54+
constructor(url: string, networkType?: NetworkType | Observable<NetworkType>) {
55+
super(url);
5256
this.metadataRoutesApi = new MetadataRoutesApi(url);
57+
this.networkTypeObservable = this.createNetworkTypeObservable(networkType);
5358
}
5459

5560
/**

src/infrastructure/MosaicHttp.ts

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,16 +37,22 @@ export class MosaicHttp extends Http implements MosaicRepository {
3737
* @internal
3838
* Nem2 Library mosaic routes api
3939
*/
40-
private mosaicRoutesApi: MosaicRoutesApi;
40+
private readonly mosaicRoutesApi: MosaicRoutesApi;
4141

42+
/**
43+
* @internal
44+
* network type for the mappings.
45+
*/
46+
private readonly networkTypeObservable: Observable<NetworkType>;
4247
/**
4348
* Constructor
4449
* @param url
4550
* @param networkType
4651
*/
47-
constructor(url: string, networkType?: NetworkType) {
48-
super(url, networkType);
52+
constructor(url: string, networkType?: NetworkType | Observable<NetworkType>) {
53+
super(url);
4954
this.mosaicRoutesApi = new MosaicRoutesApi(url);
55+
this.networkTypeObservable = this.createNetworkTypeObservable(networkType);
5056
}
5157

5258
/**
@@ -55,7 +61,7 @@ export class MosaicHttp extends Http implements MosaicRepository {
5561
* @returns Observable<MosaicInfo>
5662
*/
5763
public getMosaic(mosaicId: MosaicId): Observable<MosaicInfo> {
58-
return this.getNetworkTypeObservable().pipe(
64+
return this.networkTypeObservable.pipe(
5965
mergeMap((networkType) => observableFrom(
6066
this.mosaicRoutesApi.getMosaic(mosaicId.toHex())).pipe(
6167
map(({body}) => new MosaicInfo(
@@ -82,7 +88,7 @@ export class MosaicHttp extends Http implements MosaicRepository {
8288
const mosaicIdsBody = {
8389
mosaicIds: mosaicIds.map((id) => id.toHex()),
8490
};
85-
return this.getNetworkTypeObservable().pipe(
91+
return this.networkTypeObservable.pipe(
8692
mergeMap((networkType) => observableFrom(
8793
this.mosaicRoutesApi.getMosaics(mosaicIdsBody)).pipe(
8894
map(({body}) => body.map((mosaicInfoDTO) => {
@@ -109,7 +115,7 @@ export class MosaicHttp extends Http implements MosaicRepository {
109115
* @param address Account address.
110116
*/
111117
public getMosaicsFromAccount(address: Address): Observable<MosaicInfo[]> {
112-
return this.getNetworkTypeObservable().pipe(
118+
return this.networkTypeObservable.pipe(
113119
mergeMap((networkType) => observableFrom(
114120
this.mosaicRoutesApi.getMosaicsFromAccount(address.plain())).pipe(
115121
map(({body}) => body.mosaics.map((mosaicInfo) =>
@@ -136,7 +142,7 @@ export class MosaicHttp extends Http implements MosaicRepository {
136142
const accountIdsBody = {
137143
addresses: addresses.map((address) => address.plain()),
138144
};
139-
return this.getNetworkTypeObservable().pipe(
145+
return this.networkTypeObservable.pipe(
140146
mergeMap((networkType) => observableFrom(
141147
this.mosaicRoutesApi.getMosaicsFromAccounts(accountIdsBody)).pipe(
142148
map(({body}) => body.mosaics.map((mosaicInfoDTO) => {

src/infrastructure/MultisigHttp.ts

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,16 +35,21 @@ export class MultisigHttp extends Http implements MultisigRepository {
3535
* @internal
3636
* Nem2 Library account routes api
3737
*/
38-
private multisigRoutesApi: MultisigRoutesApi;
39-
38+
private readonly multisigRoutesApi: MultisigRoutesApi;
39+
/**
40+
* @internal
41+
* network type for the mappings.
42+
*/
43+
private readonly networkTypeObservable: Observable<NetworkType>;
4044
/**
4145
* Constructor
4246
* @param url
4347
* @param networkType
4448
*/
45-
constructor(url: string, networkType?: NetworkType) {
46-
super(url, networkType);
49+
constructor(url: string, networkType?: NetworkType | Observable<NetworkType>) {
50+
super(url);
4751
this.multisigRoutesApi = new MultisigRoutesApi(url);
52+
this.networkTypeObservable = this.createNetworkTypeObservable(networkType);
4853
}
4954

5055
/**
@@ -53,7 +58,7 @@ export class MultisigHttp extends Http implements MultisigRepository {
5358
* @returns Observable<MultisigAccountInfo>
5459
*/
5560
public getMultisigAccountInfo(address: Address): Observable<MultisigAccountInfo> {
56-
return this.getNetworkTypeObservable().pipe(
61+
return this.networkTypeObservable.pipe(
5762
mergeMap((networkType) => observableFrom(
5863
this.multisigRoutesApi.getAccountMultisig(address.plain()))
5964
.pipe(map(({body}) => new MultisigAccountInfo(
@@ -75,7 +80,7 @@ export class MultisigHttp extends Http implements MultisigRepository {
7580
* @returns Observable<MultisigAccountGraphInfo>
7681
*/
7782
public getMultisigAccountGraphInfo(address: Address): Observable<MultisigAccountGraphInfo> {
78-
return this.getNetworkTypeObservable().pipe(
83+
return this.networkTypeObservable.pipe(
7984
mergeMap((networkType) => observableFrom(
8085
this.multisigRoutesApi.getAccountMultisigGraph(address.plain()))
8186
.pipe(map(({body}) => {

src/infrastructure/NamespaceHttp.ts

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,20 @@ export class NamespaceHttp extends Http implements NamespaceRepository {
4848
*/
4949
private namespaceRoutesApi: NamespaceRoutesApi;
5050

51+
/**
52+
* @internal
53+
* network type for the mappings.
54+
*/
55+
private readonly networkTypeObservable: Observable<NetworkType>;
5156
/**
5257
* Constructor
5358
* @param url
5459
* @param networkType
5560
*/
56-
constructor(url: string, networkType?: NetworkType) {
57-
super(url, networkType);
61+
constructor(url: string, networkType?: NetworkType | Observable<NetworkType>) {
62+
super(url);
5863
this.namespaceRoutesApi = new NamespaceRoutesApi(url);
64+
this.networkTypeObservable = this.createNetworkTypeObservable(networkType);
5965
}
6066

6167
/**
@@ -111,7 +117,7 @@ export class NamespaceHttp extends Http implements NamespaceRepository {
111117
* @returns Observable<NamespaceInfo>
112118
*/
113119
public getNamespace(namespaceId: NamespaceId): Observable<NamespaceInfo> {
114-
return this.getNetworkTypeObservable().pipe(
120+
return this.networkTypeObservable.pipe(
115121
mergeMap((networkType) => observableFrom(
116122
this.namespaceRoutesApi.getNamespace(namespaceId.toHex())).pipe(
117123
map(({body}) => new NamespaceInfo(
@@ -141,7 +147,7 @@ export class NamespaceHttp extends Http implements NamespaceRepository {
141147
*/
142148
public getNamespacesFromAccount(address: Address,
143149
queryParams?: QueryParams): Observable<NamespaceInfo[]> {
144-
return this.getNetworkTypeObservable().pipe(
150+
return this.networkTypeObservable.pipe(
145151
mergeMap((networkType) => observableFrom(
146152
this.namespaceRoutesApi.getNamespacesFromAccount(address.plain(),
147153
this.queryParams(queryParams).pageSize,
@@ -178,7 +184,7 @@ export class NamespaceHttp extends Http implements NamespaceRepository {
178184
const publicKeysBody = {
179185
addresses: addresses.map((address) => address.plain()),
180186
};
181-
return this.getNetworkTypeObservable().pipe(
187+
return this.networkTypeObservable.pipe(
182188
mergeMap((networkType) => observableFrom(
183189
this.namespaceRoutesApi.getNamespacesFromAccounts(publicKeysBody)).pipe(
184190
map(({body}) => body.namespaces.map((namespaceInfoDTO) => {
@@ -229,7 +235,7 @@ export class NamespaceHttp extends Http implements NamespaceRepository {
229235
* @returns Observable<MosaicId | null>
230236
*/
231237
public getLinkedMosaicId(namespaceId: NamespaceId): Observable<MosaicId> {
232-
return this.getNetworkTypeObservable().pipe(
238+
return this.networkTypeObservable.pipe(
233239
mergeMap(() => observableFrom(
234240
this.namespaceRoutesApi.getNamespace(namespaceId.toHex())).pipe(
235241
map(({body}) => {
@@ -257,7 +263,7 @@ export class NamespaceHttp extends Http implements NamespaceRepository {
257263
* @returns Observable<Address>
258264
*/
259265
public getLinkedAddress(namespaceId: NamespaceId): Observable<Address> {
260-
return this.getNetworkTypeObservable().pipe(
266+
return this.networkTypeObservable.pipe(
261267
mergeMap(() => observableFrom(
262268
this.namespaceRoutesApi.getNamespace(namespaceId.toHex())).pipe(
263269
map(({body}) => {

src/infrastructure/NodeHttp.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,14 @@
1414
* limitations under the License.
1515
*/
1616

17-
import {from as observableFrom, Observable, throwError} from 'rxjs';
18-
import {catchError, map} from 'rxjs/operators';
17+
import { from as observableFrom, Observable, throwError } from 'rxjs';
18+
import { catchError, map } from 'rxjs/operators';
1919
import { NodeInfo } from '../model/node/NodeInfo';
2020
import { NodeTime } from '../model/node/NodeTime';
2121
import { UInt64 } from '../model/UInt64';
2222
import { NodeRoutesApi } from './api';
23-
import {Http} from './Http';
24-
import {NodeRepository} from './NodeRepository';
23+
import { Http } from './Http';
24+
import { NodeRepository } from './NodeRepository';
2525

2626
/**
2727
* Node http repository.

0 commit comments

Comments
 (0)