minhvtt commited on
Commit
a7804d3
·
verified ·
1 Parent(s): ee8efa3

Update app/models/schemas.py

Browse files
Files changed (1) hide show
  1. app/models/schemas.py +157 -146
app/models/schemas.py CHANGED
@@ -1,146 +1,157 @@
1
- from datetime import datetime, timedelta, timezone
2
- from typing import Literal
3
-
4
- from pydantic import BaseModel, Field
5
-
6
-
7
- class LoginRequest(BaseModel):
8
- username: str
9
- password: str
10
-
11
-
12
- class LoginResponse(BaseModel):
13
- token: str
14
- role: Literal["admin", "sensitive_admin"] = "admin"
15
- expires_in_seconds: int = 3600
16
-
17
-
18
- class RegisterDeviceRequest(BaseModel):
19
- device_id: str
20
- hostname: str
21
- os_version: str
22
- agent_version: str
23
-
24
-
25
- class RegisterDeviceResponse(BaseModel):
26
- registered: bool = True
27
- session_token: str
28
-
29
-
30
- class HeartbeatRequest(BaseModel):
31
- device_id: str
32
- active_restriction_window: bool
33
- uptime_seconds: int = 0
34
-
35
-
36
- class HeartbeatResponse(BaseModel):
37
- accepted: bool = True
38
- server_time: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
39
-
40
-
41
- class DeviceStatusRow(BaseModel):
42
- device_id: str
43
- hostname: str
44
- agent_version: str
45
- os_version: str
46
- last_heartbeat_at: datetime | None = None
47
- active_restriction_window: bool = False
48
-
49
-
50
- class DeviceStatusResponse(DeviceStatusRow):
51
- is_online: bool = False
52
-
53
-
54
- class TimeWindow(BaseModel):
55
- day_of_week: Literal["mon", "tue", "wed", "thu", "fri", "sat", "sun"]
56
- start: str = Field(description="HH:MM")
57
- end: str = Field(description="HH:MM")
58
-
59
-
60
- class DevicePolicy(BaseModel):
61
- blocked_executables: list[str] = []
62
- blocked_domains: list[str] = []
63
- restriction_windows: list[TimeWindow] = []
64
-
65
-
66
- class UpdatePolicyRequest(BaseModel):
67
- device_id: str
68
- policy: DevicePolicy
69
-
70
-
71
- class ScreenshotIngestResponse(BaseModel):
72
- screenshot_id: str
73
- queued: bool = True
74
-
75
-
76
- class ViolationScreenshot(BaseModel):
77
- screenshot_id: str
78
- device_id: str
79
- timestamp: str
80
- filename: str
81
- created_at: str
82
- image_url: str
83
- confidence: float
84
- reason: str
85
- visibility_scope: Literal["admin", "sensitive_admin"] = "admin"
86
- ocr_urls: list[str] = []
87
-
88
-
89
- class GameReviewItem(BaseModel):
90
- review_id: str
91
- screenshot_id: str
92
- device_id: str
93
- timestamp: str
94
- status: Literal["pending", "approved", "rejected"]
95
- reason: str
96
- ocr_urls: list[str] = []
97
- created_at: datetime
98
-
99
-
100
- class GameReviewDecisionRequest(BaseModel):
101
- review_id: str
102
- approve_lock: bool
103
-
104
-
105
- class GameReviewDecisionResponse(BaseModel):
106
- updated: bool
107
-
108
-
109
- class KeyGenerateRequest(BaseModel):
110
- device_id: str
111
-
112
-
113
- class KeyGenerateResponse(BaseModel):
114
- device_id: str
115
- key: str
116
- expires_at: datetime
117
-
118
-
119
- class KeyValidateRequest(BaseModel):
120
- device_id: str
121
- key: str
122
-
123
-
124
- class KeyValidateResponse(BaseModel):
125
- valid: bool
126
- lock_until: datetime | None = None
127
-
128
-
129
- class AlertEvent(BaseModel):
130
- device_id: str
131
- type: Literal[
132
- "wrong_key",
133
- "policy_violation",
134
- "process_killed",
135
- "info",
136
- "device_status",
137
- "sensitive_detected",
138
- "game_lock_review_required",
139
- "game_lock_review_decision",
140
- ]
141
- message: str
142
- created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
143
-
144
-
145
- def lock_until_5_minutes() -> datetime:
146
- return datetime.now(timezone.utc) + timedelta(minutes=5)
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from datetime import datetime, timedelta, timezone
2
+ from typing import Literal
3
+
4
+ from pydantic import BaseModel, Field
5
+
6
+
7
+ class LoginRequest(BaseModel):
8
+ username: str
9
+ password: str
10
+
11
+
12
+ class LoginResponse(BaseModel):
13
+ token: str
14
+ role: Literal["admin", "sensitive_admin"] = "admin"
15
+ expires_in_seconds: int = 3600
16
+
17
+
18
+ class RegisterDeviceRequest(BaseModel):
19
+ device_id: str
20
+ hostname: str
21
+ os_version: str
22
+ agent_version: str
23
+
24
+
25
+ class RegisterDeviceResponse(BaseModel):
26
+ registered: bool = True
27
+ session_token: str
28
+
29
+
30
+ class HeartbeatRequest(BaseModel):
31
+ device_id: str
32
+ active_restriction_window: bool
33
+ uptime_seconds: int = 0
34
+
35
+
36
+ class HeartbeatResponse(BaseModel):
37
+ accepted: bool = True
38
+ server_time: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
39
+
40
+
41
+ class DeviceStatusRow(BaseModel):
42
+ device_id: str
43
+ hostname: str
44
+ agent_version: str
45
+ os_version: str
46
+ last_heartbeat_at: datetime | None = None
47
+ active_restriction_window: bool = False
48
+
49
+
50
+ class DeviceStatusResponse(DeviceStatusRow):
51
+ is_online: bool = False
52
+
53
+
54
+ class TimeWindow(BaseModel):
55
+ day_of_week: Literal["mon", "tue", "wed", "thu", "fri", "sat", "sun"]
56
+ start: str = Field(description="HH:MM")
57
+ end: str = Field(description="HH:MM")
58
+
59
+
60
+ class DevicePolicy(BaseModel):
61
+ blocked_executables: list[str] = []
62
+ blocked_domains: list[str] = []
63
+ restriction_windows: list[TimeWindow] = []
64
+
65
+
66
+ class UpdatePolicyRequest(BaseModel):
67
+ device_id: str
68
+ policy: DevicePolicy
69
+
70
+
71
+ class ScreenshotIngestResponse(BaseModel):
72
+ screenshot_id: str
73
+ queued: bool = True
74
+
75
+
76
+ class ViolationScreenshot(BaseModel):
77
+ screenshot_id: str
78
+ device_id: str
79
+ timestamp: str
80
+ filename: str
81
+ created_at: str
82
+ image_url: str
83
+ confidence: float
84
+ reason: str
85
+ visibility_scope: Literal["admin", "sensitive_admin"] = "admin"
86
+ ocr_urls: list[str] = []
87
+
88
+
89
+ class GameReviewItem(BaseModel):
90
+ review_id: str
91
+ screenshot_id: str
92
+ device_id: str
93
+ timestamp: str
94
+ status: Literal["pending", "approved", "rejected"]
95
+ reason: str
96
+ ocr_urls: list[str] = []
97
+ created_at: datetime
98
+
99
+
100
+ class GameReviewDecisionRequest(BaseModel):
101
+ review_id: str
102
+ approve_lock: bool
103
+
104
+
105
+ class GameReviewDecisionResponse(BaseModel):
106
+ updated: bool
107
+
108
+
109
+ class KeyGenerateRequest(BaseModel):
110
+ device_id: str
111
+
112
+
113
+ class KeyGenerateResponse(BaseModel):
114
+ device_id: str
115
+ key: str
116
+ expires_at: datetime
117
+
118
+
119
+ class KeyValidateRequest(BaseModel):
120
+ device_id: str
121
+ key: str
122
+
123
+
124
+ class KeyValidateResponse(BaseModel):
125
+ valid: bool
126
+ lock_until: datetime | None = None
127
+
128
+
129
+ class AlertEvent(BaseModel):
130
+ device_id: str
131
+ type: Literal[
132
+ "wrong_key",
133
+ "policy_violation",
134
+ "process_killed",
135
+ "info",
136
+ "device_status",
137
+ "sensitive_detected",
138
+ "game_lock_review_required",
139
+ "game_lock_review_decision",
140
+ "admin_message",
141
+ ]
142
+ message: str
143
+ created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
144
+
145
+
146
+ class DeviceMessageRequest(BaseModel):
147
+ device_id: str
148
+ message: str = Field(min_length=1, max_length=500)
149
+
150
+
151
+ class DeviceMessageResponse(BaseModel):
152
+ queued: bool
153
+ delivered_clients: int
154
+
155
+
156
+ def lock_until_5_minutes() -> datetime:
157
+ return datetime.now(timezone.utc) + timedelta(minutes=5)