Backend: broadcast channel select (bot/site/both) / scheduled_broadcasts.channel migration v29 / API v1+v2 channel field. Frontend: global haptic on button click / navigator.vibrate fallback for non-tg.

This commit is contained in:
Vladless
2026-05-07 17:09:48 +00:00
parent 6ebaff08e8
commit c09470fe49
10 changed files with 122 additions and 21 deletions
+7
View File
@@ -58,6 +58,7 @@ class DomainChange(BaseModel):
class BroadcastLaunchPayload(BaseModel):
send_to: Literal["all", "subscribed", "unsubscribed", "untrial", "trial", "hotleads", "cluster"] = "all"
channel: Literal["bot", "site", "both"] = "both"
text: str
photo: str | None = None
cluster_name: str | None = None
@@ -71,6 +72,7 @@ class ScheduledBroadcastCreatePayload(BroadcastLaunchPayload):
class ScheduledBroadcastUpdatePayload(BaseModel):
send_to: Literal["all", "subscribed", "unsubscribed", "untrial", "trial", "hotleads", "cluster"] | None = None
channel: Literal["bot", "site", "both"] | None = None
text: str | None = None
photo: str | None = None
cluster_name: str | None = None
@@ -103,6 +105,7 @@ def _resolve_update_payload(
fields = payload.model_fields_set
text_changed = "text" in fields
send_to = payload.send_to if "send_to" in fields else current.send_to
channel = payload.channel if "channel" in fields else current.channel
text = payload.text if "text" in fields else current.text
photo = payload.photo if "photo" in fields else current.photo
cluster_name = payload.cluster_name if "cluster_name" in fields else current.cluster_name
@@ -117,6 +120,7 @@ def _resolve_update_payload(
cluster_name=cluster_name,
workers=workers,
messages_per_second=messages_per_second,
channel=channel,
)
if not text_changed:
prepared["text"] = current.text
@@ -252,6 +256,7 @@ async def launch_broadcast(
cluster_name=payload.cluster_name,
workers=payload.workers,
messages_per_second=payload.messages_per_second,
channel=payload.channel,
)
except ValueError as exc:
raise HTTPException(status_code=400, detail=str(exc)) from exc
@@ -272,6 +277,7 @@ async def create_broadcast_schedule(
cluster_name=payload.cluster_name,
workers=payload.workers,
messages_per_second=payload.messages_per_second,
channel=payload.channel,
)
except ValueError as exc:
raise HTTPException(status_code=400, detail=str(exc)) from exc
@@ -279,6 +285,7 @@ async def create_broadcast_schedule(
session,
created_by_tg_id=getattr(admin, "tg_id", None),
send_to=prepared["send_to"],
channel=prepared["channel"],
cluster_name=prepared["cluster_name"],
text=prepared["text"],
photo=prepared["photo"],
+7
View File
@@ -73,6 +73,7 @@ class DomainChange(BaseModel):
class BroadcastLaunchPayload(BaseModel):
send_to: Literal["all", "subscribed", "unsubscribed", "untrial", "trial", "hotleads", "cluster"] = "all"
channel: Literal["bot", "site", "both"] = "both"
text: str
photo: str | None = None
cluster_name: str | None = None
@@ -86,6 +87,7 @@ class ScheduledBroadcastCreatePayload(BroadcastLaunchPayload):
class ScheduledBroadcastUpdatePayload(BaseModel):
send_to: Literal["all", "subscribed", "unsubscribed", "untrial", "trial", "hotleads", "cluster"] | None = None
channel: Literal["bot", "site", "both"] | None = None
text: str | None = None
photo: str | None = None
cluster_name: str | None = None
@@ -119,6 +121,7 @@ def _resolve_update_payload(
fields = payload.model_fields_set
text_changed = "text" in fields
send_to = payload.send_to if "send_to" in fields else current.send_to
channel = payload.channel if "channel" in fields else current.channel
text = payload.text if "text" in fields else current.text
photo = payload.photo if "photo" in fields else current.photo
cluster_name = payload.cluster_name if "cluster_name" in fields else current.cluster_name
@@ -133,6 +136,7 @@ def _resolve_update_payload(
cluster_name=cluster_name,
workers=workers,
messages_per_second=messages_per_second,
channel=channel,
)
if not text_changed:
prepared["text"] = current.text
@@ -389,6 +393,7 @@ async def launch_broadcast(
cluster_name=payload.cluster_name,
workers=payload.workers,
messages_per_second=payload.messages_per_second,
channel=payload.channel,
)
except ValueError as exc:
raise HTTPException(status_code=400, detail=str(exc)) from exc
@@ -409,6 +414,7 @@ async def create_broadcast_schedule(
cluster_name=payload.cluster_name,
workers=payload.workers,
messages_per_second=payload.messages_per_second,
channel=payload.channel,
)
except ValueError as exc:
raise HTTPException(status_code=400, detail=str(exc)) from exc
@@ -416,6 +422,7 @@ async def create_broadcast_schedule(
session,
created_by_tg_id=getattr(identity, "tg_id", None),
send_to=prepared["send_to"],
channel=prepared["channel"],
cluster_name=prepared["cluster_name"],
text=prepared["text"],
photo=prepared["photo"],