|
| 1 | +import datetime |
1 | 2 | from typing import Any, Dict, Generic, List, Optional, Union, cast |
2 | 3 |
|
3 | 4 | from httpx import Response |
|
17 | 18 | UserDB, |
18 | 19 | OwnUser, |
19 | 20 | ) |
20 | | -from weaviate.util import _decode_json_response_dict |
| 21 | +from weaviate.util import _datetime_from_weaviate_str, _decode_json_response_dict |
21 | 22 |
|
22 | 23 |
|
23 | 24 | class _BaseExecutor(Generic[ConnectionType]): |
@@ -401,53 +402,88 @@ def resp(res: Response) -> bool: |
401 | 402 | status_codes=_ExpectedStatusCodes(ok_in=[200, 409], error="Deactivate user"), |
402 | 403 | ) |
403 | 404 |
|
404 | | - def get(self, *, user_id: str) -> executor.Result[Optional[UserDB]]: |
| 405 | + def get( |
| 406 | + self, *, user_id: str, include_last_used_at_time: bool = False |
| 407 | + ) -> executor.Result[Optional[Union[UserDB[None], UserDB[datetime.datetime]]]]: |
405 | 408 | """Get all information about an user. |
406 | 409 |
|
407 | 410 | Args: |
408 | 411 | user_id: The id of the user. |
409 | 412 | """ |
410 | 413 |
|
411 | | - def resp(res: Response) -> Optional[UserDB]: |
| 414 | + def resp(res: Response) -> Optional[Union[UserDB[None], UserDB[datetime.datetime]]]: |
412 | 415 | if res.status_code == 404: |
413 | 416 | return None |
414 | 417 | parsed = _decode_json_response_dict(res, "Get user") |
415 | 418 | assert parsed is not None |
416 | | - return UserDB( |
417 | | - user_id=parsed["userId"], |
418 | | - role_names=parsed["roles"], |
419 | | - active=parsed["active"], |
420 | | - user_type=UserTypes(parsed["dbUserType"]), |
| 419 | + user = cast(WeaviateDBUserRoleNames, parsed) |
| 420 | + ret = UserDB( |
| 421 | + user_id=user["userId"], |
| 422 | + role_names=user["roles"], |
| 423 | + active=user["active"], |
| 424 | + user_type=UserTypes(user["dbUserType"]), |
| 425 | + created_at=_datetime_from_weaviate_str(user["createdAt"]), |
| 426 | + last_used=get_last_used_at_time(user=user) if include_last_used_at_time else None, |
| 427 | + apikey_first_letters=get_api_key_first_letters(user=user), |
421 | 428 | ) |
| 429 | + if include_last_used_at_time: |
| 430 | + return cast(UserDB[datetime.datetime], ret) |
| 431 | + return cast(UserDB[None], ret) |
422 | 432 |
|
423 | 433 | return executor.execute( |
424 | 434 | response_callback=resp, |
425 | 435 | method=self._connection.get, |
| 436 | + params={"includeLastUsedTime": include_last_used_at_time}, |
426 | 437 | path=f"/users/db/{user_id}", |
427 | 438 | error_msg=f"Could not get user '{user_id}'", |
428 | 439 | status_codes=_ExpectedStatusCodes(ok_in=[200, 404], error="get user"), |
429 | 440 | ) |
430 | 441 |
|
431 | | - def list_all(self) -> executor.Result[List[UserDB]]: |
| 442 | + def list_all( |
| 443 | + self, *, include_last_used_at_time: bool = False |
| 444 | + ) -> executor.Result[Union[List[UserDB[None]], List[UserDB[datetime.datetime]]]]: |
432 | 445 | """List all DB users.""" |
433 | 446 |
|
434 | | - def resp(res: Response) -> List[UserDB]: |
| 447 | + def resp(res: Response) -> Union[List[UserDB[None]], List[UserDB[datetime.datetime]]]: |
435 | 448 | parsed = _decode_json_response_dict(res, "Get user") |
436 | 449 | assert parsed is not None |
437 | | - return [ |
| 450 | + |
| 451 | + ret = [ |
438 | 452 | UserDB( |
439 | 453 | user_id=user["userId"], |
440 | 454 | role_names=user["roles"], |
441 | 455 | active=user["active"], |
442 | 456 | user_type=UserTypes(user["dbUserType"]), |
| 457 | + created_at=_datetime_from_weaviate_str(user["createdAt"]), |
| 458 | + last_used=( |
| 459 | + get_last_used_at_time(user=user) if include_last_used_at_time else None |
| 460 | + ), |
| 461 | + apikey_first_letters=get_api_key_first_letters(user=user), |
443 | 462 | ) |
444 | 463 | for user in cast(List[WeaviateDBUserRoleNames], parsed) |
445 | 464 | ] |
446 | 465 |
|
| 466 | + if include_last_used_at_time: |
| 467 | + return cast(List[UserDB[datetime.datetime]], ret) |
| 468 | + return cast(List[UserDB[None]], ret) |
| 469 | + |
447 | 470 | return executor.execute( |
448 | 471 | response_callback=resp, |
449 | 472 | method=self._connection.get, |
| 473 | + params={"includeLastUsedTime": include_last_used_at_time}, |
450 | 474 | path="/users/db", |
451 | 475 | error_msg="Could not list all users", |
452 | 476 | status_codes=_ExpectedStatusCodes(ok_in=[200], error="list all users"), |
453 | 477 | ) |
| 478 | + |
| 479 | + |
| 480 | +def get_last_used_at_time(user: WeaviateDBUserRoleNames) -> datetime.datetime: |
| 481 | + lastused = user.get("lastUsedAt", None) |
| 482 | + if lastused is None: |
| 483 | + return datetime.datetime.min |
| 484 | + return _datetime_from_weaviate_str(lastused) |
| 485 | + |
| 486 | + |
| 487 | +def get_api_key_first_letters(user: WeaviateDBUserRoleNames) -> str: |
| 488 | + first_letters = user.get("apiKeyFirstLetters", "") |
| 489 | + return first_letters if first_letters else "" |
0 commit comments