diff --git a/planetmint/backend/models/__init__.py b/planetmint/backend/models/__init__.py index d8d99e3..c102251 100644 --- a/planetmint/backend/models/__init__.py +++ b/planetmint/backend/models/__init__.py @@ -9,3 +9,5 @@ from .input import Input from .metadata import MetaData from .script import Script from .output import Output +from .keys import Keys +from .dbtransaction import DbTransaction diff --git a/planetmint/backend/models/asset.py b/planetmint/backend/models/asset.py index 2071954..d1b3674 100644 --- a/planetmint/backend/models/asset.py +++ b/planetmint/backend/models/asset.py @@ -17,3 +17,14 @@ class Asset: @staticmethod def from_tuple(asset_tuple: tuple) -> Asset: return Asset(asset_tuple[2], asset_tuple[1], json.loads(asset_tuple[0])["data"]) + + def to_dict(self) -> dict: + return { + "id": self.id, + "tx_id": self.tx_id, + "data": self.data + } + + @staticmethod + def list_to_dict(asset_list: list[Asset]) -> list[dict]: + return [asset.to_dict() for asset in asset_list] diff --git a/planetmint/backend/models/transaction.py b/planetmint/backend/models/dbtransaction.py similarity index 70% rename from planetmint/backend/models/transaction.py rename to planetmint/backend/models/dbtransaction.py index 8fd3e9e..9022aa3 100644 --- a/planetmint/backend/models/transaction.py +++ b/planetmint/backend/models/dbtransaction.py @@ -4,15 +4,14 @@ # Code is Apache-2.0 and docs are CC-BY-4.0 from __future__ import annotations -from dataclasses import dataclass, field -from typing import Optional +from dataclasses import dataclass from planetmint.backend.models import Asset, MetaData, Input, Output, Script from planetmint.backend.models.keys import Keys @dataclass -class Transaction: +class DbTransaction: id: str = "" operation: str = "" version: str = "" @@ -25,8 +24,8 @@ class Transaction: script: Script = None @staticmethod - def from_dict(transaction: dict) -> Transaction: - return Transaction( + def from_dict(transaction: dict) -> DbTransaction: + return DbTransaction( id=transaction["id"], operation=transaction["operation"], version=transaction["version"], @@ -35,8 +34,8 @@ class Transaction: ) @staticmethod - def from_tuple(transaction: tuple) -> Transaction: - return Transaction( + def from_tuple(transaction: tuple) -> DbTransaction: + return DbTransaction( id=transaction[0], operation=transaction[1], version=transaction[2], @@ -48,5 +47,11 @@ class Transaction: "id": self.id, "operation": self.operation, "version": self.version, + "inputs": Input.list_to_dict(self.inputs), + "assets": Asset.list_to_dict(self.assets), + "metadata": self.metadata.to_dict(), + "outputs": Output.list_to_dict(self.outputs), + "keys": self.keys.to_dict(), + "script": self.script.to_dict(), "transaction": self.raw_transaction, } diff --git a/planetmint/backend/models/input.py b/planetmint/backend/models/input.py index 261c7f9..51047a7 100644 --- a/planetmint/backend/models/input.py +++ b/planetmint/backend/models/input.py @@ -48,3 +48,9 @@ class Input: ) return {"fulfills": fulfills, "fulfillment": self.fulfillment, "owners_before": self.owners_before} + + @staticmethod + def list_to_dict(input_list: list[Input]) -> list[dict]: + return [input.to_dict() for input in input_list] + + diff --git a/planetmint/backend/models/metadata.py b/planetmint/backend/models/metadata.py index 1f4c1fa..c362a3f 100644 --- a/planetmint/backend/models/metadata.py +++ b/planetmint/backend/models/metadata.py @@ -17,3 +17,9 @@ class MetaData: @staticmethod def from_tuple(meta_data_tuple: tuple) -> MetaData: return MetaData(meta_data_tuple[0], json.loads(meta_data_tuple[1])) + + def to_dict(self) -> dict: + return { + "id": self.id, + "metadata": self.metadata + } diff --git a/planetmint/backend/models/output.py b/planetmint/backend/models/output.py index c8a8067..b8e72b5 100644 --- a/planetmint/backend/models/output.py +++ b/planetmint/backend/models/output.py @@ -85,6 +85,10 @@ class Output: }, } + @staticmethod + def list_to_dict(output_list: list[Output]) -> list[dict]: + return [output.to_dict() for output in output_list] + def output_with_public_key(output, tx_id) -> Output: return Output( diff --git a/planetmint/backend/models/script.py b/planetmint/backend/models/script.py index d2df58f..682a728 100644 --- a/planetmint/backend/models/script.py +++ b/planetmint/backend/models/script.py @@ -16,3 +16,9 @@ class Script: @staticmethod def from_tuple(script_tuple: tuple) -> Script: return Script(script_tuple[0], script_tuple[1]) + + def to_dict(self) -> dict: + return { + "id": self.id, + "script": self.script + } diff --git a/planetmint/backend/query.py b/planetmint/backend/query.py index 1d445ef..5d7ddc9 100644 --- a/planetmint/backend/query.py +++ b/planetmint/backend/query.py @@ -6,9 +6,13 @@ """Query interfaces for backends.""" from functools import singledispatch + +from planetmint.backend.models import Asset, MetaData, Output, Input, Script + from planetmint.backend.exceptions import OperationError -from planetmint.backend.interfaces import Asset, Block, MetaData, Input, Script, Output, Transaction from planetmint.backend.models.keys import Keys +from planetmint.backend.interfaces import Block +from planetmint.backend.models.dbtransaction import DbTransaction @singledispatch @@ -75,7 +79,7 @@ def get_transaction_space_by_id(connection, transaction_id): @singledispatch -def get_transaction_single(connection, transaction_id): +def get_transaction_single(connection, transaction_id) -> DbTransaction: """Get a single transaction by id.""" raise NotImplementedError @@ -88,7 +92,7 @@ def get_transaction(connection, transaction_id): raise NotImplementedError @singledispatch -def get_transactions(connection, transactions_ids) -> list[Transaction]: +def get_transactions(connection, transactions_ids) -> list[DbTransaction]: """Get a transaction from the transactions table. Args: diff --git a/planetmint/backend/tarantool/query.py b/planetmint/backend/tarantool/query.py index 1a3296d..6a65830 100644 --- a/planetmint/backend/tarantool/query.py +++ b/planetmint/backend/tarantool/query.py @@ -11,7 +11,7 @@ from operator import itemgetter from tarantool.error import DatabaseError from planetmint.backend import query from planetmint.backend.models.keys import Keys -from planetmint.backend.models.transaction import Transaction +from planetmint.backend.models.dbtransaction import DbTransaction from planetmint.backend.tarantool.const import ( TARANT_TABLE_META_DATA, TARANT_TABLE_ASSETS, @@ -31,7 +31,7 @@ register_query = module_dispatch_registrar(query) @register_query(TarantoolDBConnection) -def _group_transaction_by_ids(connection, txids: list) -> list[Transaction]: +def _group_transaction_by_ids(connection, txids: list) -> list[DbTransaction]: _transactions = [] for txid in txids: tx = get_transaction_space_by_id(connection, txid) @@ -76,7 +76,7 @@ def get_keys_by_tx_id(connection, tx_id: str) -> list[Keys]: @register_query(TarantoolDBConnection) -def get_transaction(connection, tx_id: str) -> Transaction: +def get_transaction(connection, tx_id: str) -> DbTransaction: return NotImplemented @register_query(TarantoolDBConnection) @@ -174,7 +174,7 @@ def store_transactions(connection, signed_transactions: list): @register_query(TarantoolDBConnection) def store_transaction(connection, transaction): - tx = (transaction["id"], transaction["operation"], transaction["version"], transaction) + tx = (transaction["id"], transaction["operation"], transaction["version"], [transaction]) connection.run(connection.space(TARANT_TABLE_TRANSACTION).insert(tx), only_data=False) @@ -183,16 +183,16 @@ def get_transaction_space_by_id(connection, transaction_id): txs = connection.run(connection.space(TARANT_TABLE_TRANSACTION).select(transaction_id, index=TARANT_ID_SEARCH)) if len(txs) == 0: return None - return Transaction.from_tuple(txs[0]) + return DbTransaction.from_tuple(txs[0]) @register_query(TarantoolDBConnection) -def get_transaction_single(connection, transaction_id): +def get_transaction_single(connection, transaction_id) -> DbTransaction: return _group_transaction_by_ids(txids=[transaction_id], connection=connection)[0] @register_query(TarantoolDBConnection) -def get_transactions(connection, transactions_ids: list) -> list[Transaction]: +def get_transactions(connection, transactions_ids: list) -> list[DbTransaction]: return _group_transaction_by_ids(txids=transactions_ids, connection=connection) diff --git a/planetmint/commands/planetmint.py b/planetmint/commands/planetmint.py index 64585ff..5026d90 100644 --- a/planetmint/commands/planetmint.py +++ b/planetmint/commands/planetmint.py @@ -193,7 +193,7 @@ def run_election_approve(args, planet): """ key = load_node_key(args.sk) - tx = planet.get_transaction_space_by_id(args.election_id) + tx = planet.get_transaction(args.election_id) voting_powers = [v.amount for v in tx.outputs if key.public_key in v.public_keys] if len(voting_powers) > 0: voting_power = voting_powers[0] @@ -226,7 +226,7 @@ def run_election_show(args, planet): :param planet: an instance of Planetmint """ - election = planet.get_transaction_space_by_id(args.election_id) + election = planet.get_transaction(args.election_id) if not election: logger.error(f"No election found with election_id {args.election_id}") return diff --git a/planetmint/lib.py b/planetmint/lib.py index da69bf4..26cbbbb 100644 --- a/planetmint/lib.py +++ b/planetmint/lib.py @@ -279,8 +279,8 @@ class Planetmint(object): elif transactions: tx_id = transactions[0]["transactions"].id tx = backend.query.get_transaction_single(self.connection, tx_id) - assets = backend.query.get_assets_by_tx_id(self.connection, tx_id) - transaction = {"transactions": tx} | {"assets": [asset.data for asset in assets]} + tx.assets = backend.query.get_assets_by_tx_id(self.connection, tx_id) + transaction = tx.to_dict() elif current_spent_transactions: transaction = current_spent_transactions[0] diff --git a/planetmint/web/views/transactions.py b/planetmint/web/views/transactions.py index 236a9d6..2660588 100644 --- a/planetmint/web/views/transactions.py +++ b/planetmint/web/views/transactions.py @@ -37,7 +37,7 @@ class TransactionApi(Resource): pool = current_app.config["bigchain_pool"] with pool() as planet: - tx = planet.get_transaction_space_by_id(tx_id) + tx = planet.get_transaction(tx_id) if not tx: return make_error(404)