|
1 | | -from typing import List |
| 1 | +from typing import Optional |
2 | 2 |
|
3 | 3 | from fastapi import APIRouter, Depends |
4 | 4 | from sqlalchemy.ext.asyncio import AsyncSession |
5 | 5 |
|
6 | 6 | from dstack._internal.core.errors import ResourceNotExistsError |
7 | | -from dstack._internal.core.models.users import User, UserWithCreds |
| 7 | +from dstack._internal.core.models.users import User, UsersInfoListOrUsersList, UserWithCreds |
8 | 8 | from dstack._internal.server.db import get_session |
9 | 9 | from dstack._internal.server.models import UserModel |
10 | 10 | from dstack._internal.server.schemas.users import ( |
11 | 11 | CreateUserRequest, |
12 | 12 | DeleteUsersRequest, |
13 | 13 | GetUserRequest, |
| 14 | + ListUsersRequest, |
14 | 15 | RefreshTokenRequest, |
15 | 16 | UpdateUserRequest, |
16 | 17 | ) |
|
28 | 29 | ) |
29 | 30 |
|
30 | 31 |
|
31 | | -@router.post("/list", response_model=List[User]) |
| 32 | +@router.post("/list", response_model=UsersInfoListOrUsersList) |
32 | 33 | async def list_users( |
| 34 | + body: Optional[ListUsersRequest] = None, |
33 | 35 | session: AsyncSession = Depends(get_session), |
34 | 36 | user: UserModel = Depends(Authenticated()), |
35 | 37 | ): |
36 | | - return CustomORJSONResponse(await users.list_users_for_user(session=session, user=user)) |
| 38 | + """ |
| 39 | + Returns users visible to the user, sorted by descending `created_at`. |
| 40 | +
|
| 41 | + Admins see all non-deleted users. Non-admins only see themselves. |
| 42 | +
|
| 43 | + The results are paginated. To get the next page, pass `created_at` and `id` of |
| 44 | + the last user from the previous page as `prev_created_at` and `prev_id`. |
| 45 | + """ |
| 46 | + if body is None: |
| 47 | + # For backward compatibility |
| 48 | + body = ListUsersRequest() |
| 49 | + return CustomORJSONResponse( |
| 50 | + await users.list_users_for_user( |
| 51 | + session=session, |
| 52 | + user=user, |
| 53 | + return_total_count=body.return_total_count, |
| 54 | + name_pattern=body.name_pattern, |
| 55 | + prev_created_at=body.prev_created_at, |
| 56 | + prev_id=body.prev_id, |
| 57 | + limit=body.limit, |
| 58 | + ascending=body.ascending, |
| 59 | + ) |
| 60 | + ) |
37 | 61 |
|
38 | 62 |
|
39 | 63 | @router.post("/get_my_user", response_model=UserWithCreds) |
|
0 commit comments