devicehub-django/dpp/api_dlt.py

165 lines
3.8 KiB
Python
Raw Normal View History

2024-11-19 20:17:48 +00:00
import json
import time
import logging
from django.conf import settings
2024-11-15 17:56:11 +00:00
from ereuseapi.methods import API
2024-11-19 20:17:48 +00:00
from dpp.models import Proof, UserDpp
logger = logging.getLogger('django')
# """The code of the status response of api dlt."""
STATUS_CODE = {
"Success": 201,
"Notwork": 400
}
ALGORITHM = "sha3-256"
PROOF_TYPE = {
'Register': 'Register',
'IssueDPP': 'IssueDPP',
'proof_of_recycling': 'proof_of_recycling',
'Erase': 'Erase',
'EWaste': 'EWaste',
}
2024-11-15 17:56:11 +00:00
2024-11-19 20:17:48 +00:00
def connect_api(user):
2024-11-15 17:56:11 +00:00
2024-11-19 20:17:48 +00:00
dp = UserDpp.objects.filter(user=user).first()
if not dp:
2024-11-15 17:56:11 +00:00
return
2024-11-19 20:17:48 +00:00
2024-11-19 17:02:43 +00:00
api_dlt = settings.API_DLT
2024-11-19 20:17:48 +00:00
token_dlt = json.loads(dp).get("token_dlt")
if not api_dlt or not token_dlt:
logger.error("NOT POSSIBLE CONNECT WITH API DLT!!!")
return
2024-11-15 17:56:11 +00:00
return API(api_dlt, token_dlt, "ethereum")
2024-11-19 20:17:48 +00:00
def register_dlt(api, chid, phid, proof_type=None):
if proof_type:
return api.generate_proof(
chid,
2024-11-15 17:56:11 +00:00
ALGORITHM,
phid,
proof_type,
2024-11-19 17:02:43 +00:00
settings.ID_FEDERATED
2024-11-15 17:56:11 +00:00
)
return api.register_device(
chid,
ALGORITHM,
phid,
2024-11-19 17:02:43 +00:00
settings.ID_FEDERATED
)
2024-11-19 20:17:48 +00:00
def issuer_dpp_dlt(api, dpp):
phid = dpp.split(":")[0]
return api.issue_passport(
dpp,
ALGORITHM,
phid,
2024-11-19 17:02:43 +00:00
settings.ID_FEDERATED
)
2024-11-15 17:56:11 +00:00
def save_proof(signature, ev_uuid, result, proof_type, user):
if result['Status'] == STATUS_CODE.get("Success"):
2024-11-15 17:56:11 +00:00
timestamp = result.get('Data', {}).get('data', {}).get('timestamp')
if not timestamp:
return
d = {
"type": proof_type,
2024-11-15 17:56:11 +00:00
"timestamp": timestamp,
"issuer": user.institution.id,
"user": user,
"uuid": ev_uuid,
"signature": signature,
2024-11-15 17:56:11 +00:00
}
Proof.objects.create(**d)
2024-11-15 17:56:11 +00:00
def register_device_dlt(chid, phid, ev_uuid, user):
cny_a = 1
while cny_a:
2024-11-19 20:17:48 +00:00
api = connect_api(user)
if not api:
cny_a = 0
return
result = register_dlt(api, chid, phid)
try:
assert result['Status'] == STATUS_CODE.get("Success")
assert result['Data']['data']['timestamp']
cny_a = 0
except Exception:
if result.get("Data") != "Device already exists":
logger.error("API return: %s", result)
time.sleep(10)
else:
cny_a = 0
save_proof(phid, ev_uuid, result, PROOF_TYPE['Register'], user)
# TODO is neccesary?
# if settings.get('ID_FEDERATED'):
# cny = 1
# while cny:
# try:
# api.add_service(
# chid,
# 'DeviceHub',
# settings.get('ID_FEDERATED'),
# 'Inventory service',
# 'Inv',
# )
# cny = 0
# except Exception:
# time.sleep(10)
def register_passport_dlt(chid, phid, ev_uuid, user):
2024-11-19 17:02:43 +00:00
token_dlt = settings.TOKEN_DLT
api_dlt = settings.API_DLT
if not token_dlt or not api_dlt:
return
dpp = "{chid}:{phid}".format(chid=chid, phid=phid)
if Proof.objects.filter(signature=dpp, type=PROOF_TYPE['IssueDPP']).exists():
2024-11-15 17:56:11 +00:00
return
cny_a = 1
while cny_a:
try:
2024-11-19 20:17:48 +00:00
api = connect_api(user)
if not api:
cny_a = 0
return
result = issuer_dpp_dlt(api, dpp)
cny_a = 0
except Exception as err:
logger.error("ERROR API issue passport return: %s", err)
time.sleep(10)
if result['Status'] is not STATUS_CODE.get("Success"):
logger.error("ERROR API issue passport return: %s", result)
return
save_proof(phid, ev_uuid, result, PROOF_TYPE['IssueDPP'], user)