Multimedika/Bot_Development
0
1from pydantic import BaseModel, Field, field_validator2from typing import List, Optional, Dict, Any3from llama_index.core.llms import MessageRole4from datetime import datetime5import re6import pytz7 8jakarta_tz = pytz.timezone("Asia/Jakarta")9 10 11class PasswordValidator:12 @staticmethod13 def validate(password: str) -> str:14 if len(password) < 8 or len(password) > 32:15 raise ValueError("Password must be between 8 and 32 characters long")16 if not re.search(r"[A-Z]", password):17 raise ValueError("Password must contain at least one uppercase letter")18 if not re.search(r"[a-z]", password):19 raise ValueError("Password must contain at least one lowercase letter")20 if not re.search(r"\d", password):21 raise ValueError("Password must contain at least one digit")22 if not re.search(r'[!@#$%^&*(),.?":{}|<>]', password):23 raise ValueError("Password must contain at least one special character")24 return password25 26 27class CreateUserRequest(BaseModel):28 name: str29 username: str30 email: str31 password: str32 role_id: int = 233 34 @field_validator("password")35 def validate_password(cls, password):36 return PasswordValidator.validate(password)37 38 39class RoleCreate(BaseModel):40 name: str41 42 43class RoleUpdate(BaseModel):44 name: str45 46 47class LoginRequest(BaseModel):48 email: str49 password: str50 51 52class UserVerification(BaseModel):53 password: str54 new_password: str = Field(min_length=6)55 56 @field_validator("new_password")57 def validate_new_password(cls, new_password):58 return PasswordValidator.validate(new_password)59 60 61class Token(BaseModel):62 access_token: str63 token_type: str64 65 66class MetadataRequest(BaseModel):67 title: str68 category_id: int69 author: str70 year: int71 publisher: str72 73 74class MetadataResponse(BaseModel):75 id : int76 title: str77 author: str78 category: str # Changed to reflect the actual category name79 category_id : int80 year: int81 publisher: str82 thumbnail: Optional[Any] # Make thumbnail optional83 84 class Config:85 from_attributes = True86 87 88class DeleteById(BaseModel):89 id: str90 91 92class UserPromptRequest(BaseModel):93 prompt: str94 streaming: bool95 96 97class BotMetaCreate(BaseModel):98 metadata_id: List[int] # List of integers for metadata_id99 100 101class BotCreateRequest(BaseModel):102 name: str103 104 105class BotResponse(BaseModel):106 role: str = "assistant"107 content: str108 metadata: List109 scores: List110 111 112class BotResponseStreaming(BaseModel):113 role: str = "assistant"114 content: Optional[str] = None115 completed_content: Optional[str] = None116 reference: Optional[str] = None117 metadata: Optional[Dict] = None118 score: Optional[float] = None119 120class TestStreaming(BaseModel):121 role: str = "assistant"122 content: str123 124 125class ChatMessage(BaseModel):126 """Chat message."""127 128 role: MessageRole = MessageRole.ASSISTANT129 content: Optional[Any] = ""130 metadata: Optional[List[Any]] = None131 timestamp : Optional[datetime] = datetime.now(jakarta_tz)132 payment: Optional[str] = Field(default=None)133 134class ChatHistory(BaseModel):135 messages: List[ChatMessage]136 137 138class CategoryCreate(BaseModel):139 category_name: str140 