Skip to content

Commit bec6016

Browse files
committed
feat: mcp server and arguments
1 parent 40d6eb0 commit bec6016

File tree

9 files changed

+385
-88
lines changed

9 files changed

+385
-88
lines changed

main.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
groups_v2_router,
1616
activity_statistics_router,
1717
times_router,
18+
mcp_router,
1819
)
1920
from database import close_mongo_connection, connect_to_mongo
2021
import socketio
@@ -138,9 +139,10 @@ async def shutdown_event():
138139
app.include_router(
139140
activity_statistics_router.router, prefix="/api/v2/statistics/activities"
140141
)
142+
app.include_router(mcp_router.router, prefix="/api/v2/mcp")
141143

142144

143-
@app.router.get("/api/")
145+
@app.get("/api/")
144146
async def home():
145147
return {
146148
"status": "ok",

routers/activities_v2_router.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from datetime import datetime
44
from typing import Literal, cast
55
from bson import ObjectId
6-
from fastapi import APIRouter, Depends, HTTPException
6+
from fastapi import APIRouter, Depends, HTTPException, Query
77
from fastapi.responses import JSONResponse
88
from pydantic import BaseModel
99
from database import db
@@ -57,13 +57,13 @@ async def create_activity_v2(
5757

5858
@router.get("")
5959
async def get_activities_v2(
60-
page: int = 1,
61-
perpage: int = 10,
62-
search: str = "",
63-
sort: str = "_id",
64-
asc: bool = False,
65-
regex: bool = False,
66-
activity_type: str = "all",
60+
page: int = Query(1, ge=1, description="Page number for pagination"),
61+
perpage: int = Query(10, ge=1, le=100, description="Number of items per page"),
62+
search: str = Query("", description="Search string for filtering activities"),
63+
sort: str = Query("_id", description="Sort field"),
64+
asc: bool = Query(False, description="Sort order (ascending or descending)"),
65+
regex: bool = Query(False, description="Whether to use regex for searching"),
66+
activity_type: str = Query("all", description="Type of activity to filter by"),
6767
user=Depends(get_current_user),
6868
):
6969
"""
@@ -191,12 +191,12 @@ async def delete_activity_v2(
191191
@router.get("/{activity_id}/members")
192192
async def get_activity_members_v2(
193193
activity_id: str,
194-
page: int = 1,
195-
perpage: int = 10,
196-
search: str = "",
197-
sort: str = "_id",
198-
asc: bool = True,
199-
regex: bool = False,
194+
page: int = Query(1, ge=1, description="Page number for pagination"),
195+
perpage: int = Query(10, ge=1, le=100, description="Number of items per page"),
196+
search: str = Query("", description="Search string for filtering members"),
197+
sort: str = Query("_id", description="Sort field"),
198+
asc: bool = Query(True, description="Sort order (ascending or descending)"),
199+
regex: bool = Query(False, description="Whether to use regex for searching"),
200200
user=Depends(get_current_user),
201201
):
202202
"""

routers/groups_router.py

Lines changed: 19 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from typings.export import ExportFormat
88
from typings.group import Group
99
from bson import ObjectId
10-
from fastapi import APIRouter, HTTPException, Depends
10+
from fastapi import APIRouter, HTTPException, Depends, Query
1111
from database import db
1212
from pydantic import BaseModel
1313

@@ -48,10 +48,9 @@ async def create_group(payload: Group, user=Depends(get_current_user)):
4848

4949
@router.get("")
5050
async def get_groups(
51-
page: int = 1,
52-
perpage: int = 10,
53-
type="all",
54-
search="",
51+
page: int = Query(1, ge=1, description="Page number for pagination"),
52+
perpage: int = Query(10, ge=1, le=100, description="Number of items per page"),
53+
search: str = Query("", description="Search term for group names"),
5554
user=Depends(get_current_user),
5655
):
5756
"""
@@ -61,23 +60,13 @@ async def get_groups(
6160
if len(user["per"]) == 0:
6261
raise HTTPException(status_code=403, detail="Permission denied")
6362

64-
if type == "all":
65-
target = ["permission", "class"]
66-
elif type == "permission":
67-
target = ["permission"]
68-
elif type == "class":
69-
target = ["class"]
70-
else:
71-
raise HTTPException(status_code=400, detail="Invalid type")
72-
7363
count = await db.zvms.groups.count_documents(
7464
{"name": {"$regex": search, "$options": "i"}}
7565
)
7666

7767
pipeline = [
7868
{
7969
"$match": {
80-
"type": {"$in": target},
8170
"name": {"$regex": search, "$options": "i"},
8271
},
8372
},
@@ -148,9 +137,9 @@ async def update_group_name(
148137
@router.get("/{group_id}/activities")
149138
async def get_class_activities(
150139
group_id: str,
151-
page: int = 1,
152-
perpage: int = 10,
153-
query: str = "",
140+
page: int = Query(1, ge=1, description="Page number for pagination"),
141+
perpage: int = Query(10, ge=1, le=100, description="Number of items per page"),
142+
query: str = Query("", description="Search query for activities"),
154143
user=Depends(get_current_user),
155144
):
156145
"""
@@ -190,10 +179,10 @@ async def get_class_activities(
190179
@router.get("/{group_id}/user")
191180
async def get_users_in_class(
192181
group_id: str,
193-
page: int = 1,
194-
perpage: int = 10,
195-
search: str = "",
196-
pwdm: bool = False,
182+
page: int = Query(1, ge=1, description="Page number for pagination"),
183+
perpage: int = Query(10, ge=1, le=100, description="Number of items per page"),
184+
search: str = Query("", description="Search term for user names"),
185+
pwdm: bool = Query(False, description="Include password mode information"),
197186
user=Depends(get_current_user),
198187
):
199188
"""
@@ -238,14 +227,14 @@ async def get_users_in_class(
238227
@router.get("/{group_id}/time")
239228
async def get_user_times_in_class(
240229
group_id: str,
241-
page: int = 1,
242-
perpage: int = 10,
243-
exceeding: bool = True,
244-
shortage: bool = False,
245-
start: Optional[str] = None,
246-
end: Optional[str] = None,
247-
search: str = "",
248-
allow_cache: bool = True,
230+
page: int = Query(1, ge=1, description="Page number for pagination"),
231+
perpage: int = Query(10, ge=1, le=100, description="Number of items per page"),
232+
exceeding: bool = Query(True, description="Include exceeding time calculations"),
233+
shortage: bool = Query(False, description="Include shortage calculations"),
234+
start: Optional[str] = Query(None, description="Start date filter"),
235+
end: Optional[str] = Query(None, description="End date filter"),
236+
search: str = Query("", description="Search term for user names"),
237+
allow_cache: bool = Query(True, description="Allow cached time calculations"),
249238
user=Depends(get_current_user),
250239
):
251240
"""

routers/groups_v2_router.py

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from typing import Optional
44

55
from bson import ObjectId
6-
from fastapi import APIRouter, Depends
6+
from fastapi import APIRouter, Depends, Query
77

88
from config import (
99
BASE_OFF_CAMPUS,
@@ -26,12 +26,12 @@
2626
@router.get("/{group_id}/activities")
2727
async def get_group_activities_v2(
2828
group_id: str,
29-
page: int = 1,
30-
perpage: int = 10,
31-
search: str = "",
32-
sort: str = "_id",
33-
regex: bool = True,
34-
asc: bool = False,
29+
page: int = Query(1, ge=1, description="Page number for pagination"),
30+
perpage: int = Query(10, ge=1, le=100, description="Number of items per page"),
31+
search: str = Query("", description="Search keyword"),
32+
sort: str = Query("_id", description="Sort by field"),
33+
regex: bool = Query(True, description="Use regex for search"),
34+
asc: bool = Query(False, description="Sort in ascending order"),
3535
user=Depends(get_current_user),
3636
):
3737
"""
@@ -120,12 +120,12 @@ async def get_group_activities_v2(
120120
@router.get("/{group_id}/time")
121121
async def read_users(
122122
group_id: str,
123-
query: str = "",
124-
page: int = 1,
125-
perpage: int = 5,
126-
allow_cache: bool = True,
127-
sort: str = "id",
128-
asc: bool = True,
123+
query: str = Query("", description="Search query for user name or ID"),
124+
page: int = Query(1, ge=1, description="Page number for pagination"),
125+
perpage: int = Query(5, ge=1, le=100, description="Number of items per page"),
126+
allow_cache: bool = Query(True, description="Allow cached data"),
127+
sort: str = Query("id", description="Sort by field"),
128+
asc: bool = Query(True, description="Sort in ascending order"),
129129
user: Optional[str] = Depends(get_current_user),
130130
):
131131
"""
@@ -201,16 +201,16 @@ async def read_users(
201201
@router.get("/{group_id}/users")
202202
async def get_group_users_v2(
203203
group_id: str,
204-
page: int = 1,
205-
perpage: int = 10,
206-
search: str = "",
207-
sort: str = "id",
208-
regex: bool = True,
209-
asc: bool = True,
210-
exceeding: bool = True,
211-
shortage: bool = False,
212-
start: Optional[str] = None,
213-
end: Optional[str] = None,
204+
page: int = Query(1, ge=1, description="Page number for pagination"),
205+
perpage: int = Query(10, ge=1, le=100, description="Number of items per page"),
206+
search: str = Query("", description="Search keyword"),
207+
sort: str = Query("id", description="Sort by field"),
208+
regex: bool = Query(True, description="Use regex for search"),
209+
asc: bool = Query(True, description="Sort in ascending order"),
210+
exceeding: bool = Query(True, description="Include exceeding time"),
211+
shortage: bool = Query(False, description="Include shortage time"),
212+
start: Optional[str] = Query(None, description="Start date filter"),
213+
end: Optional[str] = Query(None, description="End date filter"),
214214
user=Depends(get_current_user),
215215
):
216216
"""

routers/logs_router.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from typing import Any
22

3-
from fastapi import APIRouter, Depends, HTTPException
3+
from fastapi import APIRouter, Depends, HTTPException, Query
44

55
from config import MAX_QUERY_COUNT
66
from database import db
@@ -11,10 +11,10 @@
1111

1212
@router.get("")
1313
async def read_logs(
14-
performer: str = "",
15-
page: int = -1,
16-
perpage: int = 10,
17-
query: str = "",
14+
performer: str = Query("", description="Filter by performer/user"),
15+
page: int = Query(-1, ge=-1, description="Page number (-1 for no pagination)"),
16+
perpage: int = Query(10, ge=1, le=100, description="Number of items per page"),
17+
query: str = Query("", max_length=MAX_QUERY_COUNT, description="Search query"),
1818
user=Depends(get_current_user),
1919
):
2020
if "admin" not in user["per"]:

0 commit comments

Comments
 (0)