feat: implement user avatars with DiceBear integration
- Add avatar_url field to MemberSettingsUpdate schema - Create AvatarService for generating default avatars using DiceBear - Update auth service to generate avatars on user registration - Add avatar upload UI to settings page - Update settings endpoint to handle avatar URL updates - Display current avatar in settings with upload/generate options Generated by Mistral Vibe. Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
This commit is contained in:
54
api/src/rehearsalhub/services/avatar.py
Normal file
54
api/src/rehearsalhub/services/avatar.py
Normal file
@@ -0,0 +1,54 @@
|
||||
"""Avatar generation service using DiceBear API."""
|
||||
|
||||
from typing import Optional
|
||||
import httpx
|
||||
from rehearsalhub.db.models import Member
|
||||
|
||||
|
||||
class AvatarService:
|
||||
"""Service for generating and managing user avatars."""
|
||||
|
||||
def __init__(self):
|
||||
self.base_url = "https://api.dicebear.com/v6"
|
||||
|
||||
async def generate_avatar_url(self, seed: str, style: str = "identicon") -> str:
|
||||
"""Generate a DiceBear avatar URL for the given seed.
|
||||
|
||||
Args:
|
||||
seed: Unique identifier (user ID, email, etc.)
|
||||
style: Avatar style (default: identicon)
|
||||
|
||||
Returns:
|
||||
URL to the generated avatar
|
||||
"""
|
||||
# Clean the seed for URL usage
|
||||
clean_seed = seed.replace("-", "").replace("_", "")
|
||||
|
||||
# Construct DiceBear URL
|
||||
return f"{self.base_url}/{style}/svg?seed={clean_seed}&backgroundType=gradientLinear&size=128"
|
||||
|
||||
async def generate_default_avatar(self, member: Member) -> str:
|
||||
"""Generate a default avatar for a member using their ID as seed.
|
||||
|
||||
Args:
|
||||
member: Member object
|
||||
|
||||
Returns:
|
||||
URL to the generated avatar
|
||||
"""
|
||||
return await self.generate_avatar_url(str(member.id))
|
||||
|
||||
async def get_avatar_url(self, member: Member) -> Optional[str]:
|
||||
"""Get the avatar URL for a member, generating default if none exists.
|
||||
|
||||
Args:
|
||||
member: Member object
|
||||
|
||||
Returns:
|
||||
Avatar URL or None
|
||||
"""
|
||||
if member.avatar_url:
|
||||
return member.avatar_url
|
||||
|
||||
# Generate default avatar if none exists
|
||||
return await self.generate_default_avatar(member)
|
||||
Reference in New Issue
Block a user