From 516fb160c080d78664e002a07373ea23648076df Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?C=C3=A9dric=20Moreau?= <cem.moreau@gmail.com>
Date: Mon, 9 Apr 2018 09:36:45 +0200
Subject: [PATCH] [enh] Refactoring: type FileDAL.blockDAL

---
 app/lib/dal/fileDAL.ts                        |  5 +-
 app/lib/rules/global_rules.ts                 |  2 +-
 app/modules/bma/lib/controllers/blockchain.ts | 49 ++++++++++++++++++-
 app/modules/bma/lib/dtos.ts                   | 18 +++----
 app/modules/crawler/lib/sync.ts               |  2 +-
 app/modules/prover/lib/blockGenerator.ts      |  2 +-
 .../ws2p/lib/impl/WS2PReqMapperByServer.ts    |  7 +--
 .../ws2p/lib/interface/WS2PReqMapper.ts       |  2 +-
 app/service/IdentityService.ts                |  4 +-
 app/service/MembershipService.ts              |  2 +-
 10 files changed, 69 insertions(+), 24 deletions(-)

diff --git a/app/lib/dal/fileDAL.ts b/app/lib/dal/fileDAL.ts
index 04c5b2cd6..f0a9103a5 100644
--- a/app/lib/dal/fileDAL.ts
+++ b/app/lib/dal/fileDAL.ts
@@ -38,6 +38,7 @@ import {SIndexDAL} from "./sqliteDAL/index/SIndexDAL"
 import {IIndexDAL} from "./sqliteDAL/index/IIndexDAL"
 import {DataErrors} from "../common-libs/errors"
 import {BasicRevocableIdentity, IdentityDTO} from "../dto/IdentityDTO"
+import {BlockDAL} from "./sqliteDAL/BlockDAL"
 
 const fs      = require('fs')
 const path    = require('path')
@@ -66,7 +67,7 @@ export class FileDAL {
   confDAL:ConfDAL
   metaDAL:MetaDAL
   peerDAL:PeerDAL
-  blockDAL:any
+  blockDAL:BlockDAL
   txsDAL:TxsDAL
   statDAL:StatDAL
   idtyDAL:IdentityDAL
@@ -274,7 +275,7 @@ export class FileDAL {
   }
 
   getBlocksBetween (start:number, end:number) {
-    return Promise.resolve(this.blockDAL.getBlocks(Math.max(0, start), end))
+    return this.blockDAL.getBlocks(Math.max(0, start), end)
   }
 
   getForkBlocksFollowing(current:DBBlock) {
diff --git a/app/lib/rules/global_rules.ts b/app/lib/rules/global_rules.ts
index f4dcf07e8..7f9e44a39 100644
--- a/app/lib/rules/global_rules.ts
+++ b/app/lib/rules/global_rules.ts
@@ -85,7 +85,7 @@ export const GLOBAL_RULES_FUNCTIONS = {
         // From DUP 0.5: we fully check the blockstamp
         const basedBlock = await dal.getBlockByBlockstamp(idty.buid);
         // Check if writable
-        let duration = current.medianTime - parseInt(basedBlock.medianTime);
+        let duration = current.medianTime - basedBlock.medianTime
         if (duration > conf.idtyWindow) {
           throw Error('Identity is too old and cannot be written');
         }
diff --git a/app/modules/bma/lib/controllers/blockchain.ts b/app/modules/bma/lib/controllers/blockchain.ts
index d38b56144..bfed41e47 100644
--- a/app/modules/bma/lib/controllers/blockchain.ts
+++ b/app/modules/bma/lib/controllers/blockchain.ts
@@ -28,6 +28,7 @@ import {
   HttpParameters,
   HttpStat
 } from "../dtos"
+import {TransactionDTO} from "../../../../lib/dto/TransactionDTO"
 
 const _                = require('underscore');
 const http2raw         = require('../http2raw');
@@ -118,9 +119,53 @@ export class BlockchainBinding extends AbstractController {
     const params = ParametersService.getCountAndFrom(req);
     const count = parseInt(params.count);
     const from = parseInt(params.from);
-    let blocks = await this.BlockchainService.blocksBetween(from, count);
+    let blocks: any[] = await this.BlockchainService.blocksBetween(from, count);
     blocks = blocks.map((b:any) => toJson.block(b));
-    return blocks;
+    return blocks.map(b => ({
+      version: b.version,
+      currency: b.currency,
+      number: b.number,
+      issuer: b.issuer,
+      issuersFrame: b.issuersFrame,
+      issuersFrameVar: b.issuersFrameVar,
+      issuersCount: b.issuersCount,
+      parameters: b.parameters,
+      membersCount: b.membersCount,
+      monetaryMass: b.monetaryMass,
+      powMin: b.powMin,
+      time: b.time,
+      medianTime: b.medianTime,
+      dividend: b.dividend,
+      unitbase: b.unitbase,
+      hash: b.hash,
+      previousHash: b.previousHash,
+      previousIssuer: b.previousIssuer,
+      identities: b.identities,
+      certifications: b.certifications,
+      joiners: b.joiners,
+      actives: b.actives,
+      leavers: b.leavers,
+      revoked: b.revoked,
+      excluded: b.excluded,
+      transactions: b.transactions.map((t:TransactionDTO) => ({
+        version: t.version,
+        currency: t.currency,
+        comment: t.comment,
+        locktime: t.locktime,
+        signatures: t.signatures,
+        outputs: t.outputs,
+        inputs: t.inputs,
+        unlocks: t.unlocks,
+        blockstamp: t.blockstamp,
+        blockstampTime: t.blockstampTime,
+        issuers: t.issuers,
+        hash: t.hash,
+      })),
+      nonce: b.nonce,
+      inner_hash: b.inner_hash,
+      signature: b.signature,
+      raw: b.raw,
+    }))
   }
 
   async current(): Promise<HttpBlock> {
diff --git a/app/modules/bma/lib/dtos.ts b/app/modules/bma/lib/dtos.ts
index 91c431777..a048dfcce 100644
--- a/app/modules/bma/lib/dtos.ts
+++ b/app/modules/bma/lib/dtos.ts
@@ -184,17 +184,16 @@ export const TransactionOfBlock = {
 export interface HttpTransactionOfBlock {
   version: number
   currency: string
-  comment: string
   locktime: number
-  signatures: string[]
-  outputs: string[]
-  inputs: string[]
-  unlocks: string[]
-  block_number: number
+  hash: string
   blockstamp: string
   blockstampTime: number
-  time: number
   issuers: string[]
+  inputs: string[]
+  outputs: string[]
+  unlocks: string[]
+  signatures: string[]
+  comment: string
 }
 
 export const Block = {
@@ -244,7 +243,7 @@ export interface HttpBlock {
   powMin: number
   time: number
   medianTime: number
-  dividend: number
+  dividend: number|null
   unitbase: number
   hash: string
   previousHash: string
@@ -301,10 +300,9 @@ export function block2HttpBlock(blockDTO:BlockDTO): HttpBlock {
         outputs: tx.outputs,
         inputs: tx.inputs,
         unlocks: tx.unlocks,
-        block_number: tx.blockNumber,
+        hash: tx.hash,
         blockstamp: tx.blockstamp,
         blockstampTime: tx.blockstampTime,
-        time: tx.blockstampTime
       }
     }),
     nonce: blockDTO.nonce,
diff --git a/app/modules/crawler/lib/sync.ts b/app/modules/crawler/lib/sync.ts
index 2a2d6aeba..71751c13f 100644
--- a/app/modules/crawler/lib/sync.ts
+++ b/app/modules/crawler/lib/sync.ts
@@ -309,7 +309,7 @@ export class Synchroniser extends stream.Duplex {
 
       // Save currency parameters given by root block
       const rootBlock = await this.server.dal.getBlock(0);
-      await this.BlockchainService.saveParametersForRootBlock(rootBlock);
+      await this.BlockchainService.saveParametersForRootBlock(BlockDTO.fromJSONObject(rootBlock))
       this.server.dal.blockDAL.cleanCache();
 
       //=======
diff --git a/app/modules/prover/lib/blockGenerator.ts b/app/modules/prover/lib/blockGenerator.ts
index 3c6d67921..87af52071 100644
--- a/app/modules/prover/lib/blockGenerator.ts
+++ b/app/modules/prover/lib/blockGenerator.ts
@@ -726,7 +726,7 @@ class NextBlockGenerator implements BlockGeneratorInterface {
         // Do not rely on certification block UID, prefer using the known hash of the block by its given number
         const targetBlock = await this.dal.getBlock(cert.block_number);
         // Check if writable
-        let duration = current && targetBlock ? current.medianTime - parseInt(targetBlock.medianTime) : 0;
+        let duration = current && targetBlock ? current.medianTime - targetBlock.medianTime : 0;
         if (targetBlock && duration <= this.conf.sigWindow) {
           cert.sig = '';
           cert.currency = this.conf.currency;
diff --git a/app/modules/ws2p/lib/impl/WS2PReqMapperByServer.ts b/app/modules/ws2p/lib/impl/WS2PReqMapperByServer.ts
index 8b27036a4..49c04d411 100644
--- a/app/modules/ws2p/lib/impl/WS2PReqMapperByServer.ts
+++ b/app/modules/ws2p/lib/impl/WS2PReqMapperByServer.ts
@@ -16,6 +16,7 @@ import {Server} from "../../../../../server"
 import {WS2PReqMapper} from "../interface/WS2PReqMapper"
 import {BlockDTO} from "../../../../lib/dto/BlockDTO"
 import {IindexEntry} from '../../../../lib/indexer';
+import {DBBlock} from "../../../../lib/db/DBBlock"
 
 export class WS2PReqMapperByServer implements WS2PReqMapper {
 
@@ -25,8 +26,8 @@ export class WS2PReqMapperByServer implements WS2PReqMapper {
     return this.server.BlockchainService.current()
   }
 
-  getBlock(number: number): Promise<BlockDTO[]> {
-    return this.server.dal.getBlock(number)
+  getBlock(number: number): Promise<BlockDTO> {
+    return Promise.resolve(BlockDTO.fromJSONObject(this.server.dal.getBlock(number)))
   }
 
   async getBlocks(count: number, from: number): Promise<BlockDTO[]> {
@@ -38,7 +39,7 @@ export class WS2PReqMapperByServer implements WS2PReqMapper {
     if (!current || current.number < from) {
       return []
     }
-    return this.server.dal.getBlocksBetween(from, from + count - 1)
+    return (await this.server.dal.getBlocksBetween(from, from + count - 1)).map((b:DBBlock) => BlockDTO.fromJSONObject(b))
   }
 
   async getRequirementsOfPending(minsig: number): Promise<any> {
diff --git a/app/modules/ws2p/lib/interface/WS2PReqMapper.ts b/app/modules/ws2p/lib/interface/WS2PReqMapper.ts
index 651fb22cb..f410e8145 100644
--- a/app/modules/ws2p/lib/interface/WS2PReqMapper.ts
+++ b/app/modules/ws2p/lib/interface/WS2PReqMapper.ts
@@ -16,7 +16,7 @@ import {BlockDTO} from "../../../../lib/dto/BlockDTO"
 export interface WS2PReqMapper {
 
   getCurrent(): Promise<BlockDTO>
-  getBlock(number:number): Promise<BlockDTO[]>
+  getBlock(number:number): Promise<BlockDTO>
   getBlocks(count:number, fromNumber:number): Promise<BlockDTO[]>
   getRequirementsOfPending(minCert:number): Promise<any>
 }
\ No newline at end of file
diff --git a/app/service/IdentityService.ts b/app/service/IdentityService.ts
index 167e3291d..342c8dc68 100644
--- a/app/service/IdentityService.ts
+++ b/app/service/IdentityService.ts
@@ -198,7 +198,7 @@ export class IdentityService extends FIFOService {
       }
       if (!anErr) {
         try {
-          let basedBlock = await this.dal.getBlock(cert.block_number);
+          let basedBlock: { number:number, hash:string, medianTime?:number } = await this.dal.getBlock(cert.block_number);
           if (cert.block_number == 0 && !basedBlock) {
             basedBlock = {
               number: 0,
@@ -213,7 +213,7 @@ export class IdentityService extends FIFOService {
             block_hash: basedBlock.hash,
             target: targetHash,
             to: idty.pubkey,
-            expires_on: basedBlock.medianTime + this.conf.sigWindow,
+            expires_on: (basedBlock.medianTime || 0) + this.conf.sigWindow,
             linked: false,
             written: false,
             expired: false,
diff --git a/app/service/MembershipService.ts b/app/service/MembershipService.ts
index a02eaa768..b0a75f51f 100644
--- a/app/service/MembershipService.ts
+++ b/app/service/MembershipService.ts
@@ -89,7 +89,7 @@ export class MembershipService extends FIFOService {
         idtyHash: entry.getIdtyHash(),
         written: false,
         written_number: null,
-        expires_on: basedBlock ? basedBlock.medianTime + this.conf.msWindow : null,
+        expires_on: basedBlock ? basedBlock.medianTime + this.conf.msWindow : 0,
         signature: entry.signature,
         expired: false,
         block_number: entry.number
-- 
GitLab