getCurrentUser method Null safety

Future<User> getCurrentUser()

로그인된 사용자 정보를 가져옵니다

Implementation

Future<User> getCurrentUser() async {
  try {
    LogManager().addLog("getCurrentUser()", screen: runtimeType.toString());
    userState = Provider.of<UserState>(context, listen: false);

    /// 로그인 된 유저 정보를 이미 가져왔으면 가져온 정보를 반환합니다.
    if (userState.currentUser != null && userState.currentUser?.id != "null") {
      LogManager().addLog("로그인된 유저 정보를 캐시에서 가져옴. 캐시 정보를 반환.", screen: runtimeType.toString());
      return userState.currentUser!;
    }

    late AuthUser authUser;
    try {
      LogManager().addLog("로그인된 유저 정보가 캐시에 없음. 새로 요청 시도.", screen: runtimeType.toString());
      authUser = await Amplify.Auth.getCurrentUser(); // SignedOutException 던짐
      registerNotificationToken();
      LogManager().addLog("유저 정보를 새로 가져옴", screen: runtimeType.toString());
      LogManager().addLog(authUser.username, screen: runtimeType.toString());
      LogManager().addLog(authUser.userId, screen: runtimeType.toString());
      userState.currentUser = User(
        id: authUser.userId,
        username: authUser.username,
        name: '',
        type: "owner",
        awsAccessKey: userState.currentUser?.awsAccessKey,
        awsSecretKey: userState.currentUser?.awsSecretKey,
        awsSessionToken: userState.currentUser?.awsSessionToken,
      );
      LogManager().addLog("유저 정보를 캐시에 저장함", screen: runtimeType.toString());
    } on AmplifyException catch (e) {
      LogManager().addLog("AmplifyException 발생", screen: runtimeType.toString());
      if (e is SignedOutException) {
        LogManager().addLog("SignedOutException 발생", screen: runtimeType.toString());
      } else {
        LogManager().addLog("그 외 AmplifyException 발생", screen: runtimeType.toString());
      }
      LogManager().addLog(e.message, screen: runtimeType.toString());
      rethrow;
    } catch (e) {
      LogManager().addLog("Exception 발생", screen: runtimeType.toString());
      LogManager().addLog(e.toString(), screen: runtimeType.toString());
      rethrow;
    }

    LogManager().addLog("Amplify.Auth.fetchUserAttributes()", screen: runtimeType.toString());
    List<AuthUserAttribute> authUserAttributes = await Amplify.Auth.fetchUserAttributes();
    LogManager().addLog("getDeviceId()", screen: runtimeType.toString());
    deviceId = await getDeviceId();
    LogManager().addLog("deviceId: $deviceId", screen: runtimeType.toString());
    for (AuthUserAttribute e in authUserAttributes) {
      switch (e.userAttributeKey.key) {
        case "name":
          userState.currentUser?.name = e.value;
          break;
        case "email":
          userState.currentUser?.email = e.value;
          break;
        case "phone_number":
          userState.currentUser?.phoneNumber = e.value;
          break;
        case "birthdate":
          userState.currentUser?.birth = DateTime.parse(e.value);
          break;
      }
    }
    LogManager().addLog("로그인된 사용자 정보 가져오기 성공: ${userState.currentUser!.username}", screen: runtimeType.toString());
    LogManager().addLog(
      "${{
        "id": ApiService().userState.currentUser?.id,
        "username": ApiService().userState.currentUser?.username,
        "phoneNumber": ApiService().userState.currentUser?.phoneNumber,
        "deviceId": await ApiService().getDeviceId().catchError((e) => "-"),
      }}",
      screen: runtimeType.toString(),
    );
    LogManager().addLog("${ApiService().demographic.toString()}", screen: runtimeType.toString());
    return userState.currentUser!;
  } catch (e) {
    LogManager().addLog("로그인된 사용자 정보 가져오기 실패: ${userState.currentUser?.username}", screen: runtimeType.toString());
    rethrow;
  }
}