application.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. from typing import Optional, List
  2. from pydantic import BaseModel, HttpUrl
  3. from enum import Enum
  4. from datetime import datetime
  5. class ProtocolType(str, Enum):
  6. OIDC = "OIDC"
  7. SIMPLE_API = "SIMPLE_API"
  8. class ApplicationBase(BaseModel):
  9. app_name: str
  10. icon_url: Optional[str] = None
  11. protocol_type: ProtocolType = ProtocolType.SIMPLE_API
  12. redirect_uris: Optional[str] = None # Stored as JSON string or comma-separated for simplicity in MVP, or validate as list
  13. notification_url: Optional[str] = None
  14. description: Optional[str] = None
  15. category_id: Optional[int] = None
  16. class ApplicationCreate(ApplicationBase):
  17. pass
  18. class ApplicationUpdate(BaseModel):
  19. app_name: Optional[str] = None
  20. icon_url: Optional[str] = None
  21. protocol_type: Optional[ProtocolType] = None
  22. redirect_uris: Optional[str] = None
  23. notification_url: Optional[str] = None
  24. description: Optional[str] = None
  25. category_id: Optional[int] = None
  26. password: Optional[str] = None
  27. verification_code: Optional[str] = None
  28. class ApplicationTransferRequest(BaseModel):
  29. target_mobile: str
  30. password: str
  31. verification_code: str
  32. class RegenerateSecretRequest(BaseModel):
  33. password: str
  34. verification_code: str
  35. class ApplicationResponse(ApplicationBase):
  36. id: int
  37. app_id: str
  38. owner_id: int
  39. # We do NOT return app_secret_hash
  40. category_name: Optional[str] = None # 分类名称(从 relationship 获取)
  41. icon_object_key: Optional[str] = None # MinIO object key(非 http 时与入库 icon_url 一致,便于编辑回填)
  42. created_at: datetime
  43. updated_at: datetime
  44. class Config:
  45. from_attributes = True
  46. class ApplicationList(BaseModel):
  47. total: int
  48. items: List[ApplicationResponse]
  49. class ApplicationSecretDisplay(BaseModel):
  50. app_id: str
  51. app_secret: str
  52. access_token: Optional[str] = None
  53. class ViewSecretRequest(BaseModel):
  54. password: str
  55. class AppSyncRequest(BaseModel):
  56. mode: str = "ALL" # "ALL" or "SELECTED"
  57. user_ids: Optional[List[int]] = []
  58. init_email: bool = False
  59. email_domain: Optional[str] = None
  60. verification_code: str
  61. # Category Management Schemas
  62. class CategoryStats(BaseModel):
  63. """分类统计信息"""
  64. category_id: int
  65. category_name: str
  66. app_count: int
  67. # App Category Schemas (Preset Categories)
  68. class AppCategoryBase(BaseModel):
  69. name: str
  70. description: Optional[str] = None
  71. class AppCategoryCreate(AppCategoryBase):
  72. pass
  73. class AppCategoryUpdate(BaseModel):
  74. name: Optional[str] = None
  75. description: Optional[str] = None
  76. password: Optional[str] = None # 密码验证
  77. class AppCategoryResponse(AppCategoryBase):
  78. id: int
  79. created_at: datetime
  80. updated_at: datetime
  81. class Config:
  82. from_attributes = True
  83. class BatchUpdateCategoryRequest(BaseModel):
  84. """批量更新应用分类"""
  85. app_ids: List[int]
  86. category_id: Optional[int] = None # None 表示移除分类
  87. password: str # 管理员密码验证