Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions backend/app/api/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,14 @@ def login(request: LoginRequest, db: Session = Depends(get_session)) -> LoginRes
user = db.exec(
select(User).where(User.tenant_id == request.tenant_id, User.username == username)
).first()
if not user:
display_name_matches = db.exec(
select(User)
.where(User.tenant_id == request.tenant_id, User.display_name == username)
.limit(2)
).all()
if len(display_name_matches) == 1:
user = display_name_matches[0]
if not user or not verify_password(request.password, user.password_hash):
raise HTTPException(status_code=401, detail="Invalid username or password")

Expand Down
41 changes: 35 additions & 6 deletions backend/app/db/database.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,13 @@ def _migrate_sqlite_skill_schema() -> None:
conn.execute(text("ALTER TABLE users ADD COLUMN role VARCHAR NOT NULL DEFAULT 'member'"))
if "source" not in user_columns:
conn.execute(text("ALTER TABLE users ADD COLUMN source VARCHAR NOT NULL DEFAULT 'web'"))
if "display_name" in user_columns:
conn.execute(
text(
"CREATE INDEX IF NOT EXISTS ix_users_tenant_id_display_name "
"ON users(tenant_id, display_name)"
)
)
_migrate_user_source_backfill(conn)

if "sessions" in tables:
Expand Down Expand Up @@ -1951,15 +1958,33 @@ def _migrate_knowledge_base_schema(conn, inspector, tables: set[str]) -> None:
{"tenant_id": tenant_id, "knowledge_base_id": _default_knowledge_base_id(tenant_id)},
)

resolved_version_ids: dict[str, str] = {}
if "knowledge_base_versions" in tables and "knowledge_bases" in tables:
knowledge_bases = conn.execute(text("SELECT * FROM knowledge_bases")).mappings().all()
for row in knowledge_bases:
version_id = _knowledge_base_version_id(str(row["id"]), "1.0.0")
knowledge_base_id = str(row["id"])
version_id = _knowledge_base_version_id(knowledge_base_id, "1.0.0")
existing = conn.execute(
text("SELECT id FROM knowledge_base_versions WHERE id = :id"),
{"id": version_id},
text(
"""
SELECT id FROM knowledge_base_versions
WHERE id = :id
OR (
tenant_id = :tenant_id
AND knowledge_base_id = :knowledge_base_id
AND version = '1.0.0'
)
"""
),
{
"id": version_id,
"tenant_id": row["tenant_id"],
"knowledge_base_id": knowledge_base_id,
},
).first()
if not existing:
if existing:
version_id = str(existing[0])
else:
conn.execute(
text(
"""
Expand All @@ -1977,7 +2002,7 @@ def _migrate_knowledge_base_schema(conn, inspector, tables: set[str]) -> None:
{
"id": version_id,
"tenant_id": row["tenant_id"],
"knowledge_base_id": row["id"],
"knowledge_base_id": knowledge_base_id,
"name": row["name"],
"description": row.get("description"),
"status": row.get("status") or "active",
Expand All @@ -1989,6 +2014,7 @@ def _migrate_knowledge_base_schema(conn, inspector, tables: set[str]) -> None:
"metadata_json": row.get("metadata_json") or "{}",
},
)
resolved_version_ids[knowledge_base_id] = version_id

for table_name in table_names:
if table_name not in tables:
Expand Down Expand Up @@ -2021,7 +2047,10 @@ def _migrate_knowledge_base_schema(conn, inspector, tables: set[str]) -> None:
),
{
"knowledge_base_id": knowledge_base_id,
"version_id": _knowledge_base_version_id(knowledge_base_id, "1.0.0"),
"version_id": resolved_version_ids.get(
knowledge_base_id,
_knowledge_base_version_id(knowledge_base_id, "1.0.0"),
),
},
)

Expand Down
5 changes: 4 additions & 1 deletion backend/app/db/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,10 @@ class Tenant(SQLModel, table=True):

class User(SQLModel, table=True):
__tablename__ = "users"
__table_args__ = (UniqueConstraint("tenant_id", "username", name="uq_user_tenant_username"),)
__table_args__ = (
UniqueConstraint("tenant_id", "username", name="uq_user_tenant_username"),
Index("ix_users_tenant_id_display_name", "tenant_id", "display_name"),
)

id: str = Field(default_factory=lambda: new_id("user"), primary_key=True)
tenant_id: str = Field(index=True)
Expand Down
Loading