from datetime import datetime from fastapi import Query from typing import Generic, TypeVar, Optional from pydantic import BaseModel, Field from app.api.v1.module_system.auth.schema import AuthSchema T = TypeVar("T") class TenantApiKeyCreate(BaseModel): """创建API Key的请求模型""" tenant_id: Optional[int] = Field(None, description="租户ID,默认使用当前用户的租户ID") description: Optional[str] = Field(None, description="备注") expired_days: Optional[int] = Field(365, description="过期天数,默认365天") return_url: Optional[str] = Field(default=None, description="同步返回地址") class TenantApiKeyResponse(BaseModel): """API Key的响应模型""" id: int api_key: str api_secret: str status: str expired_at: Optional[datetime] created_time: datetime return_url: Optional[str] class Config: from_attributes = True class TenantApiKeyListResponse(BaseModel): """API Key列表的响应模型""" id: int api_key: str status: str expired_at: Optional[datetime] last_used_at: Optional[datetime] created_time: datetime description: Optional[str] return_url: Optional[str] class Config: from_attributes = True class TenantApiKeyUpdate(BaseModel): """更新API Key的请求模型""" status: str = Field(..., description="状态:0-正常,1-禁用") class TenantApiLogCreate(BaseModel): """创建API调用日志的请求模型""" api_key_id: Optional[int] = Field(None, description="API Key ID") tenant_id: int = Field(..., description="租户ID") endpoint: str = Field(..., description="调用的接口") method: str = Field(..., description="请求方法") request_ip: str = Field(..., description="请求IP") request_data: Optional[str] = Field(None, description="请求数据") response_code: int = Field(..., description="响应码") response_time: float = Field(..., description="响应时间(毫秒)") class TenantApiLogResponse(BaseModel): """API调用日志的响应模型""" id: int endpoint: str method: str request_ip: str response_code: int response_time: float created_time: datetime class Config: from_attributes = True class ApiKeyQueryParam: """API Key管理查询参数""" def __init__( self, # tenant_id: int | None = Query(None, description="租户ID,默认使用当前用户的租户ID"), status: str | None = Query(None, description="状态:0-正常,1-禁用"), ) -> None: # self.tenant_id = tenant_id self.status = status class ApiKeyPayload(BaseModel, Generic[T]): api_key: str = Field(description="API Key") api_secret: str = Field(description="API Secret") tenant_id: int = Field(description="租户ID") auth: AuthSchema = Field(description="认证") data: Optional[T] = Field(default=None, description="业务数据载荷")