| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 | 
							- from datetime import datetime
 
- from typing import Optional
 
- import orjson
 
- from sqlalchemy import DateTime, text
 
- from sqlalchemy.orm import declared_attr
 
- from sqlmodel import SQLModel, Field
 
- from app.libs.types import ObjectId
 
- from app.libs.util import datetime2timestamp
 
- def orjson_dumps(v, *, default):
 
-     # orjson.dumps returns bytes, to match standard json.dumps we need to decode
 
-     return orjson.dumps(v, default=default).decode()
 
- def to_snake_case(string: str) -> str:
 
-     return "".join(["_" + i.lower() if i.isupper() else i for i in string]).lstrip("_")
 
- class BaseModel(SQLModel):
 
-     class Config:
 
-         from_attributes = True
 
-         populate_by_name = True
 
-         json_encoders = {
 
-             datetime: lambda v: datetime2timestamp(v),
 
-         }
 
-     @classmethod
 
-     @declared_attr
 
-     def __tablename__(cls) -> str:
 
-         return to_snake_case(cls.__name__)
 
- class TimeStampMixin(SQLModel):
 
-     created_at: Optional[datetime] = Field(
 
-         sa_type=DateTime,
 
-         default=None,
 
-         nullable=False,
 
-         sa_column_kwargs={"server_default": text("CURRENT_TIMESTAMP")},
 
-     )
 
-     updated_at: Optional[datetime] = Field(
 
-         sa_type=DateTime,
 
-         default=None,
 
-         sa_column_kwargs={"onupdate": text("CURRENT_TIMESTAMP")},
 
-     )
 
- class PrimaryKeyMixin(SQLModel):
 
-     id: str = Field(primary_key=True, default_factory=ObjectId)
 
 
  |