def create_inspace_user_account()

in components/user_management/src/routes/user.py [0:0]


def create_inspace_user_account(user_id: str):
  """The create inspace user endpoint will create an Inspace user for an
      already existing GPCore user.

  ### Args:
      user_id (str): User id of the GPCore user for which Inspace User
                     is to be created

  ### Raises:
      Exception: 500 Internal Server Error if something went wrong

  ### Returns:
      PostUserResponseModel: User Object
  """
  try:
    if not is_inspace_enabled():
      raise ValidationError("you don't have permission to access this endpoint")
    user = User.find_by_user_id(user_id)

    allowed_inspace_user_types = ["learner"]
    allowed_inspace_user_types.extend(STAFF_USERS)

    if user.user_type not in allowed_inspace_user_types:
      inspace_mapping = {
        "is_inspace_user": False,
        "inspace_user_id": ""
      }
      user.inspace_user = inspace_mapping
      user.update()
      raise ValidationError("Cannot create Inspace user for user"
                            f" of type {user.user_type}")

    if (user.inspace_user is None or
            user.inspace_user.get("is_inspace_user") is False):
      inspace_mapping = {
        "is_inspace_user": True,
        "inspace_user_id": ""
      }
      user.inspace_user = inspace_mapping
      user.update()
    elif (user.inspace_user.get("is_inspace_user") is True and
          user.inspace_user.get("inspace_user_id") != ""):
      raise ConflictError("Inspace User already exists for current user")

    # ---- Try fetching Inspace User
    response_message = None
    status_code, inspace_user_res = get_inspace_user_helper(user)
    response_message = ""
    if status_code == 200:
      inspace_mapping = {
        "is_inspace_user": True,
        "inspace_user_id": inspace_user_res["inspaceUser"]["id"]
      }
      user.inspace_user = inspace_mapping
      user.update()
      response_message = "Successfully updated Inspace User id for current user"
    elif status_code == 404:
      # ---- Inspace User creation if user doesn't exist----
      if create_inspace_user_helper(user):
        response_message = "Successfully created Inspace User for current user"
      else:
        response_message = "Cannot create Inspace User for current User"

    # fetch and return updated user
    user = User.find_by_user_id(user_id)
    user_fields = user.get_fields(reformat_datetime=True)

    return {
      "success": True,
      "message": response_message,
      "data": user_fields
    }
  except ResourceNotFoundException as e:
    Logger.error(e)
    Logger.error(traceback.print_exc())
    raise ResourceNotFound(str(e)) from e
  except ConflictError as e:
    Logger.error(e)
    Logger.error(traceback.print_exc())
    raise Conflict(str(e)) from e
  except ValidationError as e:
    Logger.error(e)
    Logger.error(traceback.print_exc())
    raise BadRequest(str(e)) from e
  except Exception as e:
    Logger.error(e)
    Logger.error(traceback.print_exc())
    raise InternalServerError(str(e)) from e