withAuth function

Rester withAuth(
  1. Rester rester
)

Implementation

Rester withAuth(Rester rester) {
  Future<Response> fn(
    Uri url, {
    Map<String, String>? headers,
    Object? body,
    Encoding? encoding,
  }) async {
    final accessToken = findAccessToken();

    if (accessToken != null) {
      final authorizedHeaders = {
        "Authorization": "Bearer $accessToken",
      };

      if (headers != null) {
        authorizedHeaders.addAll(headers);
      }

      final response = await rester(
        url,
        headers: authorizedHeaders,
        body: body,
        encoding: encoding,
      );

      if (response.statusCode != 401) {
        return response;
      }
    }

    report("Try to refresh ...");

    await Future.delayed(const Duration(milliseconds: 1000));

    final refreshToken = await findRefreshToken();

    if (refreshToken == null) {
      return Response(
        jsonEncode({
          "message": "로그인이 필요합니다.",
        }),
        404,
      );
    }

    final response = await withRetry(withPostLog(post))(
      endpoint("auth/refresh"),
      body: jsonEncode({
        "refreshToken": refreshToken,
      }),
    );

    switch (response.state) {
      case ResterResponseState.success:
        saveAccessToken(response.json["accessToken"]);

        dispatch(const AuthRefreshResolved());

        return fn(url, headers: headers, body: body, encoding: encoding);
      case ResterResponseState.failure:
        await deleteRefreshToken();

        dispatch(AuthRefreshRejected(response.message));

        return response;
    }
  }

  return fn;
}