users.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. """当前用户与用户分页查询。"""
  2. from __future__ import annotations
  3. from flask import request
  4. from sqlalchemy import select
  5. from dms.api.v1.blueprint import api_v1
  6. from dms.common.errors import AuthenticationError, InvalidArgumentError
  7. from dms.common.pagination import PageRequest
  8. from dms.common.response import success_response
  9. from dms.extensions import db
  10. from dms.models import User
  11. from dms.security.auth_context import get_auth_context
  12. from dms.security.decorators import admin_required, bearer_auth_required
  13. from dms.services.user_service import list_users, parse_string_id, user_summary
  14. def _integer_query(name: str, default: int) -> int:
  15. raw_value = request.args.get(name)
  16. if raw_value is None or raw_value == "":
  17. return default
  18. try:
  19. return int(raw_value)
  20. except ValueError as exc:
  21. raise InvalidArgumentError(f"{name}必须是整数") from exc
  22. def _boolean_query(name: str, default: bool) -> bool:
  23. raw_value = request.args.get(name)
  24. if raw_value is None or raw_value == "":
  25. return default
  26. normalized = raw_value.lower()
  27. if normalized not in {"true", "false"}:
  28. raise InvalidArgumentError(f"{name}必须是true或false")
  29. return normalized == "true"
  30. @api_v1.get("/users/me")
  31. @bearer_auth_required
  32. def current_user():
  33. context = get_auth_context()
  34. user = db.session.scalar(
  35. select(User).where(User.id == context.user_id, User.is_deleted.is_(False))
  36. )
  37. if user is None:
  38. raise AuthenticationError()
  39. return success_response(user_summary(user))
  40. @api_v1.get("/users")
  41. @bearer_auth_required
  42. @admin_required
  43. def users():
  44. page_request = PageRequest(
  45. page=_integer_query("page", 1),
  46. page_size=_integer_query("pageSize", 20),
  47. )
  48. data = list_users(
  49. organization_id=parse_string_id(
  50. request.args.get("organizationId"),
  51. name="organizationId",
  52. ),
  53. include_descendants=_boolean_query("includeDescendants", False),
  54. keyword=request.args.get("keyword"),
  55. status=request.args.get("status"),
  56. page_request=page_request,
  57. )
  58. return success_response(data)