- Unify API: lib/api.ts uses /api/v1, inbox uses /api/inbox (rewrites) - Remove localhost refs: openapi, inbox page - Add rewrites: /api/inbox|tmc -> inbox-server, /api/v1 -> FastAPI - Add stub routes: knowledge/insights, recommendations, search, log-error - Transfer from PAPA: prompts (inspection, tmc), scripts, supabase, data/tmc-requests - Fix inbox-server: ORDER BY created_at, package.json - Remove redundant app/api/inbox/files route (rewrites handle it) - knowledge/ in gitignore (large PDFs) Co-authored-by: Cursor <cursoragent@cursor.com>
108 lines
3.1 KiB
Python
108 lines
3.1 KiB
Python
"""
|
||
API endpoints для управления пользователями.
|
||
|
||
В production пользователи управляются через АСУ ТК-ИБ, здесь только чтение.
|
||
"""
|
||
|
||
from fastapi import APIRouter, Depends, HTTPException
|
||
from sqlalchemy.orm import Session
|
||
from pydantic import BaseModel, field_validator
|
||
from datetime import datetime
|
||
|
||
from app.api.deps import get_current_user
|
||
from app.db.session import get_db
|
||
from app.models.user import User
|
||
from app.models.organization import Organization
|
||
from app.schemas.common import _coerce_datetime
|
||
|
||
router = APIRouter(tags=["users"])
|
||
|
||
|
||
class UserOut(BaseModel):
|
||
id: str
|
||
external_subject: str
|
||
display_name: str
|
||
email: str | None
|
||
role: str
|
||
organization_id: str | None
|
||
organization_name: str | None
|
||
created_at: datetime
|
||
updated_at: datetime
|
||
|
||
@field_validator("created_at", "updated_at", mode="before")
|
||
@classmethod
|
||
def parse_dt(cls, v):
|
||
return _coerce_datetime(v)
|
||
|
||
|
||
@router.get("/users", response_model=list[UserOut])
|
||
def list_users(
|
||
organization_id: str | None = None,
|
||
role: str | None = None,
|
||
db: Session = Depends(get_db),
|
||
user=Depends(get_current_user),
|
||
):
|
||
"""Получить список пользователей."""
|
||
query = db.query(User)
|
||
|
||
if organization_id:
|
||
query = query.filter(User.organization_id == organization_id)
|
||
|
||
if role:
|
||
query = query.filter(User.role == role)
|
||
|
||
users = query.order_by(User.display_name).all()
|
||
|
||
# Добавляем название организации
|
||
result = []
|
||
for u in users:
|
||
org_name = None
|
||
if u.organization_id:
|
||
org = db.query(Organization).filter(Organization.id == u.organization_id).first()
|
||
if org:
|
||
org_name = org.name
|
||
|
||
result.append(UserOut(
|
||
id=u.id,
|
||
external_subject=u.external_subject,
|
||
display_name=u.display_name,
|
||
email=u.email,
|
||
role=u.role,
|
||
organization_id=u.organization_id,
|
||
organization_name=org_name,
|
||
created_at=u.created_at,
|
||
updated_at=u.updated_at,
|
||
))
|
||
|
||
return result
|
||
|
||
|
||
@router.get("/users/{user_id}", response_model=UserOut)
|
||
def get_user(
|
||
user_id: str,
|
||
db: Session = Depends(get_db),
|
||
user=Depends(get_current_user),
|
||
):
|
||
"""Получить информацию о пользователе."""
|
||
u = db.query(User).filter(User.id == user_id).first()
|
||
if not u:
|
||
raise HTTPException(status_code=404, detail="User not found")
|
||
|
||
org_name = None
|
||
if u.organization_id:
|
||
org = db.query(Organization).filter(Organization.id == u.organization_id).first()
|
||
if org:
|
||
org_name = org.name
|
||
|
||
return UserOut(
|
||
id=u.id,
|
||
external_subject=u.external_subject,
|
||
display_name=u.display_name,
|
||
email=u.email,
|
||
role=u.role,
|
||
organization_id=u.organization_id,
|
||
organization_name=org_name,
|
||
created_at=u.created_at,
|
||
updated_at=u.updated_at,
|
||
)
|