Skip to content

Commit

Permalink
feat: get digital twin with properties
Browse files Browse the repository at this point in the history
  • Loading branch information
Dušan Kováčik authored and dusan-kovacik-profiq committed May 25, 2022
1 parent baf24b6 commit c515e56
Show file tree
Hide file tree
Showing 19 changed files with 569 additions and 60 deletions.
4 changes: 2 additions & 2 deletions gen_proto.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ echo "Rewriting the imports..."
packages=("indykite" "validate")

for package in ${packages[@]}; do
find jarvis_sdk/indykite/. -name '*.py' -exec sed -i '' -e "s/from ${package}/from jarvis_sdk.${package}/g" {} \;
find jarvis_sdk/indykite/. -name '*.py' -exec sed -i -e "s/from ${package}/from jarvis_sdk.${package}/g" {} \;
done

echo "Done"
echo "Done"
24 changes: 17 additions & 7 deletions jarvis_sdk/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from datetime import datetime
from uuid import UUID
from google.protobuf.json_format import MessageToJson
from google.protobuf import message

from jarvis_sdk.cmd import IdentityClient

Expand Down Expand Up @@ -127,7 +128,7 @@ def main():
verification_token = args.verification_token
digital_twin_info = client.verify_digital_twin_email(verification_token)
if digital_twin_info is not None:
print_response(digital_twin_info)
print_response({ "digitalTwin": digital_twin_info })

elif command == "change-password":
user_token = args.user_token
Expand Down Expand Up @@ -221,13 +222,13 @@ def main():
tenant_id = args.tenant_id
dt = client.del_digital_twin(digital_twin_id, tenant_id)
if dt is not None:
print_response(dt)
print_response({ "digitalTwin": dt })

elif command == "del-dt-by-token":
user_token = args.user_token
dt = client.del_digital_twin_by_token(user_token)
if dt is not None:
print_response(dt)
print_response({ "digitalTwin": dt })

elif command == "enrich-token":
user_token = args.user_token
Expand Down Expand Up @@ -259,10 +260,19 @@ def print_token_info(token_info):


def print_response(resp):
js = MessageToJson(resp)
js_dict = json.loads(js)
prettify(js_dict)
pretty_response = json.dumps(js_dict, indent=4, separators=(',', ': '))
def get_default(x):
if type(x) is datetime:
return str(x)
else:
return x.__dict__

if hasattr(resp, "DESCRIPTOR"):
js = MessageToJson(resp)
js_dict = json.loads(js)
prettify(js_dict)
else:
js_dict = resp
pretty_response = json.dumps(js_dict, indent=4, separators=(',', ': '), default=get_default)
print(pretty_response)


Expand Down
5 changes: 3 additions & 2 deletions jarvis_sdk/cmd/_delete.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import uuid

from jarvis_sdk.cmd import helper
from jarvis_sdk.model.digital_twin import DigitalTwinCore
from jarvis_sdk.indykite.identity.v1beta1 import identity_management_api_pb2 as pb2
from jarvis_sdk.indykite.identity.v1beta1 import model_pb2 as model

Expand Down Expand Up @@ -38,7 +39,7 @@ def del_digital_twin(self, digital_twin_id, tenant_id):
if not response:
return None

return response
return DigitalTwinCore.deserialize(response.digital_twin)


def del_digital_twin_by_token(self, token):
Expand All @@ -62,4 +63,4 @@ def del_digital_twin_by_token(self, token):
if not response:
return None

return response
return DigitalTwinCore.deserialize(response.digital_twin)
13 changes: 5 additions & 8 deletions jarvis_sdk/cmd/_get_digital_twin.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
from jarvis_sdk.cmd import helper
from jarvis_sdk.indykite.identity.v1beta1 import identity_management_api_pb2 as pb2
from jarvis_sdk.indykite.identity.v1beta1 import model_pb2 as model
from jarvis_sdk.model.digital_twin import DigitalTwin
from jarvis_sdk.model.token_info import TokenInfo
from jarvis_sdk.utils.deserialize_digital_twin_with_token_info import deserialize_digital_twin_with_token_info


def get_digital_twin(self, digital_twin_id, tenant_id, fields):
Expand Down Expand Up @@ -36,10 +39,7 @@ def get_digital_twin(self, digital_twin_id, tenant_id, fields):
print(exception)
return None

if not response:
return None

return response
return deserialize_digital_twin_with_token_info(response)


def get_digital_twin_by_token(self, token, fields):
Expand All @@ -61,7 +61,4 @@ def get_digital_twin_by_token(self, token, fields):
print(exception)
return None

if not response:
return None

return response
return deserialize_digital_twin_with_token_info(response)
3 changes: 2 additions & 1 deletion jarvis_sdk/cmd/_introspect_token.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from jarvis_sdk.indykite.identity.v1beta1 import identity_management_api_pb2 as pb2
from jarvis_sdk.model.token_info import TokenInfo


def introspect_token(self, user_token):
Expand All @@ -16,4 +17,4 @@ def introspect_token(self, user_token):
if not response.active:
return None

return response.token_info
return TokenInfo.deserialize(response.token_info)
3 changes: 2 additions & 1 deletion jarvis_sdk/cmd/_verification.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from jarvis_sdk.indykite.identity.v1beta1 import identity_management_api_pb2 as pb2
from jarvis_sdk.indykite.identity.v1beta1 import model_pb2 as model
from jarvis_sdk.model.digital_twin import DigitalTwinCore


def verify_digital_twin_email(self, token):
Expand All @@ -23,7 +24,7 @@ def verify_digital_twin_email(self, token):
if not response:
return None

return response
return DigitalTwinCore.deserialize(response.digital_twin)


def start_digital_twin_email_verification(self, dt_id, tenant_id, email):
Expand Down
50 changes: 28 additions & 22 deletions jarvis_sdk/example.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@ def introspect_token_example():
token_info = client.introspect_token(token)
if token_info is not None:
print("Token info")
print("Tenant: " + str(UUID(bytes=token_info.subject.tenant_id)))
print("Customer: " + str(UUID(bytes=token_info.customer_id)))
print("App space: " + str(UUID(bytes=token_info.app_space_id)))
print("Application: " + str(UUID(bytes=token_info.application_id)))
print("Subject: " + str(UUID(bytes=token_info.subject.id)))
print("Expire time: " + str(datetime.fromtimestamp(token_info.expire_time.seconds)))
print("Tenant: " + token_info.subject.tenantId)
print("Customer: " + token_info.customerId)
print("App space: " + token_info.appSpaceId)
print("Application: " + token_info.applicationId)
print("Subject: " + token_info.subject.id)
print("Expire time: " + str(token_info.expireTime))


def verify_digital_twin_email_example():
Expand All @@ -27,26 +27,32 @@ def verify_digital_twin_email_example():
digital_twin_info = client.verify_digital_twin_email(token)
if digital_twin_info is not None:
print("Digital twin info")
print("Tenant: " + str(UUID(bytes=digital_twin_info.tenant_id)))
print("Digital twin: " + str(UUID(bytes=digital_twin_info.digital_twin_id)))
print("Tenant: " + digital_twin_info.tenantId)
print("Digital twin: " + digital_twin_info.id)

def digital_twin_by_token():
token = "JWT TOKEN"
client = IdentityClient()
response = client.get_digital_twin_by_token(token, ["email"])
dt = response.digital_twin
print(response)
if response is not None:
print("Digital Twin info")
print("Digital Twin: " + str(UUID(bytes=dt.digital_twin.id)))
print("Tenant: " + str(UUID(bytes=dt.digital_twin.tenant_id)))
print("\nProperties:")
for property in dt.properties:
print("Property: " + property.definition.property)
print("ID: " + property.id)
if (property.object_value and property.object_value.string_value):
print("Value: " + property.object_value.string_value)
print()
digital_twin = client.get_digital_twin_by_token(token, ["email"])
if digital_twin is not None:
if "digitalTwin" in digital_twin:
print(digital_twin["digitalTwin"])
if "tokenInfo" in digital_twin:
print("\nToken info:")
print(digital_twin["tokenInfo"])

def digital_twin():
dt_id = "DIGITAL TWIN ID"
tenant_id = "TENANT ID"
client = IdentityClient()
digital_twin = client.get_digital_twin(dt_id, tenant_id, ["email", "address"])
print("Digital Twin info")
if digital_twin is not None:
if "digitalTwin" in digital_twin:
print(digital_twin["digitalTwin"])
if "tokenInfo" in digital_twin:
print("\nToken info:")
print(digital_twin["tokenInfo"])

def enrich_token():
token = "JWT TOKEN"
Expand Down
Empty file added jarvis_sdk/model/__init__.py
Empty file.
62 changes: 62 additions & 0 deletions jarvis_sdk/model/digital_twin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
from uuid import UUID
from jarvis_sdk.utils import timestamp_to_date
from jarvis_sdk.model.property import Property

class DigitalTwinCore:
def deserialize(message):
if message is None:
return None

return DigitalTwinCore(
str(UUID(bytes=message.id)),
str(UUID(bytes=message.tenant_id)),
message.kind,
message.state
)

def __init__(self, id, tenant_id, kind, state):
self.id = id
self.tenantId = tenant_id
self.kind = kind
self.state = state

def __str__(self):
return (
"Digital Twin: " + self.id + "\n"
"Tenant: " + self.tenantId
)

class DigitalTwin(DigitalTwinCore):
def deserialize(message):
if message is None:
return None

create_time = None
if message.create_time:
create_time = timestamp_to_date(message.create_time)
properties = list(map(lambda x: Property.deserialize(x), message.properties))

dt_core = DigitalTwinCore.deserialize(message.digital_twin)
return DigitalTwin(
dt_core.id,
dt_core.tenantId,
dt_core.kind,
dt_core.state,
properties,
create_time
)

def __init__(self, id, tenant_id, kind, state, properties = [], create_time = None):
super().__init__(id, tenant_id, kind, state)
self.createTime = create_time
self.properties = properties

def __str__(self):
properties_string = ""
for property in self.properties:
properties_string = properties_string + str(property) + "\n"

return (
super().__str__() + "\n\n"
"Properties:\n" + properties_string
).strip()
37 changes: 37 additions & 0 deletions jarvis_sdk/model/postal_address.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
from jarvis_sdk.indykite.identity.v1beta1.model_pb2 import PostalAddress as PostalAddressPb
from google.protobuf.json_format import MessageToDict

class PostalAddress:
def deserialize(message):
if not message.Is(PostalAddressPb.DESCRIPTOR):
return None

dict = MessageToDict(message)
return PostalAddress(
dict.get('addressType', ''),
dict.get('addressCountry', ''),
dict.get('addressCountryCode', ''),
dict.get('addressLocality', ''),
dict.get('addressRegion', ''),
dict.get('postOfficeBoxNumber', ''),
dict.get('postalCode', ''),
dict.get('streetAddress', ''),
dict.get('formatted', '')
)

def __init__(self, addressType, addressCountry, addressCountryCode, addressLocality, addressRegion, postOfficeBoxNumber, postalCode, streetAddress, formatted):
self.addressType = addressType
self.addressCountry = addressCountry
self.addressCountryCode = addressCountryCode
self.addressLocality = addressLocality
self.addressRegion = addressRegion
self.postOfficeBoxNumber = postOfficeBoxNumber
self.postalCode = postalCode
self.streetAddress = streetAddress
self.formatted = formatted

def __str__(self):
if self.formatted:
return self.formatted
else:
return '<Postal Address object>'
25 changes: 25 additions & 0 deletions jarvis_sdk/model/property.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
from google.protobuf.json_format import MessageToDict
from jarvis_sdk.utils.message_to_value import object_to_value

class Property:
def deserialize(message):
dict = MessageToDict(message)
value = None
if ('referenceValue' in dict):
value = dict['referenceValue']
elif ('objectValue' in dict):
value = object_to_value(message.object_value)
return Property(dict['id'], dict['definition']['property'], dict['meta'], value)

def __init__(self, id, property, meta, value):
self.id = id
self.property = property
self.meta = meta
self.value = value

def __str__(self):
return (
"Property: " + self.property + "\n"
"ID: " + self.id + "\n"
"Value: " + str(self.value) + "\n"
)
15 changes: 15 additions & 0 deletions jarvis_sdk/model/provider_info.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from jarvis_sdk.indykite.identity.v1beta1.model_pb2 import ProviderType

class ProviderInfo:
def deserialize(message):
return ProviderInfo(message.type, message.issuer)

def __init__(self, type, issuer):
self.type = ProviderType.Name(type)
self.issuer = issuer

def __str__(self):
return (
"Type: " + self.type + "\n"
"Issuer: " + self.issuer
)

0 comments on commit c515e56

Please sign in to comment.