Closed33

nested model を操作する[aws-mobile-appsync-sdk-android]

tkttkt
mutation CreatePost(
  $input: CreatePostInput!
) {
  createPost(input: $input) {
    Id
    CreatedAt
    Comment {
      Id
      Message
    }
  }
}

こういうような model があった場合に、自動生成されるコードから Comment 部分、つまり nested な部分の情報が落ちる

tkttkt

外部の型を参照しているとも言うかもしれない

tkttkt

maxDepth を 10 くらいにしてみようか
(今は 3)

tkttkt

amplify statements

Missing credentials in config, if using AWS_CONFIG_FILE, set AWS_SDK_LOAD_CONFIG=1

って怒られた
key 入れ直すのはどこからやるんだろうか
aws configure は微妙に挙動が違った

tkttkt
export AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXX
export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
export AWS_DEFAULT_REGION=XXXXXXXXXXXX

環境変数で読み込ませると通った

tkttkt
amplify codegen configure

これで

? Enter maximum statement depth [increase from default if your schema is deeply nested] 10

10 にした

tkttkt
amplify codegen
# これは一応
amplify codegen types

これで、情報量は増えた。
ただ、抜けてたと思ってたところに変化はなかった

tkttkt

query は増えたけど
mutate は増えなかった

tkttkt

呼び出して予測で出るか見てみる

tkttkt

nested なところは 別で クエリ発行しないといけない…?

tkttkt

aws console で見てみても、nested な部分は input に含まれてなかった

tkttkt

CreatePostInput には Comment の記述がない
CreatePostMutation には Comment の記述がない
CreatePostMutation.CreatePost には Comment の記述がある

tkttkt

作成したい時はどうすればええんや

tkttkt

https://github.com/awslabs/aws-mobile-appsync-sdk-android/blob/d27f4c0db2b57fb7f28f2c329e492920fa1c4c84/aws-android-sdk-appsync-tests/src/androidTest/java/com/amazonaws/mobileconnectors/appsync/models/Posts.java#L59-L75

        client.mutate(
            AddPostMutation.builder()
                .input(CreatePostInput.builder()
                    .title(title)
                    .author(author)
                    .url(url)
                    .content(content)
                    .ups(1)
                    .downs(0)
                    .build()
                )
                .build(),
            new AddPostMutation.Data(new AddPostMutation.CreatePost(
                "Post", "", "", "", "", "", null, null, 0
            ))
        )
        .enqueue(callback);

これは何をやってるのか
input を渡した後に create用のmodel も渡してる

tkttkt
mutate(@Nonnull Mutation<D, T, V> mutation, @Nonnull D withOptimisticUpdates, boolean isRetry)

これか

tkttkt

builder のところで埋まっていなければ こっちで埋める的な?

tkttkt

楽観アップデートの意味的には上書きアップデートかな
ただ、わざわざそんな挙動にはしなさそう

tkttkt

ありなしで保存される中身を見てみる

tkttkt

なしの場合、当たり前だけど nest してる部分には何も入らない

tkttkt

ありでやってみたけど、なしのときと変化がない。
やり方が悪いのか何なのか

tkttkt

同じようなことをしてるコードが見つけられない

tkttkt

再現コード書いて github の issue に起票するかな…

tkttkt

schemq の input の定義を変更して

$ amplify pull --restore
$ amplify codegen

すると
android/app/src/main/graphql/schema.json
ここに更新が入って、
その状態で build したら
nested の部分の class が更新された

それを使うと nested の部分も mutate 実行できた

tkttkt
schema.json
{
    "name": "Comment",
    "description": null,
    "args": [],
    "type": {
        "kind": "OBJECT",
        "name": "Comment",
        "ofType": null
    },
    "isDeprecated": false,
    "deprecationReason": null
},

こういうのが増えてた

tkttkt
input CreatePostInput {
	Id: String!
        TimeStampMs: Float!
	Comment: CommentInput
}

appsync の schema 定義はこんな感じで書けばいけた

このスクラップは2021/03/31にクローズされました