application.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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. created_at: datetime
  42. updated_at: datetime
  43. class Config:
  44. from_attributes = True
  45. class ApplicationList(BaseModel):
  46. total: int
  47. items: List[ApplicationResponse]
  48. class ApplicationSecretDisplay(BaseModel):
  49. app_id: str
  50. app_secret: str
  51. access_token: Optional[str] = None
  52. class ViewSecretRequest(BaseModel):
  53. password: str
  54. class AppSyncRequest(BaseModel):
  55. mode: str = "ALL" # "ALL" or "SELECTED"
  56. user_ids: Optional[List[int]] = []
  57. init_email: bool = False
  58. email_domain: Optional[str] = None
  59. verification_code: str
  60. # Category Management Schemas
  61. class CategoryStats(BaseModel):
  62. """分类统计信息"""
  63. category_id: int
  64. category_name: str
  65. app_count: int
  66. # App Category Schemas (Preset Categories)
  67. class AppCategoryBase(BaseModel):
  68. name: str
  69. description: Optional[str] = None
  70. class AppCategoryCreate(AppCategoryBase):
  71. pass
  72. class AppCategoryUpdate(BaseModel):
  73. name: Optional[str] = None
  74. description: Optional[str] = None
  75. password: Optional[str] = None # 密码验证
  76. class AppCategoryResponse(AppCategoryBase):
  77. id: int
  78. created_at: datetime
  79. updated_at: datetime
  80. class Config:
  81. from_attributes = True
  82. class BatchUpdateCategoryRequest(BaseModel):
  83. """批量更新应用分类"""
  84. app_ids: List[int]
  85. category_id: Optional[int] = None # None 表示移除分类
  86. password: str # 管理员密码验证