mirror of
https://github.com/XRPLF/clio.git
synced 2025-12-06 17:27:58 +00:00
113 lines
3.5 KiB
C++
113 lines
3.5 KiB
C++
//------------------------------------------------------------------------------
|
|
/*
|
|
This file is part of clio: https://github.com/XRPLF/clio
|
|
Copyright (c) 2023, the clio developers.
|
|
|
|
Permission to use, copy, modify, and distribute this software for any
|
|
purpose with or without fee is hereby granted, provided that the above
|
|
copyright notice and this permission notice appear in all copies.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
*/
|
|
//==============================================================================
|
|
|
|
#pragma once
|
|
|
|
#include "data/BackendInterface.h"
|
|
#include "rpc/JS.h"
|
|
#include "rpc/common/Modifiers.h"
|
|
#include "rpc/common/Specs.h"
|
|
#include "rpc/common/Types.h"
|
|
#include "rpc/common/Validators.h"
|
|
|
|
#include <boost/asio/spawn.hpp>
|
|
#include <boost/json/conversion.hpp>
|
|
#include <boost/json/value.hpp>
|
|
#include <ripple/basics/base_uint.h>
|
|
#include <ripple/protocol/Keylet.h>
|
|
#include <ripple/protocol/STLedgerEntry.h>
|
|
#include <ripple/protocol/jss.h>
|
|
|
|
#include <cstdint>
|
|
#include <memory>
|
|
#include <optional>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
namespace rpc {
|
|
|
|
class NFTOffersHandlerBase {
|
|
std::shared_ptr<BackendInterface> sharedPtrBackend_;
|
|
|
|
public:
|
|
static auto constexpr LIMIT_MIN = 50;
|
|
static auto constexpr LIMIT_MAX = 500;
|
|
static auto constexpr LIMIT_DEFAULT = 250;
|
|
|
|
struct Output {
|
|
std::string nftID = {};
|
|
std::vector<ripple::SLE> offers = {};
|
|
|
|
// validated should be sent via framework
|
|
bool validated = true;
|
|
std::optional<uint32_t> limit = {};
|
|
std::optional<std::string> marker = {};
|
|
};
|
|
|
|
struct Input {
|
|
std::string nftID;
|
|
std::optional<std::string> ledgerHash;
|
|
std::optional<uint32_t> ledgerIndex;
|
|
uint32_t limit = LIMIT_DEFAULT;
|
|
std::optional<std::string> marker;
|
|
};
|
|
|
|
using Result = HandlerReturnType<Output>;
|
|
|
|
NFTOffersHandlerBase(std::shared_ptr<BackendInterface> const& sharedPtrBackend)
|
|
: sharedPtrBackend_(sharedPtrBackend)
|
|
{
|
|
}
|
|
|
|
static RpcSpecConstRef
|
|
spec([[maybe_unused]] uint32_t apiVersion)
|
|
{
|
|
static auto const rpcSpec = RpcSpec{
|
|
{JS(nft_id), validation::Required{}, validation::Uint256HexStringValidator},
|
|
{JS(ledger_hash), validation::Uint256HexStringValidator},
|
|
{JS(ledger_index), validation::LedgerIndexValidator},
|
|
{JS(limit),
|
|
validation::Type<uint32_t>{},
|
|
validation::Min(1u),
|
|
modifiers::Clamp<int32_t>{LIMIT_MIN, LIMIT_MAX}},
|
|
{JS(marker), validation::Uint256HexStringValidator},
|
|
};
|
|
|
|
return rpcSpec;
|
|
}
|
|
|
|
protected:
|
|
Result
|
|
iterateOfferDirectory(
|
|
Input input,
|
|
ripple::uint256 const& tokenID,
|
|
ripple::Keylet const& directory,
|
|
boost::asio::yield_context yield
|
|
) const;
|
|
|
|
private:
|
|
friend void
|
|
tag_invoke(boost::json::value_from_tag, boost::json::value& jv, Output const& output);
|
|
|
|
friend Input
|
|
tag_invoke(boost::json::value_to_tag<Input>, boost::json::value const& jv);
|
|
};
|
|
|
|
} // namespace rpc
|