feat(publishing): implement immediate raw ingestion, per-target Redis queues, and configurable post intervals & sleep windows
This commit is contained in:
@@ -26,6 +26,9 @@ CREATE TABLE IF NOT EXISTS targets (
|
||||
post_interval_min INT DEFAULT 30,
|
||||
personality TEXT DEFAULT '',
|
||||
custom_footer TEXT DEFAULT '',
|
||||
sleep_start_hour INT DEFAULT 0,
|
||||
sleep_end_hour INT DEFAULT 0,
|
||||
is_sleep_enabled BOOLEAN DEFAULT FALSE,
|
||||
last_post_time TIMESTAMPTZ,
|
||||
is_active BOOLEAN DEFAULT TRUE,
|
||||
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
|
||||
@@ -71,6 +74,9 @@ CREATE TABLE IF NOT EXISTS settings (
|
||||
-- Migration safety for existing tables
|
||||
ALTER TABLE targets ADD COLUMN IF NOT EXISTS personality TEXT DEFAULT '';
|
||||
ALTER TABLE targets ADD COLUMN IF NOT EXISTS custom_footer TEXT DEFAULT '';
|
||||
ALTER TABLE targets ADD COLUMN IF NOT EXISTS sleep_start_hour INT DEFAULT 0;
|
||||
ALTER TABLE targets ADD COLUMN IF NOT EXISTS sleep_end_hour INT DEFAULT 0;
|
||||
ALTER TABLE targets ADD COLUMN IF NOT EXISTS is_sleep_enabled BOOLEAN DEFAULT FALSE;
|
||||
ALTER TABLE posts ADD COLUMN IF NOT EXISTS published_to JSONB DEFAULT '[]'::jsonb;
|
||||
ALTER TABLE posts ADD COLUMN IF NOT EXISTS is_deleted BOOLEAN DEFAULT FALSE;
|
||||
"""
|
||||
|
||||
@@ -19,6 +19,9 @@ class TargetChannel:
|
||||
post_interval_min: int = 30
|
||||
personality: str = ""
|
||||
custom_footer: str = ""
|
||||
sleep_start_hour: int = 0
|
||||
sleep_end_hour: int = 0
|
||||
is_sleep_enabled: bool = False
|
||||
last_post_time: Optional[str] = None
|
||||
is_active: bool = True
|
||||
created_at: Optional[str] = None
|
||||
|
||||
@@ -103,6 +103,33 @@ class Repository:
|
||||
custom_footer, target_id
|
||||
)
|
||||
|
||||
async def update_target_schedule(
|
||||
self,
|
||||
target_id: int,
|
||||
post_interval_min: Optional[int] = None,
|
||||
sleep_start_hour: Optional[int] = None,
|
||||
sleep_end_hour: Optional[int] = None,
|
||||
is_sleep_enabled: Optional[bool] = None
|
||||
) -> None:
|
||||
pool = await self._get_pool()
|
||||
async with pool.acquire() as conn:
|
||||
target = await self.get_target_by_id(target_id)
|
||||
if not target:
|
||||
return
|
||||
new_interval = post_interval_min if post_interval_min is not None else target.post_interval_min
|
||||
new_start = sleep_start_hour if sleep_start_hour is not None else target.sleep_start_hour
|
||||
new_end = sleep_end_hour if sleep_end_hour is not None else target.sleep_end_hour
|
||||
new_enabled = is_sleep_enabled if is_sleep_enabled is not None else target.is_sleep_enabled
|
||||
|
||||
await conn.execute(
|
||||
"""
|
||||
UPDATE targets
|
||||
SET post_interval_min = $1, sleep_start_hour = $2, sleep_end_hour = $3, is_sleep_enabled = $4
|
||||
WHERE id = $5;
|
||||
""",
|
||||
new_interval, new_start, new_end, new_enabled, target_id
|
||||
)
|
||||
|
||||
async def get_active_targets(self) -> List[TargetChannel]:
|
||||
pool = await self._get_pool()
|
||||
async with pool.acquire() as conn:
|
||||
|
||||
Reference in New Issue
Block a user