feat(avatar): complete authorization management

This commit is contained in:
stefanfeng
2026-08-19 16:21:19 +08:00
parent 25d2494616
commit 2e2adeb9e2
10 changed files with 2106 additions and 614 deletions
@@ -33,7 +33,11 @@ class TakeoverService:
self, owner_huihui_id: str, from_user_id: str
) -> Optional[Authorization]:
"""Check whether takeover is enabled for the given target user."""
avatar = self.db.query(Avatar).filter(Avatar.owner_id == owner_huihui_id).first()
avatar = (
self.db.query(Avatar)
.filter(Avatar.owner_id == owner_huihui_id, Avatar.status == "active")
.first()
)
if not avatar:
return None
@@ -41,10 +45,13 @@ class TakeoverService:
self.db.query(Authorization)
.filter(Authorization.avatar_id == avatar.id)
.filter(Authorization.target_id == from_user_id)
.filter(Authorization.target_type == "user")
.filter(Authorization.status == "active")
.filter(Authorization.takeover_enabled == True)
.first()
)
return auth if auth and auth.takeover_enabled else None
permissions = set(auth.permissions or []) if auth else set()
return auth if auth and "takeover" in permissions else None
async def generate_reply(self, avatar_id: str, message: str) -> str:
"""Call the avatar chat endpoint to generate a reply."""
@@ -170,5 +177,8 @@ class TakeoverService:
if auth.takeover_mode == "immediate":
await self.execute_takeover(auth, message)
elif not self.redis:
logger.warning("Redis not configured, executing delayed takeover immediately")
await self.execute_takeover(auth, message)
else:
self.enqueue_delayed_message(auth, message)