diff --git a/db/database.py b/db/database.py index e7e8169..77d18e3 100644 --- a/db/database.py +++ b/db/database.py @@ -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 diff --git a/db/models.py b/db/models.py index b9d9fef..77200f7 100644 --- a/db/models.py +++ b/db/models.py @@ -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 diff --git a/db/repository.py b/db/repository.py index a41f1b2..e276719 100644 --- a/db/repository.py +++ b/db/repository.py @@ -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) diff --git a/services/admin_bot.py b/services/admin_bot.py index 1a439bd..a0861da 100644 --- a/services/admin_bot.py +++ b/services/admin_bot.py @@ -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("🗑 این پیام حذف و بایگانی شد.", parse_mode="html", buttons=None) + + await event.answer("🗑 پیام از کانال ادمین حذف شد.", alert=False) + async def stop(self): if self.client.is_connected(): await self.client.disconnect()