File size: 2,948 Bytes
3a7eb07
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
"""
User Profile API Endpoints
User profile management endpoints
"""

import logging
from typing import List, Optional

from fastapi import APIRouter, Depends
from pydantic import BaseModel
from sqlalchemy.orm import Session

from app.api.deps import get_current_user, get_current_user_id
from app.db.session import get_db
from app.models.user import User

logger = logging.getLogger(__name__)

router = APIRouter()


class UserProfileResponse(BaseModel):
    """User profile response"""

    clerk_user_id: str
    email: Optional[str] = None
    full_name: Optional[str] = None
    avatar_url: Optional[str] = None
    company_name: Optional[str] = None
    company_role: Optional[str] = None
    industry_focus: Optional[List[str]] = None
    mine_sites: Optional[List[str]] = None
    is_active: bool = True

    class Config:
        from_attributes = True


class UserProfileUpdate(BaseModel):
    """User profile update request"""

    full_name: Optional[str] = None
    company_name: Optional[str] = None
    company_role: Optional[str] = None
    industry_focus: Optional[List[str]] = None
    mine_sites: Optional[List[str]] = None


@router.get("/profile", response_model=UserProfileResponse)
async def get_user_profile(
    user: User = Depends(get_current_user),
):
    """
    Get the current user's profile.
    Creates the user record on first access if it doesn't exist.
    """
    return UserProfileResponse(
        clerk_user_id=user.clerk_user_id,
        email=user.email,
        full_name=user.full_name,
        avatar_url=user.avatar_url,
        company_name=user.company_name,
        company_role=user.company_role,
        industry_focus=user.industry_focus,
        mine_sites=user.mine_sites,
        is_active=user.is_active,
    )


@router.put("/profile", response_model=UserProfileResponse)
async def update_user_profile(
    request: UserProfileUpdate,
    user: User = Depends(get_current_user),
    db: Session = Depends(get_db),
):
    """
    Update the current user's profile.
    """
    if request.full_name is not None:
        user.full_name = request.full_name
    if request.company_name is not None:
        user.company_name = request.company_name
    if request.company_role is not None:
        user.company_role = request.company_role
    if request.industry_focus is not None:
        user.industry_focus = request.industry_focus
    if request.mine_sites is not None:
        user.mine_sites = request.mine_sites

    db.commit()
    db.refresh(user)

    logger.info(f"User profile updated: {user.clerk_user_id[:12]}")

    return UserProfileResponse(
        clerk_user_id=user.clerk_user_id,
        email=user.email,
        full_name=user.full_name,
        avatar_url=user.avatar_url,
        company_name=user.company_name,
        company_role=user.company_role,
        industry_focus=user.industry_focus,
        mine_sites=user.mine_sites,
        is_active=user.is_active,
    )