File size: 2,601 Bytes
2f4298a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
from pydantic import BaseModel, EmailStr, Field
from typing import Optional
from datetime import datetime


# User schemas
class UserBase(BaseModel):
    username: str = Field(..., min_length=3, max_length=50)
    email: EmailStr


class UserCreate(UserBase):
    password: str = Field(..., min_length=6)


class UserResponse(UserBase):
    id: int
    is_active: bool
    is_admin: bool
    created_at: datetime
    last_login: Optional[datetime] = None

    class Config:
        from_attributes = True


# Auth schemas
class Token(BaseModel):
    access_token: str
    token_type: str


class TokenData(BaseModel):
    username: Optional[str] = None


class LoginRequest(BaseModel):
    username: str
    password: str


# UserStats schemas
class UserStatsBase(BaseModel):
    energy: float = 100.0
    max_energy: float = 100.0
    hunger: float = 100.0
    max_hunger: float = 100.0
    level: int = 1
    experience: int = 0
    coins: int = 0


class UserStatsResponse(UserStatsBase):
    id: int
    user_id: int
    total_playtime: int
    rooms_visited: int
    items_collected: int
    enemies_defeated: int
    deaths: int
    updated_at: datetime

    class Config:
        from_attributes = True


class UserStatsUpdate(BaseModel):
    energy: Optional[float] = None
    hunger: Optional[float] = None
    experience: Optional[int] = None
    coins: Optional[int] = None
    rooms_visited: Optional[int] = None
    items_collected: Optional[int] = None
    enemies_defeated: Optional[int] = None
    deaths: Optional[int] = None


# GameSession schemas
class GameSessionCreate(BaseModel):
    pass


class GameSessionResponse(BaseModel):
    id: int
    user_id: int
    started_at: datetime
    ended_at: Optional[datetime] = None
    duration: int
    energy_consumed: float
    hunger_consumed: float
    rooms_visited_session: int
    items_collected_session: int
    enemies_defeated_session: int
    deaths_session: int

    class Config:
        from_attributes = True


# Admin schemas
class AdminStats(BaseModel):
    total_users: int
    active_users_today: int
    new_users_today: int
    total_sessions: int
    avg_session_duration: float
    total_playtime: int
    total_rooms_visited: int
    total_items_collected: int
    total_enemies_defeated: int


class UserListItem(BaseModel):
    id: int
    username: str
    email: str
    is_active: bool
    is_admin: bool
    created_at: datetime
    last_login: Optional[datetime] = None
    
    class Config:
        from_attributes = True


class UserDetail(UserListItem):
    stats: Optional[UserStatsResponse] = None