131 lines
3.1 KiB
Python
131 lines
3.1 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
PerToolBox Server - Pydantic 模型
|
|
Copyright (C) 2024 Sea Network Technology Studio
|
|
Author: Canglan <admin@sea-studio.top>
|
|
License: AGPL v3
|
|
"""
|
|
|
|
from pydantic import BaseModel, Field, validator
|
|
from datetime import datetime
|
|
from typing import Optional, List, Dict, Any
|
|
|
|
# ========== 用户相关 ==========
|
|
class SendCodeRequest(BaseModel):
|
|
account: str # 手机号或邮箱
|
|
type: str # phone / email
|
|
|
|
class RegisterRequest(BaseModel):
|
|
account: str
|
|
code: str
|
|
password: str = Field(..., min_length=6, max_length=20)
|
|
|
|
class LoginRequest(BaseModel):
|
|
account: str
|
|
password: Optional[str] = None
|
|
code: Optional[str] = None
|
|
|
|
class UserResponse(BaseModel):
|
|
id: int
|
|
username: Optional[str]
|
|
phone: Optional[str]
|
|
email: Optional[str]
|
|
avatar: Optional[str]
|
|
created_at: datetime
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
class UserUpdateRequest(BaseModel):
|
|
username: Optional[str] = None
|
|
avatar: Optional[str] = None
|
|
|
|
# ========== 待办事项 ==========
|
|
class TodoBase(BaseModel):
|
|
title: str = Field(..., min_length=1, max_length=200)
|
|
description: Optional[str] = None
|
|
completed: bool = False
|
|
priority: int = Field(1, ge=1, le=3)
|
|
category: str = Field("学习", max_length=50)
|
|
due_date: Optional[datetime] = None
|
|
|
|
class TodoCreate(TodoBase):
|
|
pass
|
|
|
|
class TodoUpdate(BaseModel):
|
|
title: Optional[str] = None
|
|
description: Optional[str] = None
|
|
completed: Optional[bool] = None
|
|
priority: Optional[int] = None
|
|
category: Optional[str] = None
|
|
due_date: Optional[datetime] = None
|
|
|
|
class TodoResponse(TodoBase):
|
|
id: int
|
|
created_at: datetime
|
|
updated_at: Optional[datetime]
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
# ========== 便签 ==========
|
|
class NoteBase(BaseModel):
|
|
title: str = Field(..., min_length=1, max_length=200)
|
|
content: Optional[str] = None
|
|
tags: List[str] = []
|
|
is_archived: bool = False
|
|
|
|
class NoteCreate(NoteBase):
|
|
pass
|
|
|
|
class NoteUpdate(BaseModel):
|
|
title: Optional[str] = None
|
|
content: Optional[str] = None
|
|
tags: Optional[List[str]] = None
|
|
is_archived: Optional[bool] = None
|
|
|
|
class NoteResponse(NoteBase):
|
|
id: int
|
|
created_at: datetime
|
|
updated_at: Optional[datetime]
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
# ========== 加密工具 ==========
|
|
class HashRequest(BaseModel):
|
|
algorithm: str # md5, sha1, sha256, sha512
|
|
text: str
|
|
|
|
class Base64Request(BaseModel):
|
|
action: str # encode / decode
|
|
text: str
|
|
|
|
class URLRequest(BaseModel):
|
|
action: str # encode / decode
|
|
text: str
|
|
|
|
class AESRequest(BaseModel):
|
|
mode: str = "ECB" # ECB, CBC, GCM
|
|
action: str # encrypt / decrypt
|
|
key: str
|
|
iv: Optional[str] = None
|
|
text: str
|
|
|
|
# ========== JSON 校验 ==========
|
|
class JSONValidateRequest(BaseModel):
|
|
json_string: str
|
|
|
|
class JSONValidateResponse(BaseModel):
|
|
valid: bool
|
|
formatted: Optional[str] = None
|
|
error: Optional[Dict[str, Any]] = None
|
|
|
|
# ========== 热度统计 ==========
|
|
class ToolStatsResponse(BaseModel):
|
|
today: int
|
|
total: int
|
|
|
|
class ToolUsageRequest(BaseModel):
|
|
tool_name: str |