Skip to content

Commit 06c59be

Browse files
Handler to create firebase dynamic link for connection invitations.
Signed-off-by: George J Padayatti <[email protected]>
1 parent d75985d commit 06c59be

File tree

2 files changed

+121
-2
lines changed

2 files changed

+121
-2
lines changed

mydata_did/v1_0/manager.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3805,3 +3805,67 @@ async def create_invitation(
38053805
await connection.attach_invitation(self.context, invitation)
38063806

38073807
return connection, invitation
3808+
3809+
3810+
async def generate_firebase_dynamic_link_for_connection_invitation(self, conn_id: str) -> str:
3811+
"""Generate a Firebase Dynamic Link for a connection invitation."""
3812+
3813+
# Fetch config from os environ
3814+
config = await self.fetch_firebase_config_from_os_environ()
3815+
3816+
# Fetch connection record
3817+
3818+
try:
3819+
3820+
connection_record: ConnectionRecord = await ConnectionRecord.retrieve_by_id(
3821+
self.context,
3822+
conn_id
3823+
)
3824+
3825+
except StorageError as err:
3826+
raise ADAManagerError(
3827+
f"Failed to fetch connection record: {err}"
3828+
)
3829+
3830+
# Retreive connection invitation
3831+
3832+
connection_invitation: ConnectionInvitation = await connection_record.retrieve_invitation(self.context)
3833+
3834+
# Get the invitation url
3835+
3836+
invitation_url = connection_invitation.to_url()
3837+
3838+
# Generate the dynamic link
3839+
3840+
# Construct firebase payload
3841+
payload = {
3842+
"dynamicLinkInfo": {
3843+
"domainUriPrefix": config["firebase_domain_uri_prefix"],
3844+
"link": invitation_url,
3845+
"androidInfo": {
3846+
"androidPackageName": config["firebase_android_android_package_name"],
3847+
},
3848+
"iosInfo": {
3849+
"iosBundleId": config["firebase_ios_bundle_id"],
3850+
"iosAppStoreId": config["firebase_ios_appstore_id"],
3851+
}
3852+
},
3853+
"suffix": {
3854+
"option": "UNGUESSABLE"
3855+
}
3856+
}
3857+
3858+
firebase_dynamic_link_endpoint = "https://firebasedynamiclinks.googleapis.com/v1/shortLinks?key=" + \
3859+
config["firebase_web_api_key"]
3860+
3861+
jresp = {}
3862+
async with aiohttp.ClientSession() as session:
3863+
async with session.post(firebase_dynamic_link_endpoint, json=payload) as resp:
3864+
if resp.status == 200:
3865+
jresp = await resp.json()
3866+
else:
3867+
raise ADAManagerError(
3868+
f"Failed to generate firebase dynamic link for connection-invitation: {resp.status} {await resp.text()}"
3869+
)
3870+
3871+
return jresp["shortLink"]

mydata_did/v1_0/routes.py

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2784,6 +2784,55 @@ async def v2_connections_create_invitation(request: web.BaseRequest):
27842784

27852785
return web.json_response(result)
27862786

2787+
class GenerateFirebaseDynamicLinkForConnectionInvitationMatchInfoSchema(OpenAPISchema):
2788+
"""Schema for matching path parameters in generate firebase dynamic link for connection invitation handler"""
2789+
2790+
conn_id = fields.Str(
2791+
description="Connection identifier", example=UUIDFour.EXAMPLE, required=True
2792+
)
2793+
2794+
class GenerateFirebaseDynamicLinkForConnectionInvitationResponseSchema(OpenAPISchema):
2795+
"""Schema for response of generate firebase dynamic link for connection invitation handler"""
2796+
2797+
# Firebase dynamic link
2798+
firebase_dynamic_link = fields.Str(
2799+
description="Firebase dynamic link", example="https://example.page.link/UVWXYZuvwxyz12345"
2800+
)
2801+
2802+
@docs(
2803+
tags=["connection"],
2804+
summary="Generate firebase dynamic link for connection invitation",
2805+
)
2806+
@match_info_schema(GenerateFirebaseDynamicLinkForConnectionInvitationMatchInfoSchema())
2807+
@response_schema(GenerateFirebaseDynamicLinkForConnectionInvitationResponseSchema(), 200)
2808+
async def generate_firebase_dynamic_link_for_connection_invitation_handler(request: web.BaseRequest):
2809+
"""
2810+
Request handler for generating firebase dynamic link for connection invitation.
2811+
2812+
Args:
2813+
request: aiohttp request object
2814+
2815+
Returns:
2816+
The firebase dynamic link
2817+
2818+
"""
2819+
2820+
context = request.app["request_context"]
2821+
conn_id = request.match_info["conn_id"]
2822+
2823+
# Initialise MyData DID Manager.
2824+
mydata_did_manager: ADAManager = ADAManager(context=context)
2825+
try:
2826+
# Call the function
2827+
firebase_dynamic_link = await mydata_did_manager.generate_firebase_dynamic_link_for_connection_invitation(conn_id)
2828+
2829+
except (ConnectionManagerError, BaseModelError) as err:
2830+
raise web.HTTPBadRequest(reason=err.roll_up) from err
2831+
2832+
return web.json_response({
2833+
"firebase_dynamic_link": firebase_dynamic_link
2834+
})
2835+
27872836

27882837
async def register(app: web.Application):
27892838

@@ -2966,8 +3015,14 @@ async def register(app: web.Application):
29663015
"/json-ld/didcomm/processed-data/connections/{connection_id}",
29673016
send_json_ld_didcomm_processed_data_message_handler,
29683017
),
2969-
web.post("/connections/create-invitation/v2",
2970-
v2_connections_create_invitation),
3018+
web.post(
3019+
"/connections/create-invitation/v2",
3020+
v2_connections_create_invitation
3021+
),
3022+
web.post(
3023+
"/connections/{conn_id}/invitation/firebase",
3024+
generate_firebase_dynamic_link_for_connection_invitation_handler
3025+
)
29713026
]
29723027
)
29733028

0 commit comments

Comments
 (0)