개발/flutter

Flutter - graphQL 인자값 넣어서 Mutation 하기

덤벨로퍼 2020. 10. 6. 17:33

지난번에 간단한 쿼리를 보내 결과값을 받는 테스트까지 해보았다.

이번에는 간단한 mutation 을 실행해보려한다.

 

mutation 은 이렇게 되어있다.

mutation{
    updatePassword(input: $input)
  }

유저의 비밀번호를 변경할것이며 input 값에는 기존 비밀번호 , 새로운 비밀번호가 들어잇는 Map 타입이될것이다.

{
  oldPassword:xxxxx
  newPassword:yyyyy
}

 

지난번과 같은 구조로 getGraphqlClient 를 사용해 서버와 통신할것이다.

Future<bool> updatePasswordConnection(UpdatePasswordModel model) {
    return getGraphQLClient()
        .query(_queryOptions(model))
        .then(_toUpdatePasword);
}

 

graphQL클라이언트를 불러와 쿼리옵션으로 통신하고

결과값을 _toUpdatePasword (password오타) 로 보낸다.

지난번과달리 model 이라는 인자를 받아와 쿼리옵션에 넣어줬다.

이 model 안에 기존비밀번호 & 새 비밀번호 정보가 있다.

 

쿼리 옵션부터 보자

QueryOptions _queryOptions(UpdatePasswordModel model) {
    return QueryOptions(
        fetchPolicy: FetchPolicy.networkOnly,
        documentNode: gql(_readUserConnectionQuery(model.toJSON())));
  }
  
  
 //쿼리 
String _readUserConnectionQuery(Map<String, String> input) => '''
  mutation{
    updatePassword(input: $input)
  }
  ''';

model 을 인자로 받아와 쿼리에 넣어준다.

toJSON은 model을 UpdatePasswordModel 타입에서 Map 타입으로 변환해 준다.

결국 이런식으로 서버에게 요청할것이다

 

mutation{
    updatePassword(input: {
    	oldPassword:"oldPassword123"
        newPassword:"newPassword1234"
    })
  }

저렇게 "" 큰따옴표 안에 String 이 들어가있지않으면 에러를 리턴할것이다.

따라서 큰따옴표 안에 String 을 넣어주던지

toJSON() 함수에서 json.encode함수를 사용해줘야한다.

Map<String, String> toJSON() => <String, String>{
        'oldPassword': json.encode(oldPassword),
        'newPassword': json.encode(newPassword),
      };

 

결과값은 _toUpdatePassword에 리턴될것이다.

bool _toUpdatePasword(QueryResult queryResult) {
    if (queryResult.hasException) {
      throw queryResult.exception;
    }
    final bool result = queryResult.data['updatePassword'];
    return result;
  }