Skip to content

Commit

Permalink
feat(1386): add support for pagination, refs: #1386
Browse files Browse the repository at this point in the history
  • Loading branch information
MCatherine1994 committed Jul 25, 2024
1 parent 36f52d9 commit d655d07
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 14 deletions.
46 changes: 40 additions & 6 deletions server/backend/api/app/crud/crud_user.py
Original file line number Diff line number Diff line change
Expand Up @@ -255,24 +255,47 @@ def fetch_initial_requester_info(db: Session, cognito_user_id: str):
return user


def update_user_info_from_idim_source(db: Session):
def update_user_info_from_idim_source(
db: Session, use_pagination: bool, page: int, per_page: int
) -> schemas.FamUserUpdateResponse:
"""
Go through each user record in the database, update the user information to match the record in IDIM web service
"""
# get a requester from the database
requester = db.query(models.FamUser).filter(models.FamUser.user_name == "CMENG").one_or_none()

requester = (
db.query(models.FamUser)
.filter(models.FamUser.user_name == "CMENG")
.one_or_none()
)
# setup IDIM web service
api_instance_env = (
ApiInstanceEnv.PROD if crud_utils.is_on_aws_prod() else ApiInstanceEnv.TEST
)
idim_proxy_service = IdimProxyService(requester, api_instance_env)

# grab fam users from user table
fam_users = get_users(db)
total_users_count = len(fam_users)
LOGGER.debug(f"Total number of users: {total_users_count}")
if use_pagination:
fam_users = (
db.query(models.FamUser)
.order_by(models.FamUser.user_id.asc())
.offset((page - 1) * per_page)
.limit(per_page)
.all()
)
LOGGER.debug(
f"Updating information for users on page {page}, there are {per_page} users on each page"
)

LOGGER.debug(f"Total number of users: {len(fam_users)}")
success_user_list = []
failed_user_list = []

for user in fam_users:
LOGGER.debug(f"Updating information for user: {user.user_name}, type: {user.user_type_code}, guid: {user.user_guid}")
LOGGER.debug(
f"Updating information for user: {user.user_name}, type: {user.user_type_code}, guid: {user.user_guid}"
)
properties_to_update = {}
if user.user_type_code == UserType.IDIR:
# IDIM web service doesn't support search IDIR by user_guid, so we search by userID
Expand Down Expand Up @@ -319,7 +342,6 @@ def update_user_info_from_idim_source(db: Session):
models.FamUser.user_guid: search_result.get("guid"),
}


# Update various target_user fields from idim search if exists
if search_result and search_result.get("found"):
properties_to_update = {
Expand All @@ -332,7 +354,19 @@ def update_user_info_from_idim_source(db: Session):

update(db, user.user_id, properties_to_update, requester.cognito_user_id)
LOGGER.debug(f"Updating information for user {user.user_name} is done")
success_user_list.append(user.user_id)
else:
LOGGER.debug(
f"Invalid request, cannot find user {user.user_name} {user.user_guid} with user type {user.user_type_code}"
)
failed_user_list.append(user.user_id)

return schemas.FamUserUpdateResponse(
**{
"total_users_count": total_users_count,
"current_page": page,
"users_count_on_page": len(fam_users),
"success_user_list": success_user_list,
"failed_user_list": failed_user_list,
}
)
21 changes: 13 additions & 8 deletions server/backend/api/app/routers/router_user.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,28 @@
from api.app.crud import crud_user
from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session
from api.app.models.model import FamUser
from api.app.schemas import FamUserUpdateResponse

LOGGER = logging.getLogger(__name__)
router = APIRouter()


@router.post(
"",
status_code=HTTPStatus.OK,
)
@router.post("", status_code=HTTPStatus.OK, response_model=FamUserUpdateResponse)
def update_user_information_from_idim_source(
page: int = 1,
per_page: int = 100,
use_pagination: bool = False,
db: Session = Depends(database.get_db),
):
"""
Call IDIM web service to grab latest user information and update the record in FAM database
"""
LOGGER.debug(f"Updating datanase user information")
LOGGER.debug(f"Updating database user information")

crud_user.update_user_info_from_idim_source(db)
LOGGER.debug(f"Updating datanase user information is done")
response = crud_user.update_user_info_from_idim_source(
db, use_pagination, page, per_page
)

LOGGER.debug(f"Updating database user information is done")

return response
8 changes: 8 additions & 0 deletions server/backend/api/app/schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,14 @@ class FamUserInfo(BaseModel):
)


class FamUserUpdateResponse(BaseModel):
total_users_count: int
current_page: int
users_count_on_page: int
success_user_list: List[int]
failed_user_list: List[int]


# --------------------------------- FAM Forest Client--------------------------------- #
class FamForestClientCreate(BaseModel):
# Note, the request may contain string(with leading '0')
Expand Down

0 comments on commit d655d07

Please sign in to comment.