feat: add middle_name field and map all three Evotor name fields

- 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 <noreply@anthropic.com>
This commit is contained in:
mguschin
2026-05-24 16:51:11 +03:00
parent dc32bef7e8
commit 052c3b610f
3 changed files with 27 additions and 2 deletions

View File

@@ -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")

View File

@@ -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)

View File

@@ -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,