Browse Source

server: Allow to retrieve the latest block

scalafmt-draft
Alexis Hernandez 7 years ago
parent
commit
a4b2b6d9c5
  1. 2
      server/app/com/xsn/explorer/data/BlockDataHandler.scala
  2. 5
      server/app/com/xsn/explorer/data/anorm/BlockPostgresDataHandler.scala
  3. 12
      server/app/com/xsn/explorer/data/anorm/dao/BlockPostgresDAO.scala
  4. 29
      server/test/com/xsn/explorer/data/BlockPostgresDataHandlerSpec.scala
  5. 19
      server/test/resources/blocks/000003fb382f6892ae96594b81aa916a8923c70701de4e7054aac556c7271ef7
  6. 18
      server/test/resources/blocks/00000c822abdbb23e28f79a49d29b41429737c6c7e15df40d1b1f1b35907ae34

2
server/app/com/xsn/explorer/data/BlockDataHandler.scala

@ -13,6 +13,8 @@ trait BlockDataHandler[F[_]] {
def getBy(blockhash: Blockhash): F[Block]
def delete(blockhash: Blockhash): F[Block]
def getLatestBlock(): F[Block]
}
trait BlockBlockingDataHandler extends BlockDataHandler[ApplicationResult]

5
server/app/com/xsn/explorer/data/anorm/BlockPostgresDataHandler.scala

@ -31,4 +31,9 @@ class BlockPostgresDataHandler @Inject() (
val maybe = blockPostgresDAO.delete(blockhash)
Or.from(maybe, One(BlockNotFoundError))
}
override def getLatestBlock(): ApplicationResult[Block] = database.withConnection { implicit conn =>
val maybe = blockPostgresDAO.getLatestBlock
Or.from(maybe, One(BlockNotFoundError))
}
}

12
server/app/com/xsn/explorer/data/anorm/dao/BlockPostgresDAO.scala

@ -83,4 +83,16 @@ class BlockPostgresDAO {
"hash" -> blockhash.string
).as(parseBlock.singleOpt).flatten
}
def getLatestBlock(implicit conn: Connection): Option[Block] = {
SQL(
"""
|SELECT hash, previous_blockhash, next_blockhash, tpos_contract, merkle_root, size,
| height, version, time, median_time, nonce, bits, chainwork, difficulty
|FROM blocks
|ORDER BY height DESC
|LIMIT 1
""".stripMargin
).as(parseBlock.singleOpt).flatten
}
}

29
server/test/com/xsn/explorer/data/BlockPostgresDataHandlerSpec.scala

@ -72,6 +72,35 @@ class BlockPostgresDataHandlerSpec extends PostgresDataHandlerSpec {
}
}
"getLatestBlock" should {
"return the block" in {
clearDatabase()
val block0 = BlockLoader.get("00000c822abdbb23e28f79a49d29b41429737c6c7e15df40d1b1f1b35907ae34")
val block1 = BlockLoader.get("000003fb382f6892ae96594b81aa916a8923c70701de4e7054aac556c7271ef7")
val block2 = BlockLoader.get("000004645e2717b556682e3c642a4c6e473bf25c653ff8e8c114a3006040ffb8")
List(block1, block2, block0).foreach(dataHandler.create)
val result = dataHandler.getLatestBlock()
result.isGood mustEqual true
matches(block2, result.get)
}
"fail on no blocks" in {
clearDatabase()
val result = dataHandler.getLatestBlock()
result mustEqual Bad(BlockNotFoundError).accumulating
}
}
private def clearDatabase() = {
database.withConnection { implicit conn =>
_root_.anorm.SQL("""DELETE FROM blocks""").execute()
}
}
private def matches(expected: Block, result: Block) = {
// NOTE: transactions and confirmations are not matched intentionally
result.hash mustEqual expected.hash

19
server/test/resources/blocks/000003fb382f6892ae96594b81aa916a8923c70701de4e7054aac556c7271ef7

@ -0,0 +1,19 @@
{
"hash": "000003fb382f6892ae96594b81aa916a8923c70701de4e7054aac556c7271ef7",
"confirmations": 44905,
"size": 179,
"height": 1,
"version": 536870912,
"merkleroot": "024aba1d535cfe5dd3ea465d46a828a57b00e1df012d7a2d158e0f7484173f7c",
"tx": [
"024aba1d535cfe5dd3ea465d46a828a57b00e1df012d7a2d158e0f7484173f7c"
],
"time": 1520276270,
"mediantime": 1520276270,
"nonce": 167906,
"bits": "1e0ffff0",
"difficulty": 0.000244140625,
"chainwork": "0000000000000000000000000000000000000000000000000000000000200020",
"previousblockhash": "00000c822abdbb23e28f79a49d29b41429737c6c7e15df40d1b1f1b35907ae34",
"nextblockhash": "000004645e2717b556682e3c642a4c6e473bf25c653ff8e8c114a3006040ffb8"
}

18
server/test/resources/blocks/00000c822abdbb23e28f79a49d29b41429737c6c7e15df40d1b1f1b35907ae34

@ -0,0 +1,18 @@
{
"hash": "00000c822abdbb23e28f79a49d29b41429737c6c7e15df40d1b1f1b35907ae34",
"confirmations": 44906,
"size": 274,
"height": 0,
"version": 1,
"merkleroot": "922ab2360f766457416dfc59c6594248c5b79e33c8785bce491c0e01930738f6",
"tx": [
"922ab2360f766457416dfc59c6594248c5b79e33c8785bce491c0e01930738f6"
],
"time": 1520274471,
"mediantime": 1520274471,
"nonce": 627829,
"bits": "1e0ffff0",
"difficulty": 0.000244140625,
"chainwork": "0000000000000000000000000000000000000000000000000000000000100010",
"nextblockhash": "000003fb382f6892ae96594b81aa916a8923c70701de4e7054aac556c7271ef7"
}
Loading…
Cancel
Save