The bot service in docker-compose.yml builds from ./bot, but the agent code lived in 'ai procurement/' and ./bot was only a Windows junction on reza.g's machine (and was gitignored) — exactly as the team reported: 'bot/ was never committed — prod-v7's bot is un-buildable from the repo.' - junction removed; 'ai procurement/' renamed to 'bot/' via git mv (all 41 files keep their history as pure renames) - 'bot/' dropped from .gitignore (voice/ stays ignored — runtime voice notes; bot/.env stays ignored by bot/.gitignore) - compose needs no change: context: ./bot and ./bot/app now resolve to committed files - bot/INTEGRATION-REPORT.md added: full story (problem, root cause, git state, security note on the committed BALE_BOT_TOKEN / AI_API_KEY compose defaults, and usage instructions for the team) Verified: 41 renames staged with zero secret/cache files; voice/ and bot/.env still ignored.
82 lines
2.7 KiB
Python
82 lines
2.7 KiB
Python
"""Idempotent DDL for the bot's own tables (mirrors the api's init_db.py
|
|
convention — the ORM never creates tables; this script does, IF NOT EXISTS).
|
|
"""
|
|
import logging
|
|
|
|
from sqlalchemy import text
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.models import Base
|
|
|
|
logger = logging.getLogger("bot.db_init")
|
|
|
|
DDL = [
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS bot_links (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
chat_id BIGINT UNIQUE NOT NULL,
|
|
user_id UUID,
|
|
casdoor_username TEXT,
|
|
display_name TEXT,
|
|
role VARCHAR(32),
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
)
|
|
""",
|
|
"CREATE INDEX IF NOT EXISTS ix_bot_links_chat_id ON bot_links (chat_id)",
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS bot_drafts (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
chat_id BIGINT NOT NULL,
|
|
kind VARCHAR(16) NOT NULL,
|
|
payload JSONB NOT NULL DEFAULT '{}'::jsonb,
|
|
missing JSONB,
|
|
status VARCHAR(16) NOT NULL DEFAULT 'active',
|
|
source VARCHAR(16),
|
|
source_message_id BIGINT,
|
|
review_message_id BIGINT,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
)
|
|
""",
|
|
"CREATE INDEX IF NOT EXISTS ix_bot_drafts_chat_id ON bot_drafts (chat_id)",
|
|
"CREATE INDEX IF NOT EXISTS ix_bot_drafts_chat_status ON bot_drafts (chat_id, status)",
|
|
"ALTER TABLE bot_drafts ADD COLUMN IF NOT EXISTS last_bale_update_at TIMESTAMPTZ",
|
|
"ALTER TABLE bot_drafts ADD COLUMN IF NOT EXISTS source_message_id BIGINT",
|
|
"CREATE INDEX IF NOT EXISTS ix_bot_drafts_review_msg ON bot_drafts (review_message_id)",
|
|
"CREATE INDEX IF NOT EXISTS ix_bot_drafts_source_msg ON bot_drafts (source_message_id)",
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS bot_messages (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
chat_id BIGINT NOT NULL,
|
|
direction VARCHAR(4) NOT NULL,
|
|
kind VARCHAR(16) NOT NULL DEFAULT 'text',
|
|
body TEXT,
|
|
payload JSONB,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
)
|
|
""",
|
|
"CREATE INDEX IF NOT EXISTS ix_bot_messages_chat_id ON bot_messages (chat_id)",
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS bot_meta (
|
|
key VARCHAR(64) PRIMARY KEY,
|
|
value TEXT,
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
)
|
|
""",
|
|
]
|
|
|
|
|
|
async def ensure_bot_tables(session: AsyncSession) -> None:
|
|
for stmt in DDL:
|
|
await session.execute(text(stmt))
|
|
await session.commit()
|
|
logger.info("bot tables ready")
|
|
|
|
|
|
async def ensure_schema() -> None:
|
|
from app.db import SessionLocal
|
|
|
|
async with SessionLocal() as session:
|
|
await ensure_bot_tables(session)
|