Skip to content
This repository was archived by the owner on Mar 18, 2026. It is now read-only.

Commit 768ea21

Browse files
Merge branch 'main' into dependabot/uv/main/dev-dependencies-a03549f734
2 parents 631d65b + 65d67ff commit 768ea21

2 files changed

Lines changed: 56 additions & 4 deletions

File tree

app/api/profiles.py

Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,13 @@
66

77
from app.api.dependencies import verify_faktory_access_token
88
from app.backend.factory import backend
9-
from app.backend.models import AgentFilter, ProfileFilter, WalletFilter
9+
from app.backend.models import (
10+
AgentFilter,
11+
DAOFilter,
12+
HolderFilter,
13+
ProfileFilter,
14+
WalletFilter,
15+
)
1016
from app.config import config
1117
from app.lib.logger import configure_logger
1218

@@ -34,6 +40,7 @@ class ProfileAddresses(BaseModel):
3440
@router.get("/addresses", response_model=List[ProfileAddresses])
3541
async def get_all_profile_addresses(
3642
request: Request,
43+
dao_name: Optional[str] = None,
3744
_: None = Depends(verify_faktory_access_token),
3845
) -> JSONResponse:
3946
"""Get all profile addresses with their associated agent and wallet information.
@@ -44,6 +51,7 @@ async def get_all_profile_addresses(
4451
4552
Args:
4653
request: The FastAPI request object.
54+
dao_name: Optional DAO name to filter results by.
4755
4856
Returns:
4957
JSONResponse: Array of profile address information.
@@ -52,8 +60,9 @@ async def get_all_profile_addresses(
5260
HTTPException: If there's an error retrieving the data.
5361
"""
5462
try:
63+
dao_filter_msg = f" (filtered by DAO: {dao_name})" if dao_name else ""
5564
logger.info(
56-
f"Profile addresses request received from {request.client.host if request.client else 'unknown'}"
65+
f"Profile addresses request{dao_filter_msg} received from {request.client.host if request.client else 'unknown'}"
5766
)
5867

5968
# Determine which address field to use based on network configuration
@@ -69,6 +78,35 @@ async def get_all_profile_addresses(
6978
logger.info("No profiles found in the database")
7079
return JSONResponse(content=[])
7180

81+
# If DAO name filter is provided, find the DAO and filter profiles
82+
dao_agents = None
83+
if dao_name:
84+
daos = backend.list_daos(DAOFilter(name=dao_name))
85+
if not daos:
86+
logger.warning(f"No DAO found with name: {dao_name}")
87+
raise HTTPException(
88+
status_code=404,
89+
detail=f"DAO with name '{dao_name}' not found",
90+
)
91+
92+
dao = daos[0]
93+
logger.debug(f"Found DAO: {dao.name} (ID: {dao.id})")
94+
95+
# Get agents associated with this DAO
96+
all_agents = backend.list_agents(AgentFilter())
97+
dao_agents = []
98+
99+
for agent in all_agents:
100+
if agent.profile_id:
101+
# Check if this agent has holders associated with the DAO
102+
holders = backend.list_holders(
103+
HolderFilter(dao_id=dao.id, agent_id=agent.id)
104+
)
105+
if holders:
106+
dao_agents.append(agent.id)
107+
108+
logger.debug(f"Found {len(dao_agents)} agents for DAO: {dao_name}")
109+
72110
result = []
73111

74112
for profile in profiles:
@@ -89,6 +127,11 @@ async def get_all_profile_addresses(
89127
agents = backend.list_agents(AgentFilter(profile_id=profile.id))
90128
if agents:
91129
agent = agents[0] # Take the first agent
130+
131+
# If DAO filtering is enabled, skip profiles without agents in the DAO
132+
if dao_agents is not None and agent.id not in dao_agents:
133+
continue
134+
92135
profile_data.agent_account_contract = agent.account_contract
93136

94137
# Get wallet for this agent
@@ -101,6 +144,9 @@ async def get_all_profile_addresses(
101144
else wallet.testnet_address
102145
)
103146
profile_data.wallet_address = wallet_address
147+
elif dao_agents is not None:
148+
# If DAO filtering is enabled and profile has no agents, skip it
149+
continue
104150

105151
result.append(profile_data)
106152

@@ -109,9 +155,15 @@ async def get_all_profile_addresses(
109155
# Continue processing other profiles even if one fails
110156
continue
111157

112-
logger.info(f"Successfully retrieved address data for {len(result)} profiles")
158+
dao_log_msg = f" for DAO '{dao_name}'" if dao_name else ""
159+
logger.info(
160+
f"Successfully retrieved address data for {len(result)} profiles{dao_log_msg}"
161+
)
113162
return JSONResponse(content=[profile.model_dump() for profile in result])
114163

164+
except HTTPException:
165+
# Re-raise HTTP exceptions (like 404 for DAO not found)
166+
raise
115167
except Exception as e:
116168
logger.error(f"Failed to retrieve profile addresses: {str(e)}", exc_info=e)
117169
raise HTTPException(

0 commit comments

Comments
 (0)