Add provisioning API for resolving identifiers
This commit is contained in:
@@ -66,6 +66,9 @@ class ProvisioningAPI(AuthAPI):
|
|||||||
self.app.router.add_route("GET", f"{user_prefix}", self.get_user_info)
|
self.app.router.add_route("GET", f"{user_prefix}", self.get_user_info)
|
||||||
self.app.router.add_route("GET", f"{user_prefix}/chats", self.get_chats)
|
self.app.router.add_route("GET", f"{user_prefix}/chats", self.get_chats)
|
||||||
self.app.router.add_route("GET", f"{user_prefix}/contacts", self.get_contacts)
|
self.app.router.add_route("GET", f"{user_prefix}/contacts", self.get_contacts)
|
||||||
|
self.app.router.add_route(
|
||||||
|
"POST", f"{user_prefix}/resolve_identifier/{{identifier}}", self.resolve_identifier
|
||||||
|
)
|
||||||
self.app.router.add_route("POST", f"{user_prefix}/pm/{{identifier}}", self.start_dm)
|
self.app.router.add_route("POST", f"{user_prefix}/pm/{{identifier}}", self.start_dm)
|
||||||
|
|
||||||
self.app.router.add_route("POST", f"{user_prefix}/logout", self.logout)
|
self.app.router.add_route("POST", f"{user_prefix}/logout", self.logout)
|
||||||
@@ -401,40 +404,80 @@ class ProvisioningAPI(AuthAPI):
|
|||||||
return err
|
return err
|
||||||
return web.json_response(data=await user.sync_contacts())
|
return web.json_response(data=await user.sync_contacts())
|
||||||
|
|
||||||
async def start_dm(self, request: web.Request) -> web.Response:
|
async def _resolve_id(
|
||||||
|
self, request: web.Request
|
||||||
|
) -> tuple[Portal | None, User | None, TLUser | None, web.Response | None]:
|
||||||
data, user, err = await self.get_user_request_info(request, expect_logged_in=True)
|
data, user, err = await self.get_user_request_info(request, expect_logged_in=True)
|
||||||
if err is not None:
|
if err is not None:
|
||||||
return err
|
return None, user, None, err
|
||||||
try:
|
try:
|
||||||
identifier: str | int = request.match_info["identifier"]
|
identifier: str | int = request.match_info["identifier"]
|
||||||
if isinstance(identifier, str) and identifier.isdecimal():
|
if isinstance(identifier, str) and identifier.isdecimal():
|
||||||
identifier = int(identifier)
|
identifier = int(identifier)
|
||||||
target = await user.client.get_entity(identifier)
|
target = await user.client.get_entity(identifier)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
return web.json_response(
|
return (
|
||||||
{
|
None,
|
||||||
"error": "Invalid user identifier or user not found.",
|
user,
|
||||||
"errcode": "M_NOT_FOUND",
|
None,
|
||||||
},
|
web.json_response(
|
||||||
status=404,
|
{
|
||||||
|
"error": "Invalid user identifier or user not found.",
|
||||||
|
"errcode": "M_NOT_FOUND",
|
||||||
|
},
|
||||||
|
status=404,
|
||||||
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
if not target:
|
if not target:
|
||||||
return web.json_response(
|
return (
|
||||||
{
|
None,
|
||||||
"error": "User not found.",
|
user,
|
||||||
"errcode": "M_NOT_FOUND",
|
None,
|
||||||
},
|
web.json_response(
|
||||||
status=404,
|
{
|
||||||
|
"error": "User not found.",
|
||||||
|
"errcode": "M_NOT_FOUND",
|
||||||
|
},
|
||||||
|
status=404,
|
||||||
|
),
|
||||||
)
|
)
|
||||||
elif not isinstance(target, TLUser):
|
elif not isinstance(target, TLUser):
|
||||||
return web.json_response(
|
return (
|
||||||
{
|
None,
|
||||||
"error": "Identifier is not a user.",
|
user,
|
||||||
},
|
None,
|
||||||
status=400,
|
web.json_response(
|
||||||
|
{
|
||||||
|
"error": "Identifier is not a user.",
|
||||||
|
"errcode": "FI.MAU.TELEGRAM_ID_NOT_USER",
|
||||||
|
},
|
||||||
|
status=400,
|
||||||
|
),
|
||||||
)
|
)
|
||||||
portal = await Portal.get_by_entity(target, tg_receiver=user.tgid)
|
portal = await Portal.get_by_entity(target, tg_receiver=user.tgid)
|
||||||
|
return portal, user, target, None
|
||||||
|
|
||||||
|
async def resolve_identifier(self, request: web.Request) -> web.Response:
|
||||||
|
portal, user, target, err = await self._resolve_id(request)
|
||||||
|
if err is not None:
|
||||||
|
return err
|
||||||
|
puppet = await portal.get_dm_puppet()
|
||||||
|
await puppet.update_info(user, target)
|
||||||
|
return web.json_response(
|
||||||
|
{
|
||||||
|
"room_id": portal.mxid,
|
||||||
|
"just_created": False,
|
||||||
|
"id": portal.tgid,
|
||||||
|
"contact_info": puppet.contact_info,
|
||||||
|
},
|
||||||
|
status=200,
|
||||||
|
)
|
||||||
|
|
||||||
|
async def start_dm(self, request: web.Request) -> web.Response:
|
||||||
|
portal, user, target, err = await self._resolve_id(request)
|
||||||
|
if err is not None:
|
||||||
|
return err
|
||||||
puppet = await portal.get_dm_puppet()
|
puppet = await portal.get_dm_puppet()
|
||||||
if portal.mxid:
|
if portal.mxid:
|
||||||
just_created = False
|
just_created = False
|
||||||
|
|||||||
Reference in New Issue
Block a user