06/09 Update a customer AI chatbot and support form submision

This commit is contained in:
2026-06-09 16:13:12 -04:00
parent 58d4b351b4
commit 38dff9ea02
9 changed files with 1029 additions and 1 deletions
@@ -0,0 +1,70 @@
"""phase23 — support tickets
Creates two tables:
support_tickets — customer-submitted help requests
support_ticket_replies — admin/staff replies to those tickets
"""
import sqlalchemy as sa
from alembic import op
revision = 'phase23_support_tickets'
down_revision = 'phase22_comment_visibility'
branch_labels = None
depends_on = None
def _table_exists(bind, table: str) -> bool:
result = bind.execute(sa.text(
"SELECT COUNT(*) FROM information_schema.tables "
"WHERE table_schema = DATABASE() AND table_name = :t"
), {'t': table})
return result.scalar() > 0
def upgrade():
bind = op.get_bind()
if not _table_exists(bind, 'support_tickets'):
op.execute(sa.text("""
CREATE TABLE support_tickets (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
customer_id INT NULL,
facility_id INT NULL,
subject VARCHAR(200) NOT NULL,
body TEXT NOT NULL,
status VARCHAR(20) NOT NULL DEFAULT 'open',
created_at DATETIME NOT NULL,
CONSTRAINT fk_st_customer FOREIGN KEY (customer_id)
REFERENCES users(id) ON DELETE SET NULL,
CONSTRAINT fk_st_facility FOREIGN KEY (facility_id)
REFERENCES facilities(id) ON DELETE SET NULL,
INDEX ix_support_tickets_customer (customer_id),
INDEX ix_support_tickets_status (status),
INDEX ix_support_tickets_created (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
"""))
if not _table_exists(bind, 'support_ticket_replies'):
op.execute(sa.text("""
CREATE TABLE support_ticket_replies (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
ticket_id INT NOT NULL,
user_id INT NULL,
body TEXT NOT NULL,
created_at DATETIME NOT NULL,
CONSTRAINT fk_str_ticket FOREIGN KEY (ticket_id)
REFERENCES support_tickets(id) ON DELETE CASCADE,
CONSTRAINT fk_str_user FOREIGN KEY (user_id)
REFERENCES users(id) ON DELETE SET NULL,
INDEX ix_support_replies_ticket (ticket_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
"""))
def downgrade():
bind = op.get_bind()
if _table_exists(bind, 'support_ticket_replies'):
op.execute(sa.text('DROP TABLE support_ticket_replies'))
if _table_exists(bind, 'support_tickets'):
op.execute(sa.text('DROP TABLE support_tickets'))