Browse Source

Merge #1148: Add yieldgen report endpoint to API

beaa8b0 fixes to API and return format (Adam Gibson)
89896e0 Add yieldgen report endpoint to API (Adam Gibson)
master
Adam Gibson 4 years ago
parent
commit
4ba817e5d2
No known key found for this signature in database
GPG Key ID: 141001A1AF77F20B
  1. 25
      docs/api/wallet-rpc.yaml
  2. 39
      jmclient/jmclient/wallet_rpc.py

25
docs/api/wallet-rpc.yaml

@ -123,6 +123,20 @@ paths:
$ref: "#/components/responses/ListWallets-200-OK"
'404':
$ref: '#/components/responses/404-NotFound'
/wallet/yieldgen/report:
get:
summary: get latest report on yield generating activity
operationId: yieldgenreport
description: "Get list of coinjoins taken part in as maker (across all wallets).
Data returned as list of strings, each one in the same comma separated format as found in yigen-statement.csv.
Note that this returns all lines in the file, including the lines that are only present to represent the starting
of a bot. Those lines contain the word Connected and can be thus discarded.
The header line is also delivered and so can be ignored as per the client requirements."
responses:
'200':
$ref: "#/components/responses/YieldGenReport-200-OK"
'404':
$ref: '#/components/responses/404-NotFound'
/wallet/{walletname}/address/new/{mixdepth}:
get:
security:
@ -567,6 +581,11 @@ components:
items:
type: string
example: wallet.jmdat
YieldGenReportResponse:
type: array
items:
type: string
example: "2021/10/26 16:40:21,133986791,1,200000000,2680,2680,0.08,"
SessionResponse:
type: object
required:
@ -883,6 +902,12 @@ components:
application/json:
schema:
$ref: "#/components/schemas/FreezeResponse"
YieldGenReport-200-OK:
description: "get list of coinjoins taken part in as maker (across all wallets)"
content:
application/json:
schema:
$ref: "#/components/schemas/YieldGenReportResponse"
202-Accepted:
description: The request has been submitted successfully for processing, but the processing has not been completed.
# Clientside error responses

39
jmclient/jmclient/wallet_rpc.py

@ -88,6 +88,11 @@ class TransactionFailed(Exception):
class NotEnoughCoinsForMaker(Exception):
pass
# raised when we cannot read data from our
# yigen-statement csv file:
class YieldGeneratorDataUnreadable(Exception):
pass
def get_ssl_context(cert_directory):
"""Construct an SSL context factory from the user's privatekey/cert.
TODO:
@ -299,6 +304,11 @@ class JMWalletDaemon(Service):
request.setResponseCode(409)
return self.err(request, "Maker could not start, no coins.")
@app.handle_errors(YieldGeneratorDataUnreadable)
def yieldgenerator_report_unavailable(self, request, failure):
request.setResponseCode(404)
return self.err(request, "Yield generator report not available.")
def check_cookie(self, request):
#part after bearer is what we need
try:
@ -600,6 +610,35 @@ class JMWalletDaemon(Service):
self.services["maker"].stopService()
return make_jmwalletd_response(request, status=202)
def get_json_yigen_report(self):
""" Returns a json object whose contents are:
a list of strings, each string is a comma separated record of
a coinjoin event, directly read from yigen-statement.csv without
further processing.
"""
try:
datadir = os.path.join(jm_single().datadir, "logs")
with open(os.path.join(datadir, "yigen-statement.csv"), "r") as f:
yigen_data = f.readlines()
return yigen_data
except Exception as e:
jlog.warn("Yigen report failed to find file: {}".format(repr(e)))
raise YieldGeneratorDataUnreadable()
@app.route('/wallet/yieldgen/report', methods=['GET'])
def yieldgen_report(self, request):
# Note that this is *not* a maker function, and
# not wallet specific (the report aggregates over time,
# even with different wallets), and does not require
# an authenticated session (it reads the filesystem, like
# /all)
# note: can raise, most particularly if file has not been
# created because maker never ran (or deleted):
yigen_data = self.get_json_yigen_report()
# this is the successful case; note the object can
# be an empty list:
return make_jmwalletd_response(request, yigen_data=yigen_data)
@app.route('/wallet/<string:walletname>/lock', methods=['GET'])
def lockwallet(self, request, walletname):
print_req(request)

Loading…
Cancel
Save