minhvtt commited on
Commit
f5e453c
·
verified ·
1 Parent(s): ac7c1de

Update app/models/schemas.py

Browse files
Files changed (1) hide show
  1. app/models/schemas.py +146 -142
app/models/schemas.py CHANGED
@@ -1,142 +1,146 @@
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 TimeWindow(BaseModel):
51
- day_of_week: Literal["mon", "tue", "wed", "thu", "fri", "sat", "sun"]
52
- start: str = Field(description="HH:MM")
53
- end: str = Field(description="HH:MM")
54
-
55
-
56
- class DevicePolicy(BaseModel):
57
- blocked_executables: list[str] = []
58
- blocked_domains: list[str] = []
59
- restriction_windows: list[TimeWindow] = []
60
-
61
-
62
- class UpdatePolicyRequest(BaseModel):
63
- device_id: str
64
- policy: DevicePolicy
65
-
66
-
67
- class ScreenshotIngestResponse(BaseModel):
68
- screenshot_id: str
69
- queued: bool = True
70
-
71
-
72
- class ViolationScreenshot(BaseModel):
73
- screenshot_id: str
74
- device_id: str
75
- timestamp: str
76
- filename: str
77
- created_at: str
78
- image_url: str
79
- confidence: float
80
- reason: str
81
- visibility_scope: Literal["admin", "sensitive_admin"] = "admin"
82
- ocr_urls: list[str] = []
83
-
84
-
85
- class GameReviewItem(BaseModel):
86
- review_id: str
87
- screenshot_id: str
88
- device_id: str
89
- timestamp: str
90
- status: Literal["pending", "approved", "rejected"]
91
- reason: str
92
- ocr_urls: list[str] = []
93
- created_at: datetime
94
-
95
-
96
- class GameReviewDecisionRequest(BaseModel):
97
- review_id: str
98
- approve_lock: bool
99
-
100
-
101
- class GameReviewDecisionResponse(BaseModel):
102
- updated: bool
103
-
104
-
105
- class KeyGenerateRequest(BaseModel):
106
- device_id: str
107
-
108
-
109
- class KeyGenerateResponse(BaseModel):
110
- device_id: str
111
- key: str
112
- expires_at: datetime
113
-
114
-
115
- class KeyValidateRequest(BaseModel):
116
- device_id: str
117
- key: str
118
-
119
-
120
- class KeyValidateResponse(BaseModel):
121
- valid: bool
122
- lock_until: datetime | None = None
123
-
124
-
125
- class AlertEvent(BaseModel):
126
- device_id: str
127
- type: Literal[
128
- "wrong_key",
129
- "policy_violation",
130
- "process_killed",
131
- "info",
132
- "device_status",
133
- "sensitive_detected",
134
- "game_lock_review_required",
135
- "game_lock_review_decision",
136
- ]
137
- message: str
138
- created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
139
-
140
-
141
- def lock_until_5_minutes() -> datetime:
142
- 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
+ ]
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)