feat(review): add soft delete button to remove posts from admin channel while preserving deduplication state
This commit is contained in:
@@ -72,6 +72,7 @@ CREATE TABLE IF NOT EXISTS settings (
|
||||
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 posts ADD COLUMN IF NOT EXISTS published_to JSONB DEFAULT '[]'::jsonb;
|
||||
ALTER TABLE posts ADD COLUMN IF NOT EXISTS is_deleted BOOLEAN DEFAULT FALSE;
|
||||
"""
|
||||
|
||||
_pool: Optional[asyncpg.Pool] = None
|
||||
|
||||
+2
-1
@@ -40,8 +40,9 @@ class Post:
|
||||
ai_text: Optional[str] = None
|
||||
suggested_target_id: Optional[int] = None
|
||||
target_channel_id: Optional[int] = None
|
||||
status: str = "pending_review" # pending_review, published, rejected
|
||||
status: str = "pending_review" # pending_review, published, rejected, deleted
|
||||
published_to: List[Dict[str, Any]] = field(default_factory=list)
|
||||
is_deleted: bool = False
|
||||
review_message_id: Optional[int] = None
|
||||
scheduled_at: Optional[str] = None
|
||||
published_at: Optional[str] = None
|
||||
|
||||
@@ -209,3 +209,8 @@ class Repository:
|
||||
pool = await self._get_pool()
|
||||
async with pool.acquire() as conn:
|
||||
await conn.execute("UPDATE posts SET status = 'rejected' WHERE id = $1;", post_id)
|
||||
|
||||
async def soft_delete_post(self, post_id: int) -> None:
|
||||
pool = await self._get_pool()
|
||||
async with pool.acquire() as conn:
|
||||
await conn.execute("UPDATE posts SET is_deleted = TRUE, status = 'deleted' WHERE id = $1;", post_id)
|
||||
|
||||
+18
-4
@@ -93,10 +93,10 @@ class AdminBotService:
|
||||
if len(row) == 2:
|
||||
buttons.append(row)
|
||||
row = []
|
||||
if row:
|
||||
buttons.append(row)
|
||||
|
||||
buttons.append([Button.inline("❌ رد و بایگانی پست", data=f"rej:{post.id}")])
|
||||
buttons.append([
|
||||
Button.inline("❌ رد و بایگانی", data=f"rej:{post.id}"),
|
||||
Button.inline("🗑 حذف پیام از کانال", data=f"del_msg:{post.id}")
|
||||
])
|
||||
return buttons
|
||||
|
||||
def _format_raw_post_caption(self, post: Post) -> str:
|
||||
@@ -576,6 +576,20 @@ class AdminBotService:
|
||||
)
|
||||
await event.answer("پست بایگانی شد.")
|
||||
|
||||
# 6. Soft Delete & Remove Message from Admin Channel
|
||||
elif data.startswith("del_msg:"):
|
||||
_, post_id_str = data.split(":")
|
||||
post_id = int(post_id_str)
|
||||
|
||||
await self.repo.soft_delete_post(post_id)
|
||||
try:
|
||||
await event.delete()
|
||||
except Exception as e:
|
||||
logger.error(f"Could not delete message from review channel: {e}")
|
||||
await event.edit("🗑 <b>این پیام حذف و بایگانی شد.</b>", parse_mode="html", buttons=None)
|
||||
|
||||
await event.answer("🗑 پیام از کانال ادمین حذف شد.", alert=False)
|
||||
|
||||
async def stop(self):
|
||||
if self.client.is_connected():
|
||||
await self.client.disconnect()
|
||||
|
||||
Reference in New Issue
Block a user