From 052c3b610fa8ac7f5f3cf1e7920ab439b27b3b7a Mon Sep 17 00:00:00 2001 From: mguschin Date: Sun, 24 May 2026 16:51:11 +0300 Subject: [PATCH] feat: add middle_name field and map all three Evotor name fields MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add middle_name column to users table (migration 0012) - Map Evotor's second_name → last_name, middle_name → middle_name in /user/create webhook handler - Update name fields on existing users when Evotor sends them Co-Authored-By: Claude Sonnet 4.6 --- .../versions/0012_users_middle_name.py | 16 ++++++++++++++++ web/models/user.py | 1 + web/routes/evotor_webhooks.py | 12 ++++++++++-- 3 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 web/migrations/versions/0012_users_middle_name.py diff --git a/web/migrations/versions/0012_users_middle_name.py b/web/migrations/versions/0012_users_middle_name.py new file mode 100644 index 0000000..15e169f --- /dev/null +++ b/web/migrations/versions/0012_users_middle_name.py @@ -0,0 +1,16 @@ +"""Add middle_name to users.""" +revision = "0012" +down_revision = "0011" +branch_labels = None +depends_on = None + +from alembic import op +import sqlalchemy as sa + + +def upgrade(): + op.add_column("users", sa.Column("middle_name", sa.String(100), nullable=True)) + + +def downgrade(): + op.drop_column("users", "middle_name") diff --git a/web/models/user.py b/web/models/user.py index 9ad6103..770290a 100644 --- a/web/models/user.py +++ b/web/models/user.py @@ -23,6 +23,7 @@ class User(Base): id = Column(Integer, primary_key=True, autoincrement=True) first_name = Column(String(100), nullable=False) last_name = Column(String(100), nullable=False) + middle_name = Column(String(100), nullable=True) email = Column(String(255), nullable=False) phone = Column(String(20), nullable=True) password_hash = Column(String(255), nullable=True) diff --git a/web/routes/evotor_webhooks.py b/web/routes/evotor_webhooks.py index 512a767..027e0d5 100644 --- a/web/routes/evotor_webhooks.py +++ b/web/routes/evotor_webhooks.py @@ -106,7 +106,8 @@ async def user_create(request: Request, db: Session = Depends(get_db)): email = (body.get("email") or custom.get("email") or "").strip().lower() or None phone = (body.get("phone_number") or body.get("phone") or custom.get("phone_number") or custom.get("phone") or "").strip() or None first_name = (body.get("first_name") or body.get("firstName") or custom.get("first_name") or custom.get("firstName") or "").strip() or None - last_name = (body.get("last_name") or body.get("lastName") or custom.get("last_name") or custom.get("lastName") or "").strip() or None + last_name = (body.get("second_name") or body.get("last_name") or body.get("lastName") or custom.get("second_name") or custom.get("last_name") or custom.get("lastName") or "").strip() or None + middle_name = (body.get("middle_name") or custom.get("middle_name") or "").strip() or None # Try to find existing user user: User | None = None @@ -125,9 +126,15 @@ async def user_create(request: Request, db: Session = Depends(get_db)): now = datetime.now(timezone.utc).replace(tzinfo=None) if user: - # Link Evotor to existing user + # Link Evotor to existing user; update name fields if Evotor provided them user.evotor_user_id = evotor_user_id user.evotor_meta = body + if first_name: + user.first_name = first_name + if last_name: + user.last_name = last_name + if middle_name: + user.middle_name = middle_name if user.status == UserStatusEnum.pending: user.status = UserStatusEnum.active db.flush() @@ -136,6 +143,7 @@ async def user_create(request: Request, db: Session = Depends(get_db)): user = User( first_name=first_name or "", last_name=last_name or "", + middle_name=middle_name, email=email or f"{evotor_user_id}@evotor.invalid", phone=phone or None, password_hash=None,