Skip to content

Commit 5779b83

Browse files
committed
feat(portaswitch): add phone numbers contact search
1 parent e61dec6 commit 5779b83

File tree

4 files changed

+48
-3
lines changed

4 files changed

+48
-3
lines changed

app/bss/adapters/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,7 @@ def retrieve_contacts_v2(
262262
self, session: SessionInfo,
263263
user: UserInfo,
264264
search: Optional[str] = None,
265+
phone_numbers: List[str] = [],
265266
page: Optional[int] = 1,
266267
items_per_page: Optional[int] = 100,
267268
) -> tuple[List[ContactInfo], int]:
@@ -428,6 +429,7 @@ def retrieve_contacts_v2(
428429
self, session: SessionInfo,
429430
user: UserInfo,
430431
search: Optional[str] = None,
432+
phone_numbers: List[str] = [],
431433
page: Optional[int] = 1,
432434
items_per_page: Optional[int] = 100,
433435
) -> tuple[List[ContactInfo], int]:

app/bss/adapters/netsapiens.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,7 @@ def retrieve_contacts_v2(
461461
session: SessionInfo,
462462
user: UserInfo,
463463
search: Optional[str] = None,
464+
phone_numbers: List[str] = [],
464465
page: Optional[int] = 1,
465466
items_per_page: Optional[int] = 100,
466467
) -> tuple[List[ContactInfo], int]:

app/bss/adapters/portaswitch/adapter.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,7 @@ def retrieve_contacts_v2(
557557
self, session: SessionInfo,
558558
user: UserInfo,
559559
search: Optional[str] = None,
560+
phone_numbers: List[str] = [],
560561
page: Optional[int] = 1,
561562
items_per_page: Optional[int] = 100,
562563
) -> tuple[List[ContactInfo], int]:
@@ -583,6 +584,46 @@ def retrieve_contacts_v2(
583584
i_customer = int(account_info["i_customer"])
584585
i_account = int(account_info["i_account"])
585586

587+
# Normalize and prepare phone numbers if provided
588+
normalized_phone_numbers: set[str] = set[str]()
589+
if phone_numbers:
590+
for number in phone_numbers:
591+
if not number:
592+
continue
593+
normalized_phone_numbers.add(number.replace("+", "").strip())
594+
595+
# If phone_numbers search is provided, ignore generic `search` and use a unified implementation
596+
if normalized_phone_numbers:
597+
contacts: list[ContactInfo] = []
598+
for number in normalized_phone_numbers:
599+
try:
600+
# Exact search by main number (id)
601+
result = self._admin_api.get_account_list(i_customer, id=number)
602+
accounts = result.get("account_list", []) or []
603+
for account in accounts:
604+
contacts.append(Serializer.get_contact_info_by_account(account, account["i_account"]))
605+
except Exception as e:
606+
logging.debug(f"Failed to fetch accounts for phone number {number}: {e}")
607+
continue
608+
609+
# Add matching custom contacts
610+
custom_contacts = [
611+
Serializer.get_contact_info_by_custom_entry(entry)
612+
for entry in self._portaswitch_settings.CONTACTS_CUSTOM
613+
]
614+
615+
for contact in custom_contacts:
616+
number = contact.numbers.main if contact.numbers and contact.numbers.main else ""
617+
618+
if number.replace("+", "").strip() in normalized_phone_numbers:
619+
contacts.append(contact)
620+
621+
total_count = len(contacts)
622+
start_idx = (page - 1) * items_per_page
623+
end_idx = start_idx + items_per_page
624+
625+
return contacts[start_idx:end_idx], total_count
626+
586627
contacts = []
587628
match self._portaswitch_settings.CONTACTS_SELECTING:
588629
case PortaSwitchContactsSelectingMode.EXTENSIONS:

app/main.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
import os
44
import sys
55
from datetime import datetime
6-
from typing import Optional, Union
6+
from typing import Optional, Union, List
77

8-
from fastapi import FastAPI, APIRouter, Depends, Response, Request, Header, Body
8+
from fastapi import FastAPI, APIRouter, Depends, Response, Request, Header, Body, Query
99
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
1010
from pydantic import conint
1111
from starlette.responses import StreamingResponse
@@ -591,6 +591,7 @@ def get_user_contact_list(
591591
)
592592
def get_user_contact_list_v2(
593593
search: str = None,
594+
phone_numbers: List[str] = Query(default=[]),
594595
auth_data: HTTPAuthorizationCredentials = Depends(security),
595596
page: Optional[conint(ge=1)] = 1,
596597
items_per_page: Optional[conint(ge=1)] = 100,
@@ -615,7 +616,7 @@ def get_user_contact_list_v2(
615616
tenant_id=bss.default_id_if_none(x_webtrit_tenant_id))
616617

617618
if Capabilities.extensions in bss_capabilities:
618-
contacts, total = bss.retrieve_contacts_v2(session, user, search, page, items_per_page)
619+
contacts, total = bss.retrieve_contacts_v2(session, user, search, phone_numbers, page, items_per_page)
619620

620621
return Contacts(items=contacts,
621622
pagination=Pagination(

0 commit comments

Comments
 (0)