Browse Source

server: Allow to delete blocks by hash

scalafmt-draft
Alexis Hernandez 7 years ago
parent
commit
d076fe151e
  1. 2
      server/app/com/xsn/explorer/data/BlockDataHandler.scala
  2. 5
      server/app/com/xsn/explorer/data/anorm/BlockPostgresDataHandler.scala
  3. 13
      server/app/com/xsn/explorer/data/anorm/dao/BlockPostgresDAO.scala
  4. 18
      server/test/com/xsn/explorer/data/BlockPostgresDataHandlerSpec.scala

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

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

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

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

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

@ -70,4 +70,17 @@ class BlockPostgresDAO {
"hash" -> blockhash.string
).as(parseBlock.singleOpt).flatten
}
def delete(blockhash: Blockhash)(implicit conn: Connection): Option[Block] = {
SQL(
"""
|DELETE FROM blocks
|WHERE hash = {hash}
|RETURNING hash, previous_blockhash, next_blockhash, tpos_contract, merkle_root, size,
| height, version, time, median_time, nonce, bits, chainwork, difficulty
""".stripMargin
).on(
"hash" -> blockhash.string
).as(parseBlock.singleOpt).flatten
}
}

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

@ -54,6 +54,24 @@ class BlockPostgresDataHandlerSpec extends PostgresDataHandlerSpec {
}
}
"delete" should {
"delete a block" in {
val block = BlockLoader.get("1ca318b7a26ed67ca7c8c9b5069d653ba224bf86989125d1dfbb0973b7d6a5e0")
dataHandler.create(block)
val result = dataHandler.delete(block.hash)
result.isGood mustEqual true
matches(block, result.get)
}
"fail on block not found" in {
val blockhash = Blockhash.from("b858d38a3552c83aea58f66fe00ae220352a235e33fcf1f3af04507a61a9dc32").get
val result = dataHandler.delete(blockhash)
result mustEqual Bad(BlockNotFoundError).accumulating
}
}
private def matches(expected: Block, result: Block) = {
// NOTE: transactions and confirmations are not matched intentionally
result.hash mustEqual expected.hash

Loading…
Cancel
Save