File size: 1,269 Bytes
54eb2ce
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from pydantic import BaseModel, field_validator
from typing import Optional

from ..lib.categories import VALID_CATEGORY_CODES


class ProfileBase(BaseModel):
    phone: Optional[str] = None
    bio: Optional[str] = None
    avatar_url: Optional[str] = None
    topic_preferences: Optional[str] = None

    @field_validator("topic_preferences")
    @classmethod
    def validate_topic_preferences(cls, v: Optional[str]) -> Optional[str]:
        if v is None or v.strip() == "":
            return None
        tags = [t.strip() for t in v.split(",") if t.strip()]
        invalid = [t for t in tags if t not in VALID_CATEGORY_CODES]
        if invalid:
            raise ValueError(
                f"Invalid arXiv categories: {', '.join(invalid)}. "
                f"Must be valid CS/stat/eess categories (e.g. cs.AI, stat.ML)."
            )
        return ",".join(tags)


class ProfileCreate(ProfileBase):
    pass


class ProfileUpdate(ProfileBase):
    pass


class ProfileResponse(BaseModel):
    id: int
    user_id: int
    phone: Optional[str] = None
    bio: Optional[str] = None
    avatar_url: Optional[str] = None
    topic_preferences: Optional[str] = None

    class Config:
        from_attributes = True