feat: add JSONBCompat type for cross-database JSON support and implement ActivityType updates
Test / test (push) Successful in 12s

This commit is contained in:
Artem Kashaev
2025-11-27 16:08:48 +05:00
parent 8492a0aed1
commit a4c3864ef6
2 changed files with 262 additions and 2 deletions
+18 -2
View File
@@ -8,6 +8,7 @@ from typing import Any
from pydantic import BaseModel, ConfigDict, Field
from sqlalchemy import DateTime, Enum as SqlEnum, ForeignKey, Integer, func, text
from sqlalchemy.dialects.postgresql import JSONB
from sqlalchemy.types import JSON as GenericJSON, TypeDecorator
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.models.base import Base
@@ -16,10 +17,25 @@ from app.models.base import Base
class ActivityType(StrEnum):
COMMENT = "comment"
STATUS_CHANGED = "status_changed"
STAGE_CHANGED = "stage_changed"
TASK_CREATED = "task_created"
SYSTEM = "system"
class JSONBCompat(TypeDecorator):
"""Uses JSONB on Postgres and plain JSON elsewhere for testability."""
impl = JSONB
cache_ok = True
def load_dialect_impl(self, dialect): # type: ignore[override]
if dialect.name == "sqlite":
from sqlalchemy.dialects.sqlite import JSON as SQLiteJSON # local import
return dialect.type_descriptor(SQLiteJSON())
return dialect.type_descriptor(JSONB())
class Activity(Base):
"""Represents a timeline event for a deal."""
@@ -32,9 +48,9 @@ class Activity(Base):
)
type: Mapped[ActivityType] = mapped_column(SqlEnum(ActivityType, name="activity_type"), nullable=False)
payload: Mapped[dict[str, Any]] = mapped_column(
JSONB,
JSONBCompat().with_variant(GenericJSON(), "sqlite"),
nullable=False,
server_default=text("'{}'::jsonb"),
server_default=text("'{}'"),
)
created_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), server_default=func.now(), nullable=False