From e71a518b49a3691e329e073854d5b066f8d6603b Mon Sep 17 00:00:00 2001 From: DLmaster361 Date: Mon, 4 Aug 2025 16:13:00 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9=E8=84=9A=E6=9C=AC?= =?UTF-8?q?=E9=85=8D=E7=BD=AEAPI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/__init__.py | 30 --- app/api/__init__.py | 4 +- app/api/api.py | 472 ++++++++++++++++------------------------- app/api/scripts.py | 70 ++++++ app/core/config.py | 26 ++- main.py => app/main.py | 30 ++- app/models/__init__.py | 3 +- app/models/schema.py | 56 +++++ 8 files changed, 363 insertions(+), 328 deletions(-) delete mode 100644 app/__init__.py create mode 100644 app/api/scripts.py rename main.py => app/main.py (69%) create mode 100644 app/models/schema.py diff --git a/app/__init__.py b/app/__init__.py deleted file mode 100644 index e14213d..0000000 --- a/app/__init__.py +++ /dev/null @@ -1,30 +0,0 @@ -# AUTO_MAA:A MAA Multi Account Management and Automation Tool -# Copyright © 2024-2025 DLmaster361 - -# This file is part of AUTO_MAA. - -# AUTO_MAA is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, -# or (at your option) any later version. - -# AUTO_MAA is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty -# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See -# the GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with AUTO_MAA. If not, see . - -# Contact: DLmaster_361@163.com - - -__version__ = "5.0.0" -__author__ = "DLmaster361 " -__license__ = "GPL-3.0 license" - -from .api import app -from .core import Config -from .utils import get_logger - -__all__ = ["app", "Config", "get_logger"] diff --git a/app/api/__init__.py b/app/api/__init__.py index 035a4d7..7cb2bc3 100644 --- a/app/api/__init__.py +++ b/app/api/__init__.py @@ -22,6 +22,6 @@ __version__ = "5.0.0" __author__ = "DLmaster361 " __license__ = "GPL-3.0 license" -from .api import app +from .scripts import router as scripts_router -__all__ = ["app"] +__all__ = ["scripts_router"] diff --git a/app/api/api.py b/app/api/api.py index cefcaba..54c2e7f 100644 --- a/app/api/api.py +++ b/app/api/api.py @@ -10,21 +10,6 @@ from fastapi.middleware.cors import CORSMiddleware from app.core import Config from app.utils import get_logger -logger = get_logger("API 模块") - -app = FastAPI( - title="AUTO_MAA", - description="API for managing automation scripts, plans, and tasks", - version="1.0.0", -) - -app.add_middleware( - CORSMiddleware, - allow_origins=["*"], # 允许所有域名跨域访问 - allow_credentials=True, - allow_methods=["*"], # 允许所有请求方法,如 GET、POST、PUT、DELETE - allow_headers=["*"], # 允许所有请求头 -) # 此文件由ai生成 返回值非最终版本 @@ -37,43 +22,6 @@ app.add_middleware( # Script Models -class BaseOut(BaseModel): - code: int = Field(default=200, description="状态码") - status: str = Field(default="success", description="操作状态") - message: str = Field(default="操作成功", description="操作消息") - - -class ScriptCreateIn(BaseModel): - type: Literal["MAA", "General"] - - -class ScriptCreateOut(BaseOut): - scriptId: str = Field(..., description="新创建的脚本ID") - data: Dict[str, Any] = Field(..., description="脚本配置数据") - - -class ScriptGetIn(BaseModel): - scriptId: Optional[str] = Field(None, description="脚本ID,仅在模式为Single时需要") - - -class ScriptGetOut(BaseOut): - index: List[Dict[str, str]] = Field(..., description="脚本索引列表") - data: Dict[str, Any] = Field(..., description="脚本列表或单个脚本数据") - - -class ScriptUpdateIn(BaseModel): - scriptId: str = Field(..., description="脚本ID") - data: Dict[str, Any] = Field(..., description="脚本更新数据") - - -class ScriptUpdateOut(BaseOut): - message: str = Field(default="脚本更新成功", description="操作消息") - - -class ScriptDeleteIn(BaseModel): - scriptId: str = Field(..., description="脚本ID") - - class ScriptUser(BaseModel): userId: str config: Dict[str, Any] = {} @@ -161,289 +109,235 @@ class SettingsUpdate(BaseModel): # return {"status": "success", "data": {}} -@app.post( - "/api/add/scripts", - summary="添加脚本", - response_model=ScriptCreateOut, - status_code=200, -) -async def add_script(script: ScriptCreateIn = Body(...)) -> ScriptCreateOut: - """添加脚本""" - - uid, config = await Config.add_script(script.type) - return ScriptCreateOut(scriptId=str(uid), data=await config.toDict()) - - -@app.post( - "/api/get/scripts", summary="查询脚本", response_model=ScriptGetOut, status_code=200 -) -async def get_scripts(script: ScriptGetIn = Body(...)) -> ScriptGetOut: - """查询脚本""" - try: - index, data = await Config.get_script(script.scriptId) - except Exception as e: - return ScriptGetOut(code=500, status="error", message=str(e), index=[], data={}) - return ScriptGetOut(index=index, data=data) - - -# @app.post("/api/update/scripts/{scriptId}", summary="更新脚本") -# async def update_script( -# scriptId: str = Path(..., description="脚本ID"), -# update_data: ScriptUpdate = Body(...), +# @app.post("/api/scripts/{scriptId}/users", summary="为脚本添加用户") +# async def add_script_user( +# scriptId: str = Path(..., description="脚本ID"), user: ScriptUser = Body(...) # ): # """ -# 更新脚本 +# 为脚本添加用户 # """ -# # 实现更新脚本的逻辑 +# # 实现为脚本添加用户的逻辑 # return {"status": "success"} -@app.post( - "/api/delete/scripts", - summary="删除脚本", - response_model=BaseOut, - status_code=200, -) -async def delete_script( - script: ScriptDeleteIn = Body(..., description="脚本ID") -) -> BaseOut: - """删除脚本""" - try: - await Config.del_script(script.scriptId) - except Exception as e: - return BaseOut(code=500, status="error", message=str(e)) - return BaseOut() +# @app.get("/api/scripts/{scriptId}/users", summary="查询脚本的所有下属用户") +# async def get_script_users(scriptId: str = Path(..., description="脚本ID")): +# """ +# 查询脚本的所有下属用户 +# """ +# # 实现查询脚本的所有下属用户的逻辑 +# return {"status": "success", "data": []} -@app.post("/api/scripts/{scriptId}/users", summary="为脚本添加用户") -async def add_script_user( - scriptId: str = Path(..., description="脚本ID"), user: ScriptUser = Body(...) -): - """ - 为脚本添加用户 - """ - # 实现为脚本添加用户的逻辑 - return {"status": "success"} +# @app.get("/api/scripts/{scriptId}/users/{userId}", summary="查询脚本下的单个下属用户") +# async def get_script_user( +# scriptId: str = Path(..., description="脚本ID"), +# userId: str = Path(..., description="用户ID"), +# ): +# """ +# 查询脚本下的单个下属用户 +# """ +# # 实现查询脚本下的单个下属用户的逻辑 +# return {"status": "success", "data": {}} -@app.get("/api/scripts/{scriptId}/users", summary="查询脚本的所有下属用户") -async def get_script_users(scriptId: str = Path(..., description="脚本ID")): - """ - 查询脚本的所有下属用户 - """ - # 实现查询脚本的所有下属用户的逻辑 - return {"status": "success", "data": []} +# @app.put("/api/scripts/{scriptId}/users/{userId}", summary="更新脚本下属用户的关联信息") +# async def update_script_user( +# scriptId: str = Path(..., description="脚本ID"), +# userId: str = Path(..., description="用户ID"), +# config: Dict[str, Any] = Body(...), +# ): +# """ +# 更新脚本下属用户的关联信息 +# """ +# # 实现更新脚本下属用户的关联信息的逻辑 +# return {"status": "success"} -@app.get("/api/scripts/{scriptId}/users/{userId}", summary="查询脚本下的单个下属用户") -async def get_script_user( - scriptId: str = Path(..., description="脚本ID"), - userId: str = Path(..., description="用户ID"), -): - """ - 查询脚本下的单个下属用户 - """ - # 实现查询脚本下的单个下属用户的逻辑 - return {"status": "success", "data": {}} +# @app.delete("/api/scripts/{scriptId}/users/{userId}", summary="从脚本移除用户") +# async def remove_script_user( +# scriptId: str = Path(..., description="脚本ID"), +# userId: str = Path(..., description="用户ID"), +# ): +# """ +# 从脚本移除用户 +# """ +# # 实现从脚本移除用户的逻辑 +# return {"status": "success"} -@app.put("/api/scripts/{scriptId}/users/{userId}", summary="更新脚本下属用户的关联信息") -async def update_script_user( - scriptId: str = Path(..., description="脚本ID"), - userId: str = Path(..., description="用户ID"), - config: Dict[str, Any] = Body(...), -): - """ - 更新脚本下属用户的关联信息 - """ - # 实现更新脚本下属用户的关联信息的逻辑 - return {"status": "success"} +# @app.post("/api/add/plans", summary="创建计划") +# async def add_plan(plan: PlanCreate = Body(...)): +# """ +# 创建计划 +# { +# "name": "计划 1", +# "mode": "全局", // 或 "周计划" +# "details": { +# "周一": { +# "吃理智药": 0, +# "连战次数": "AUTO", +# "关卡选择": "当前/上次", +# "备选-1": "当前/上次", +# "备选-2": "当前/上次", +# "备选-3": "当前/上次", +# "剩余理智": "不使用" +# }, +# // 其他天数... +# } +# } +# """ +# # 实现创建计划的逻辑 +# return {"status": "success", "planId": "new_plan_id"} -@app.delete("/api/scripts/{scriptId}/users/{userId}", summary="从脚本移除用户") -async def remove_script_user( - scriptId: str = Path(..., description="脚本ID"), - userId: str = Path(..., description="用户ID"), -): - """ - 从脚本移除用户 - """ - # 实现从脚本移除用户的逻辑 - return {"status": "success"} +# @app.post("/api/get/plans", summary="查询所有计划") +# async def get_plans(): +# """ +# 查询所有计划 +# """ +# # 实现查询所有计划的逻辑 +# return {"status": "success", "data": []} -@app.post("/api/add/plans", summary="创建计划") -async def add_plan(plan: PlanCreate = Body(...)): - """ - 创建计划 - { - "name": "计划 1", - "mode": "全局", // 或 "周计划" - "details": { - "周一": { - "吃理智药": 0, - "连战次数": "AUTO", - "关卡选择": "当前/上次", - "备选-1": "当前/上次", - "备选-2": "当前/上次", - "备选-3": "当前/上次", - "剩余理智": "不使用" - }, - // 其他天数... - } - } - """ - # 实现创建计划的逻辑 - return {"status": "success", "planId": "new_plan_id"} +# @app.post("/api/get/plans/{planId}", summary="查询单个计划") +# async def get_plan(planId: str = Path(..., description="计划ID")): +# """ +# 查询单个计划 +# """ +# # 实现查询单个计划的逻辑 +# return {"status": "success", "data": {}} -@app.post("/api/get/plans", summary="查询所有计划") -async def get_plans(): - """ - 查询所有计划 - """ - # 实现查询所有计划的逻辑 - return {"status": "success", "data": []} +# @app.post("/api/update/plans/{planId}", summary="更新计划") +# async def update_plan( +# planId: str = Path(..., description="计划ID"), update_data: PlanUpdate = Body(...) +# ): +# """ +# 更新计划 +# """ +# # 实现更新计划的逻辑 +# return {"status": "success"} -@app.post("/api/get/plans/{planId}", summary="查询单个计划") -async def get_plan(planId: str = Path(..., description="计划ID")): - """ - 查询单个计划 - """ - # 实现查询单个计划的逻辑 - return {"status": "success", "data": {}} +# @app.post("/api/delete/plans/{planId}", summary="删除计划") +# async def delete_plan(planId: str = Path(..., description="计划ID")): +# """ +# 删除计划 +# """ +# # 实现删除计划的逻辑 +# return {"status": "success"} -@app.post("/api/update/plans/{planId}", summary="更新计划") -async def update_plan( - planId: str = Path(..., description="计划ID"), update_data: PlanUpdate = Body(...) -): - """ - 更新计划 - """ - # 实现更新计划的逻辑 - return {"status": "success"} +# @app.post("/api/update/plans/{planId}/mode", summary="切换计划模式") +# async def update_plan_mode( +# planId: str = Path(..., description="计划ID"), mode_data: PlanModeUpdate = Body(...) +# ): +# """ +# 切换计划模式 +# { +# "mode": "周计划" +# } +# """ +# # 实现切换计划模式的逻辑 +# return {"status": "success"} -@app.post("/api/delete/plans/{planId}", summary="删除计划") -async def delete_plan(planId: str = Path(..., description="计划ID")): - """ - 删除计划 - """ - # 实现删除计划的逻辑 - return {"status": "success"} +# @app.post("/api/add/queues", summary="创建调度队列") +# async def add_queue(queue: QueueCreate = Body(...)): +# """ +# 创建调度队列 +# """ +# # 实现创建调度队列的逻辑 +# return {"status": "success", "queueId": "new_queue_id"} -@app.post("/api/update/plans/{planId}/mode", summary="切换计划模式") -async def update_plan_mode( - planId: str = Path(..., description="计划ID"), mode_data: PlanModeUpdate = Body(...) -): - """ - 切换计划模式 - { - "mode": "周计划" - } - """ - # 实现切换计划模式的逻辑 - return {"status": "success"} +# @app.post("/api/get/queues", summary="查询所有调度队列") +# async def get_queues(): +# """ +# 查询所有调度队列 +# """ +# # 实现查询所有调度队列的逻辑 +# return {"status": "success", "data": []} -@app.post("/api/add/queues", summary="创建调度队列") -async def add_queue(queue: QueueCreate = Body(...)): - """ - 创建调度队列 - """ - # 实现创建调度队列的逻辑 - return {"status": "success", "queueId": "new_queue_id"} +# @app.post("/api/get/queues/{queueId}", summary="查询单个调度队列详情") +# async def get_queue(queueId: str = Path(..., description="调度队列ID")): +# """ +# 查询单个调度队列详情 +# """ +# # 实现查询单个调度队列详情的逻辑 +# return {"status": "success", "data": {}} -@app.post("/api/get/queues", summary="查询所有调度队列") -async def get_queues(): - """ - 查询所有调度队列 - """ - # 实现查询所有调度队列的逻辑 - return {"status": "success", "data": []} +# @app.post("/api/update/queues/{queueId}", summary="更新调度队列") +# async def update_queue( +# queueId: str = Path(..., description="调度队列ID"), +# update_data: QueueUpdate = Body(...), +# ): +# """ +# 更新调度队列 +# """ +# # 实现更新调度队列的逻辑 +# return {"status": "success"} -@app.post("/api/get/queues/{queueId}", summary="查询单个调度队列详情") -async def get_queue(queueId: str = Path(..., description="调度队列ID")): - """ - 查询单个调度队列详情 - """ - # 实现查询单个调度队列详情的逻辑 - return {"status": "success", "data": {}} +# @app.post("/api/delete/queues/{queueId}", summary="删除调度队列") +# async def delete_queue(queueId: str = Path(..., description="调度队列ID")): +# """ +# 删除调度队列 +# """ +# # 实现删除调度队列的逻辑 +# return {"status": "success"} -@app.post("/api/update/queues/{queueId}", summary="更新调度队列") -async def update_queue( - queueId: str = Path(..., description="调度队列ID"), - update_data: QueueUpdate = Body(...), -): - """ - 更新调度队列 - """ - # 实现更新调度队列的逻辑 - return {"status": "success"} +# @app.post("/api/add/tasks", summary="添加任务") +# async def add_task(task: TaskCreate = Body(...)): +# """ +# 添加任务 +# """ +# # 实现添加任务的逻辑 +# return {"status": "success", "taskId": "new_task_id"} -@app.post("/api/delete/queues/{queueId}", summary="删除调度队列") -async def delete_queue(queueId: str = Path(..., description="调度队列ID")): - """ - 删除调度队列 - """ - # 实现删除调度队列的逻辑 - return {"status": "success"} +# @app.post("/api/tasks/{taskId}/start", summary="开始任务") +# async def start_task(taskId: str = Path(..., description="任务ID")): +# """ +# 开始任务 +# """ +# # 实现开始任务的逻辑 +# return {"status": "success"} -@app.post("/api/add/tasks", summary="添加任务") -async def add_task(task: TaskCreate = Body(...)): - """ - 添加任务 - """ - # 实现添加任务的逻辑 - return {"status": "success", "taskId": "new_task_id"} +# @app.post("/api/get/history", summary="查询历史记录") +# async def get_history(): +# """ +# 查询历史记录 +# """ +# # 实现查询历史记录的逻辑 +# return {"status": "success", "data": []} -@app.post("/api/tasks/{taskId}/start", summary="开始任务") -async def start_task(taskId: str = Path(..., description="任务ID")): - """ - 开始任务 - """ - # 实现开始任务的逻辑 - return {"status": "success"} +# @app.post("/api/update/settings", summary="更新部分设置") +# async def update_settings(settings: SettingsUpdate = Body(...)): +# """ +# 更新部分设置 +# """ +# # 实现更新部分设置的逻辑 +# return {"status": "success"} -@app.post("/api/get/history", summary="查询历史记录") -async def get_history(): - """ - 查询历史记录 - """ - # 实现查询历史记录的逻辑 - return {"status": "success", "data": []} +# # ====================== +# # Error Handlers +# # ====================== -@app.post("/api/update/settings", summary="更新部分设置") -async def update_settings(settings: SettingsUpdate = Body(...)): - """ - 更新部分设置 - """ - # 实现更新部分设置的逻辑 - return {"status": "success"} +# @app.exception_handler(HTTPException) +# async def http_exception_handler(request, exc): +# return {"status": "error", "code": exc.status_code, "message": exc.detail} -# ====================== -# Error Handlers -# ====================== +# if __name__ == "__main__": +# import uvicorn - -@app.exception_handler(HTTPException) -async def http_exception_handler(request, exc): - return {"status": "error", "code": exc.status_code, "message": exc.detail} - - -if __name__ == "__main__": - import uvicorn - - uvicorn.run(app, host="0.0.0.0", port=8000) +# uvicorn.run(app, host="0.0.0.0", port=8000) diff --git a/app/api/scripts.py b/app/api/scripts.py new file mode 100644 index 0000000..f24a767 --- /dev/null +++ b/app/api/scripts.py @@ -0,0 +1,70 @@ +# AUTO_MAA:A MAA Multi Account Management and Automation Tool +# Copyright © 2024-2025 DLmaster361 + +# This file is part of AUTO_MAA. + +# AUTO_MAA is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published +# by the Free Software Foundation, either version 3 of the License, +# or (at your option) any later version. + +# AUTO_MAA is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty +# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See +# the GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with AUTO_MAA. If not, see . + +# Contact: DLmaster_361@163.com + + +from fastapi import APIRouter, Body + +from core import Config +from models.schema import * + +router = APIRouter(prefix="/api/scripts", tags=["脚本管理"]) + + +@router.post( + "/add", summary="添加脚本", response_model=ScriptCreateOut, status_code=200 +) +async def add_script(script: ScriptCreateIn = Body(...)) -> ScriptCreateOut: + """添加脚本""" + + uid, config = await Config.add_script(script.type) + return ScriptCreateOut(scriptId=str(uid), data=await config.toDict()) + + +@router.post("/get", summary="查询脚本", response_model=ScriptGetOut, status_code=200) +async def get_scripts(script: ScriptGetIn = Body(...)) -> ScriptGetOut: + """查询脚本""" + + try: + index, data = await Config.get_script(script.scriptId) + except Exception as e: + return ScriptGetOut(code=500, status="error", message=str(e), index=[], data={}) + return ScriptGetOut(index=index, data=data) + + +@router.post("/update", summary="更新脚本", response_model=BaseOut, status_code=200) +async def update_script(script: ScriptUpdateIn = Body(...)) -> BaseOut: + """更新脚本""" + + try: + await Config.update_script(script.scriptId, script.data) + except Exception as e: + return BaseOut(code=500, status="error", message=str(e)) + return BaseOut() + + +@router.post("/delete", summary="删除脚本", response_model=BaseOut, status_code=200) +async def delete_script(script: ScriptDeleteIn = Body(...)) -> BaseOut: + """删除脚本""" + + try: + await Config.del_script(script.scriptId) + except Exception as e: + return BaseOut(code=500, status="error", message=str(e)) + return BaseOut() diff --git a/app/core/config.py b/app/core/config.py index 6ef2c11..8568056 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -33,8 +33,8 @@ from pathlib import Path from typing import Union, Dict, List, Literal, Optional, Any, Tuple, Callable, TypeVar -from app.utils import get_logger -from app.models.ConfigBase import * +from utils import get_logger +from models.ConfigBase import * class GlobalConfig(ConfigBase): @@ -628,6 +628,8 @@ class AppConfig(GlobalConfig): ) -> tuple[uuid.UUID, ConfigBase]: """添加脚本配置""" + self.logger.info(f"添加脚本配置:{script}") + class_book = {"MAA": MaaConfig, "General": GeneralConfig} return await self.ScriptConfig.add(class_book[script]) @@ -635,6 +637,8 @@ class AppConfig(GlobalConfig): async def get_script(self, script_id: Optional[str]) -> tuple[list, dict]: """获取脚本配置""" + self.logger.info(f"获取脚本配置:{script_id}") + if script_id is None: data = await self.ScriptConfig.toDict() else: @@ -644,6 +648,24 @@ class AppConfig(GlobalConfig): return list(index), data + async def update_script( + self, script_id: str, data: Dict[str, Dict[str, Any]] + ) -> None: + """更新脚本配置""" + + self.logger.info(f"更新脚本配置:{script_id}") + + uid = uuid.UUID(script_id) + + for group, items in data.items(): + for name, value in items.items(): + self.logger.debug( + f"更新脚本配置:{script_id} - {group}.{name} = {value}" + ) + await self.ScriptConfig[uid].set(group, name, value) + + await self.ScriptConfig.save() + async def del_script(self, script_id: str) -> None: """删除脚本配置""" diff --git a/main.py b/app/main.py similarity index 69% rename from main.py rename to app/main.py index fce6f1e..cedebb6 100644 --- a/main.py +++ b/app/main.py @@ -22,12 +22,37 @@ import os import sys import ctypes +import uvicorn +from fastapi import FastAPI +from fastapi.middleware.cors import CORSMiddleware + + +from api import scripts_router +from core import Config +from utils import get_logger -from app.utils import get_logger logger = get_logger("主程序") +app = FastAPI( + title="AUTO_MAA", + description="API for managing automation scripts, plans, and tasks", + version="1.0.0", +) + +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], # 允许所有域名跨域访问 + allow_credentials=True, + allow_methods=["*"], # 允许所有请求方法,如 GET、POST、PUT、DELETE + allow_headers=["*"], # 允许所有请求头 +) + + +app.include_router(scripts_router) + + def is_admin() -> bool: """检查当前程序是否以管理员身份运行""" try: @@ -41,9 +66,6 @@ def main(): if is_admin(): - import uvicorn - from app.api import app - uvicorn.run(app, host="0.0.0.0", port=8000) else: diff --git a/app/models/__init__.py b/app/models/__init__.py index 345fc7f..848e784 100644 --- a/app/models/__init__.py +++ b/app/models/__init__.py @@ -23,5 +23,6 @@ __author__ = "DLmaster361 " __license__ = "GPL-3.0 license" from .ConfigBase import * +from .schema import * -__all__ = ["ConfigBase"] +__all__ = ["ConfigBase", "schema"] diff --git a/app/models/schema.py b/app/models/schema.py new file mode 100644 index 0000000..4dae916 --- /dev/null +++ b/app/models/schema.py @@ -0,0 +1,56 @@ +# AUTO_MAA:A MAA Multi Account Management and Automation Tool +# Copyright © 2024-2025 DLmaster361 + +# This file is part of AUTO_MAA. + +# AUTO_MAA is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published +# by the Free Software Foundation, either version 3 of the License, +# or (at your option) any later version. + +# AUTO_MAA is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty +# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See +# the GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with AUTO_MAA. If not, see . + +# Contact: DLmaster_361@163.com + + +from pydantic import BaseModel, Field +from typing import Dict, Any, List, Optional, Literal + + +class BaseOut(BaseModel): + code: int = Field(default=200, description="状态码") + status: str = Field(default="success", description="操作状态") + message: str = Field(default="操作成功", description="操作消息") + + +class ScriptCreateIn(BaseModel): + type: Literal["MAA", "General"] + + +class ScriptCreateOut(BaseOut): + scriptId: str = Field(..., description="新创建的脚本ID") + data: Dict[str, Any] = Field(..., description="脚本配置数据") + + +class ScriptGetIn(BaseModel): + scriptId: Optional[str] = Field(None, description="脚本ID,仅在模式为Single时需要") + + +class ScriptGetOut(BaseOut): + index: List[Dict[str, str]] = Field(..., description="脚本索引列表") + data: Dict[str, Any] = Field(..., description="脚本列表或单个脚本数据") + + +class ScriptUpdateIn(BaseModel): + scriptId: str = Field(..., description="脚本ID") + data: Dict[str, Dict[str, Any]] = Field(..., description="脚本更新数据") + + +class ScriptDeleteIn(BaseModel): + scriptId: str = Field(..., description="脚本ID")