Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

getGame #76

Merged
merged 2 commits into from
Sep 7, 2024
Merged

getGame #76

merged 2 commits into from
Sep 7, 2024

Conversation

jarrod-lowe
Copy link
Owner

No description provided.

Copy link

codacy-production bot commented Sep 7, 2024

Coverage summary from Codacy

See diff coverage on Codacy

Coverage variation Diff coverage
-26.51% 65.20%
Coverage variation details
Coverable lines Covered lines Coverage
Common ancestor commit (9e0d8b5) 96 96 100.00%
Head commit (5c4baa4) 332 (+236) 244 (+148) 73.49% (-26.51%)

Coverage variation is the difference between the coverage for the head and common ancestor commits of the pull request branch: <coverage of head commit> - <coverage of common ancestor commit>

Diff coverage details
Coverable lines Covered lines Diff coverage
Pull request (#76) 204 133 65.20%

Diff coverage is the percentage of lines that are covered by tests out of the coverable lines that the pull request added or modified: <covered lines added or modified>/<coverable lines added or modified> * 100%

See your quality gate settings    Change summary preferences

Codacy stopped sending the deprecated coverage status on June 5th, 2024. Learn more

Copy link

github-actions bot commented Sep 7, 2024

Terraform plan in terraform/environment/wildsea
With backend config: bucket=terraform-state-021891603679 key=primary/terraform.tfstate region=ap-southeast-2

With variables

environment       = "primary"
saml_metadata_url = (sensitive value)
Plan: 3 to add, 3 to change, 1 to destroy.
Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
+   create
!~  update in-place
-   destroy

Terraform will perform the following actions:

  # module.wildsea.aws_appsync_function.function["fnCheckGameAccess"] will be created
+   resource "aws_appsync_function" "function" {
+       api_id           = "**************************"
+       arn              = (known after apply)
+       code             = <<-EOT
            // function/fnCheckGameAccess/appsync.ts
            import { util } from "@aws-appsync/utils";
            function request(context) {
              if (!context.identity) {
                util.error("Unauthorized: Identity information is missing.");
              }
              const identity = context.identity;
              if (!identity.sub) {
                util.error("Unauthorized: User ID is missing.");
              }
              const id = context.arguments.id;
              const key = {
                PK: "GAME#" + id,
                SK: "GAME"
              };
              return {
                operation: "GetItem",
                key: util.dynamodb.toMapValues(key)
              };
            }
            function response(context) {
              if (context.error) {
                util.appendError(context.error.message, context.error.type, context.result);
                return;
              }
              const identity = context.identity;
              if (!identity.sub) {
                util.appendError("Unauthorized: User ID is missing.");
                return;
              }
              if (!permitted(identity, context.result)) {
                util.appendError(
                  "Unauthorized: User does not have access to the game."
                );
                return;
              }
              return context.result;
            }
            function permitted(identity, data) {
              if (data === null) {
                return false;
              }
              if (data.fireflyUserId === identity.sub) {
                return true;
              }
              if (data.players) {
                for (const player of data.players) {
                  if (player === identity.sub) {
                    return true;
                  }
                }
              }
              return false;
            }
            export {
              permitted,
              request,
              response
            };
            //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiYXBwc3luYy50cyJdLAogICJtYXBwaW5ncyI6ICI7QUFBQSxTQUFTLFlBQTZDO0FBSy9DLFNBQVMsUUFDZCxTQUN3QjtBQUN4QixNQUFJLENBQUMsUUFBUSxVQUFVO0FBQ3JCLFNBQUssTUFBTSxnREFBMEQ7QUFBQSxFQUN2RTtBQUVBLFFBQU0sV0FBVyxRQUFRO0FBQ3pCLE1BQUksQ0FBQyxTQUFTLEtBQUs7QUFDakIsU0FBSyxNQUFNLG1DQUE2QztBQUFBLEVBQzFEO0FBRUEsUUFBTSxLQUFLLFFBQVEsVUFBVTtBQUM3QixRQUFNLE1BQU07QUFBQSxJQUNWLElBQUksVUFBVTtBQUFBLElBQ2QsSUFBSTtBQUFBLEVBQ047QUFFQSxTQUFPO0FBQUEsSUFDTCxXQUFXO0FBQUEsSUFDWCxLQUFLLEtBQUssU0FBUyxZQUFZLEdBQUc7QUFBQSxFQUNwQztBQUNGO0FBVU8sU0FBUyxTQUFTLFNBQWdEO0FBQ3ZFLE1BQUksUUFBUSxPQUFPO0FBQ2pCLFNBQUssWUFBWSxRQUFRLE1BQU0sU0FBUyxRQUFRLE1BQU0sTUFBTSxRQUFRLE1BQU07QUFDMUU7QUFBQSxFQUNGO0FBRUEsUUFBTSxXQUFXLFFBQVE7QUFDekIsTUFBSSxDQUFDLFNBQVMsS0FBSztBQUNqQixTQUFLLFlBQVksbUNBQTZDO0FBQzlEO0FBQUEsRUFDRjtBQUVBLE1BQUksQ0FBQyxVQUFVLFVBQVUsUUFBUSxNQUFNLEdBQUc7QUFDeEMsU0FBSztBQUFBLE1BQ0g7QUFBQSxJQUNGO0FBQ0E7QUFBQSxFQUNGO0FBRUEsU0FBTyxRQUFRO0FBQ2pCO0FBRU8sU0FBUyxVQUNkLFVBQ0EsTUFDUztBQUNULE1BQUksU0FBUyxNQUFNO0FBQ2pCLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSSxLQUFLLGtCQUFrQixTQUFTLEtBQUs7QUFDdkMsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLEtBQUssU0FBUztBQUNoQixlQUFXLFVBQVUsS0FBSyxTQUFTO0FBQ2pDLFVBQUksV0FBVyxTQUFTLEtBQUs7QUFDM0IsZUFBTztBQUFBLE1BQ1Q7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFtdCn0K
        EOT
+       data_source      = "Wildsea_primary"
+       function_id      = (known after apply)
+       function_version = (known after apply)
+       id               = (known after apply)
+       name             = "fnCheckGameAccess"

+       runtime {
+           name            = "APPSYNC_JS"
+           runtime_version = "1.0.0"
        }
    }

  # module.wildsea.aws_appsync_function.function["fnGetGame"] will be created
+   resource "aws_appsync_function" "function" {
+       api_id           = "**************************"
+       arn              = (known after apply)
+       code             = <<-EOT
            // function/fnGetGame/appsync.ts
            import { util } from "@aws-appsync/utils";
            
            // lib/constants.ts
            var TypeGame = "GAME";
            var TypeCharacter = "CHARACTER";
            var TypeSection = "SECTION";
            var TypeFirefly = "FIREFLY";
            
            // function/fnGetGame/appsync.ts
            function request(context) {
              validateIdentity(context);
              return buildDynamoDBQuery(context.arguments.id);
            }
            function validateIdentity(context) {
              if (!context.identity) {
                util.error("Unauthorized: Identity information is missing.");
              }
              const identity = context.identity;
              if (!identity.sub) {
                util.error("Unauthorized: User ID is missing.");
              }
            }
            function buildDynamoDBQuery(id) {
              const pk = "GAME#" + id;
              const expr = {
                expression: "#pk = :pk",
                expressionNames: {
                  "#pk": "PK"
                },
                expressionValues: {
                  ":pk": { S: pk }
                }
              };
              return {
                operation: "Query",
                query: expr
              };
            }
            function response(context) {
              validateResponse(context);
              validateIdentity(context);
              const identity = context.identity;
              const sheets = buildPlayerSheets(context.result.items);
              const game = findAndBuildGame(context.result.items, identity.sub);
              addSheetsToGame(game, sheets);
              return game;
            }
            function validateResponse(context) {
              if (context.error) {
                util.error(context.error.message, context.error.type, context.result);
              }
              if (!context.result?.items?.length) {
                util.error("Game not found");
              }
            }
            function buildPlayerSheets(items) {
              const sheets = {};
              items.forEach((data) => {
                if (data.type === TypeCharacter || data.type === TypeFirefly) {
                  const sheet = makeCharacterSheetData(data);
                  sheets[sheet.userId] = sheet;
                } else if (data.type === TypeSection) {
                  addSectionToSheet(sheets, data);
                } else if (data.type != TypeGame) {
                  util.error("Unknown type: " + data.type);
                }
              });
              return sheets;
            }
            function addSectionToSheet(sheets, data) {
              const section = makeSheetSection(data);
              const sheet = sheets[section.userId];
              if (sheet === void 0) {
                util.error("Sheet not found");
              }
              sheet.sections.push(section);
            }
            function findAndBuildGame(items, sub) {
              const gameData = items.find((data) => data.type === TypeGame);
              if (!gameData) {
                util.error("Game record not found");
              }
              return makeGameData(gameData, sub);
            }
            function addSheetsToGame(game, sheets) {
              const userIds = Object.keys(sheets).sort();
              userIds.forEach((userId) => {
                game.playerSheets.push(sheets[userId]);
              });
            }
            function makeGameData(data, sub) {
              let joinToken = null;
              if (data.fireflyUserId == sub) {
                joinToken = data.joinToken;
              }
              return {
                gameId: data.gameId,
                gameName: data.gameName,
                gameDescription: data.gameDescription,
                publicNotes: data.publicNotes,
                playerSheets: [],
                joinToken,
                createdAt: data.createdAt,
                updatedAt: data.updatedAt,
                type: data.type
              };
            }
            function makeCharacterSheetData(data) {
              return {
                userId: data.userId,
                gameId: data.gameId,
                characterName: data.characterName,
                createdAt: data.createdAt,
                updatedAt: data.updatedAt,
                type: data.type,
                sections: []
              };
            }
            function makeSheetSection(data) {
              return {
                userId: data.userId,
                gameId: data.gameId,
                createdAt: data.createdAt,
                updatedAt: data.updatedAt,
                type: data.type
              };
            }
            export {
              makeCharacterSheetData,
              makeGameData,
              makeSheetSection,
              request,
              response
            };
            //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiYXBwc3luYy50cyIsICIuLi8uLi9saWIvY29uc3RhbnRzLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFBLFNBQVMsWUFBNkM7OztBQ0EvQyxJQUFNLFdBQVc7QUFDakIsSUFBTSxnQkFBZ0I7QUFDdEIsSUFBTSxjQUFjO0FBQ3BCLElBQU0sY0FBYzs7O0FEcUJwQixTQUFTLFFBQ2QsU0FDc0I7QUFDdEIsbUJBQWlCLE9BQU87QUFDeEIsU0FBTyxtQkFBbUIsUUFBUSxVQUFVLEVBQUU7QUFDaEQ7QUFFQSxTQUFTLGlCQUFpQixTQUEwQztBQUNsRSxNQUFJLENBQUMsUUFBUSxVQUFVO0FBQ3JCLFNBQUssTUFBTSxnREFBMEQ7QUFBQSxFQUN2RTtBQUVBLFFBQU0sV0FBVyxRQUFRO0FBQ3pCLE1BQUksQ0FBQyxTQUFTLEtBQUs7QUFDakIsU0FBSyxNQUFNLG1DQUE2QztBQUFBLEVBQzFEO0FBQ0Y7QUFFQSxTQUFTLG1CQUFtQixJQUFrQztBQUM1RCxRQUFNLEtBQUssVUFBVTtBQUNyQixRQUFNLE9BQTJCO0FBQUEsSUFDL0IsWUFBWTtBQUFBLElBQ1osaUJBQWlCO0FBQUEsTUFDZixPQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0Esa0JBQWtCO0FBQUEsTUFDaEIsT0FBTyxFQUFFLEdBQUcsR0FBRztBQUFBLElBQ2pCO0FBQUEsRUFDRjtBQUNBLFNBQU87QUFBQSxJQUNMLFdBQVc7QUFBQSxJQUNYLE9BQU87QUFBQSxFQUNUO0FBQ0Y7QUFVTyxTQUFTLFNBQVMsU0FBNEM7QUFDbkUsbUJBQWlCLE9BQU87QUFDeEIsbUJBQWlCLE9BQU87QUFFeEIsUUFBTSxXQUFXLFFBQVE7QUFDekIsUUFBTSxTQUFTLGtCQUFrQixRQUFRLE9BQU8sS0FBSztBQUNyRCxRQUFNLE9BQU8saUJBQWlCLFFBQVEsT0FBTyxPQUFPLFNBQVMsR0FBRztBQUVoRSxrQkFBZ0IsTUFBTSxNQUFNO0FBQzVCLFNBQU87QUFDVDtBQUVBLFNBQVMsaUJBQWlCLFNBQWdDO0FBQ3hELE1B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
        EOT
+       data_source      = "Wildsea_primary"
+       function_id      = (known after apply)
+       function_version = (known after apply)
+       id               = (known after apply)
+       name             = "fnGetGame"

+       runtime {
+           name            = "APPSYNC_JS"
+           runtime_version = "1.0.0"
        }
    }

  # module.wildsea.aws_appsync_function.function["fnJoinGame"] will be updated in-place
!~  resource "aws_appsync_function" "function" {
!~      code                      = <<-EOT
            // function/fnJoinGame/appsync.ts
            import { util } from "@aws-appsync/utils";
            
            // environment.json
            var environment_default = { name: "primary" };
            
          + // lib/constants.ts
          + var TypeCharacter = "CHARACTER";
          + var DefaultPlayerCharacterName = "Unnamed Character";
          + 
            // function/fnJoinGame/appsync.ts
            function request(context) {
              if (!context.identity) {
                util.error("Unauthorized: Identity information is missing.");
              }
              const identity = context.identity;
              if (!identity.sub) {
                util.error("Unauthorized: User ID is missing.");
              }
              const id = context.arguments.input.gameId;
              const timestamp = util.time.nowISO8601();
              const gameItem = {
                operation: "UpdateItem",
                table: "Wildsea-" + environment_default.name,
                key: util.dynamodb.toMapValues({
                  PK: "GAME#" + id,
                  SK: "GAME"
                }),
                update: {
                  expression: "ADD #players :player SET #updatedAt = :updatedAt",
                  expressionNames: {
                    "#players": "players",
                    "#updatedAt": "updatedAt"
                  },
                  expressionValues: {
                    ":player": { SS: [identity.sub] },
                    ":updatedAt": { S: timestamp }
                  }
                }
              };
              const playerItem = {
                operation: "PutItem",
                table: "Wildsea-" + environment_default.name,
                key: util.dynamodb.toMapValues({
                  PK: "GAME#" + id,
                  SK: "PLAYER#PC#" + identity.sub
                }),
                attributeValues: util.dynamodb.toMapValues({
                  gameId: id,
                  userId: identity.sub,
                  GSI1PK: "USER#" + identity.sub,
                  gameName: context.prev.result.gameName,
                  gameDescription: context.prev.result.gameDescription,
          -       characterName: "Unnamed Character",
          -       type: "CHARACTER",
          +       characterName: DefaultPlayerCharacterName,
          +       type: TypeCharacter,
                  createdAt: timestamp,
                  updatedAt: timestamp
                })
              };
              return {
                operation: "TransactWriteItems",
                transactItems: [gameItem, playerItem]
              };
            }
            function response(context) {
              if (context.error) {
                util.error(context.error.message, context.error.type, context.result);
              }
              context.prev.result.joinToken = null;
              return context.prev.result;
            }
            export {
              request,
              response
            };
          - //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiYXBwc3luYy50cyIsICIuLi8uLi9lbnZpcm9ubWVudC5qc29uIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFBLFNBQVMsWUFBNkM7OztBQ0F0RCw0QkFBQyxNQUFPLFVBQVM7OztBREtWLFNBQVMsUUFBUSxTQUFxRDtBQUMzRSxNQUFJLENBQUMsUUFBUSxVQUFVO0FBQ3JCLFNBQUssTUFBTSxnREFBMEQ7QUFBQSxFQUN2RTtBQUVBLFFBQU0sV0FBVyxRQUFRO0FBQ3pCLE1BQUksQ0FBQyxTQUFTLEtBQUs7QUFDakIsU0FBSyxNQUFNLG1DQUE2QztBQUFBLEVBQzFEO0FBRUEsUUFBTSxLQUFLLFFBQVEsVUFBVSxNQUFNO0FBQ25DLFFBQU0sWUFBWSxLQUFLLEtBQUssV0FBVztBQUV2QyxRQUFNLFdBQVc7QUFBQSxJQUNmLFdBQVc7QUFBQSxJQUNYLE9BQU8sYUFBYSxvQkFBWTtBQUFBLElBQ2hDLEtBQUssS0FBSyxTQUFTLFlBQVk7QUFBQSxNQUM3QixJQUFJLFVBQVU7QUFBQSxNQUNkLElBQUk7QUFBQSxJQUNOLENBQUM7QUFBQSxJQUNELFFBQVE7QUFBQSxNQUNOLFlBQVk7QUFBQSxNQUNaLGlCQUFpQjtBQUFBLFFBQ2YsWUFBWTtBQUFBLFFBQ1osY0FBYztBQUFBLE1BQ2hCO0FBQUEsTUFDQSxrQkFBa0I7QUFBQSxRQUNoQixXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFO0FBQUEsUUFDaEMsY0FBYyxFQUFFLEdBQUcsVUFBVTtBQUFBLE1BQy9CO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxRQUFNLGFBQWE7QUFBQSxJQUNqQixXQUFXO0FBQUEsSUFDWCxPQUFPLGFBQWEsb0JBQVk7QUFBQSxJQUNoQyxLQUFLLEtBQUssU0FBUyxZQUFZO0FBQUEsTUFDN0IsSUFBSSxVQUFVO0FBQUEsTUFDZCxJQUFJLGVBQWUsU0FBUztBQUFBLElBQzlCLENBQUM7QUFBQSxJQUNELGlCQUFpQixLQUFLLFNBQVMsWUFBWTtBQUFBLE1BQ3pDLFFBQVE7QUFBQSxNQUNSLFFBQVEsU0FBUztBQUFBLE1BQ2pCLFFBQVEsVUFBVSxTQUFTO0FBQUEsTUFDM0IsVUFBVSxRQUFRLEtBQUssT0FBTztBQUFBLE1BQzlCLGlCQUFpQixRQUFRLEtBQUssT0FBTztBQUFBLE1BQ3JDLGVBQWU7QUFBQSxNQUNmLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLFdBQVc7QUFBQSxJQUNiLENBQUM7QUFBQSxFQUNIO0FBRUEsU0FBTztBQUFBLElBQ0wsV0FBVztBQUFBLElBQ1gsZUFBZSxDQUFDLFVBQVUsVUFBVTtBQUFBLEVBQ3RDO0FBQ0Y7QUFFTyxTQUFTLFNBQ2QsU0FDa0I7QUFDbEIsTUFBSSxRQUFRLE9BQU87QUFDakIsU0FBSyxNQUFNLFFBQVEsTUFBTSxTQUFTLFFBQVEsTUFBTSxNQUFNLFFBQVEsTUFBTTtBQUFBLEVBQ3RFO0FBRUEsVUFBUSxLQUFLLE9BQU8sWUFBWTtBQUNoQyxTQUFPLFFBQVEsS0FBSztBQUN0QjsiLAogICJuYW1lcyI6IFtdCn0K
          + //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiYXBwc3luYy50cyIsICIuLi8uLi9lbnZpcm9ubWVudC5qc29uIiwgIi4uLy4uL2xpYi9jb25zdGFudHMudHMiXSwKICAibWFwcGluZ3MiOiAiO0FBQUEsU0FBUyxZQUE2Qzs7O0FDQXRELDRCQUFDLE1BQU8sVUFBUzs7O0FDQ1YsSUFBTSxnQkFBZ0I7QUFLdEIsSUFBTSw2QkFBNkI7OztBRkFuQyxTQUFTLFFBQVEsU0FBcUQ7QUFDM0UsTUFBSSxDQUFDLFFBQVEsVUFBVTtBQUNyQixTQUFLLE1BQU0sZ0RBQTBEO0FBQUEsRUFDdkU7QUFFQSxRQUFNLFdBQVcsUUFBUTtBQUN6QixNQUFJLENBQUMsU0FBUyxLQUFLO0FBQ2pCLFNBQUssTUFBTSxtQ0FBNkM7QUFBQSxFQUMxRDtBQUVBLFFBQU0sS0FBSyxRQUFRLFVBQVUsTUFBTTtBQUNuQyxRQUFNLFlBQVksS0FBSyxLQUFLLFdBQVc7QUFFdkMsUUFBTSxXQUFXO0FBQUEsSUFDZixXQUFXO0FBQUEsSUFDWCxPQUFPLGFBQWEsb0JBQVk7QUFBQSxJQUNoQyxLQUFLLEtBQUssU0FBUyxZQUFZO0FBQUEsTUFDN0IsSUFBSSxVQUFVO0FBQUEsTUFDZCxJQUFJO0FBQUEsSUFDTixDQUFDO0FBQUEsSUFDRCxRQUFRO0FBQUEsTUFDTixZQUFZO0FBQUEsTUFDWixpQkFBaUI7QUFBQSxRQUNmLFlBQVk7QUFBQSxRQUNaLGNBQWM7QUFBQSxNQUNoQjtBQUFBLE1BQ0Esa0JBQWtCO0FBQUEsUUFDaEIsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRTtBQUFBLFFBQ2hDLGNBQWMsRUFBRSxHQUFHLFVBQVU7QUFBQSxNQUMvQjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsUUFBTSxhQUFhO0FBQUEsSUFDakIsV0FBVztBQUFBLElBQ1gsT0FBTyxhQUFhLG9CQUFZO0FBQUEsSUFDaEMsS0FBSyxLQUFLLFNBQVMsWUFBWTtBQUFBLE1BQzdCLElBQUksVUFBVTtBQUFBLE1BQ2QsSUFBSSxlQUFlLFNBQVM7QUFBQSxJQUM5QixDQUFDO0FBQUEsSUFDRCxpQkFBaUIsS0FBSyxTQUFTLFlBQVk7QUFBQSxNQUN6QyxRQUFRO0FBQUEsTUFDUixRQUFRLFNBQVM7QUFBQSxNQUNqQixRQUFRLFVBQVUsU0FBUztBQUFBLE1BQzNCLFVBQVUsUUFBUSxLQUFLLE9BQU87QUFBQSxNQUM5QixpQkFBaUIsUUFBUSxLQUFLLE9BQU87QUFBQSxNQUNyQyxlQUFlO0FBQUEsTUFDZixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxXQUFXO0FBQUEsSUFDYixDQUFDO0FBQUEsRUFDSDtBQUVBLFNBQU87QUFBQSxJQUNMLFdBQVc7QUFBQSxJQUNYLGVBQWUsQ0FBQyxVQUFVLFVBQVU7QUFBQSxFQUN0QztBQUNGO0FBRU8sU0FBUyxTQUNkLFNBQ2tCO0FBQ2xCLE1BQUksUUFBUSxPQUFPO0FBQ2pCLFNBQUssTUFBTSxRQUFRLE1BQU0sU0FBUyxRQUFRLE1BQU0sTUFBTSxRQUFRLE1BQU07QUFBQSxFQUN0RTtBQUVBLFVBQVEsS0FBSyxPQUFPLFlBQVk7QUFDaEMsU0FBTyxRQUFRLEtBQUs7QUFDdEI7IiwKICAibmFtZXMiOiBbXQp9Cg==
        EOT
        id                        = "tfiz6mnf2nhyzpzkwm554sir5q-ivdn34xr4jb53adwa6nj6ix7rm"
        name                      = "fnJoinGame"
#        (9 unchanged attributes hidden)

#        (1 unchanged block hidden)
    }

  # module.wildsea.aws_appsync_graphql_api.graphql will be updated in-place
!~  resource "aws_appsync_graphql_api" "graphql" {
        id                   = "tfiz6mnf2nhyzpzkwm554sir5q"
        name                 = "Wildsea-primary"
!~      schema               = <<-EOT
            scalar AWSTime
            scalar AWSDateTime
            scalar AWSTimestamp
            scalar AWSEmail
            scalar AWSJSON
            scalar AWSURL
            scalar AWSPhone
            scalar AWSIPAddress
            
            directive @aws_subscribe(mutations: [String!]!) on FIELD_DEFINITION
            directive @aws_auth(cognito_groups: [String!]!) on FIELD_DEFINITION
            directive @aws_api_key on FIELD_DEFINITION | OBJECT
            directive @aws_iam on FIELD_DEFINITION | OBJECT
            directive @aws_oidc on FIELD_DEFINITION | OBJECT
            directive @aws_cognito_user_pools(
              cognito_groups: [String!]
            ) on FIELD_DEFINITION | OBJECT
            
            type Mutation {
                createGame(input: CreateGameInput!): Game! @aws_cognito_user_pools
                joinGame(input: JoinGameInput!): Game! @aws_cognito_user_pools
            }
            
            type Query {
                getGame(id: ID!): Game! @aws_cognito_user_pools
                getGames: [PlayerSheetSummary!] @aws_cognito_user_pools
            }
            
            input CreateGameInput {
                name: String!
                description: String
            }
            
            input JoinGameInput {
              gameId: ID!
              joinToken: ID!
            }
            
            type Game @aws_cognito_user_pools {
              gameId: ID!
              gameName: String!
              gameDescription: String
              publicNotes: String
          -   fireflyUserId: ID!
          -   players: [ID!]
          +   playerSheets: [PlayerSheet!]!
              joinToken: String
              createdAt: AWSDateTime!
              updatedAt: AWSDateTime!
              type: String!
            }
            
            type PlayerSheetSummary @aws_cognito_user_pools {
              gameId: ID!
              gameName: String!
              gameDescription: String!
              type: String!
          +   createdAt: AWSDateTime!
          +   updatedAt: AWSDateTime!
            }
          + 
          + type PlayerSheet @aws_cognito_user_pools {
          +   userId: ID!
          +   gameId: ID!
          +   characterName: String!
          +   sections: [SheetSection!]!
          +   type: String!
          +   createdAt: AWSDateTime!
          +   updatedAt: AWSDateTime!
          + }
          + 
          + type SheetSection @aws_cognito_user_pools {
          +   userId: ID!
          +   gameId: ID!
          +   type: String!
          +   createdAt: AWSDateTime!
          +   updatedAt: AWSDateTime!
          + }
        EOT
        tags                 = {
            "Name" = "Wildsea-primary"
        }
#        (9 unchanged attributes hidden)

#        (2 unchanged blocks hidden)
    }

  # module.wildsea.aws_appsync_resolver.pipeline["getGame"] will be created
+   resource "aws_appsync_resolver" "pipeline" {
+       api_id            = "**************************"
+       arn               = (known after apply)
+       field             = "getGame"
+       id                = (known after apply)
+       kind              = "PIPELINE"
+       request_template  = jsonencode({})
+       response_template = "$util.toJson($ctx.result)"
+       type              = "Query"

+       pipeline_config {
+           functions = (known after apply)
        }
    }

  # module.wildsea.aws_appsync_resolver.resolver["createGame"] will be updated in-place
!~  resource "aws_appsync_resolver" "resolver" {
!~      code              = <<-EOT
            // mutation/createGame/appsync.ts
            import { util } from "@aws-appsync/utils";
            
            // environment.json
            var environment_default = { name: "primary" };
            
          + // lib/constants.ts
          + var TypeGame = "GAME";
          + var TypeFirefly = "FIREFLY";
          + var DefaultFireflyCharacterName = "Firefly";
          + 
            // mutation/createGame/appsync.ts
            function request(context) {
              if (!context.identity) {
                util.error("Unauthorized: Identity information is missing.");
              }
              const identity = context.identity;
              if (!identity.sub) {
                util.error("Unauthorized: User ID is missing.");
              }
              const input = context.arguments.input;
              const id = util.autoId();
              const joinToken = util.autoId();
              const timestamp = util.time.nowISO8601();
              context.stash.record = {
                gameName: input.name,
                gameDescription: input.description,
                gameId: id,
                fireflyUserId: identity.sub,
                // players: no value yet
                joinToken,
                createdAt: timestamp,
                updatedAt: timestamp,
          -     type: "GAME"
          +     type: TypeGame
              };
              const gameItem = {
                key: util.dynamodb.toMapValues({ PK: "GAME#" + id, SK: "GAME" }),
                operation: "PutItem",
                table: "Wildsea-" + environment_default.name,
                attributeValues: util.dynamodb.toMapValues(
                  context.stash.record
                )
              };
              const fireflyItem = {
                key: util.dynamodb.toMapValues({
                  PK: "GAME#" + id,
                  SK: "PLAYER#GM#" + identity.sub
                }),
                operation: "PutItem",
                table: "Wildsea-" + environment_default.name,
                attributeValues: util.dynamodb.toMapValues({
                  userId: identity.sub,
                  gameId: id,
                  gameName: input.name,
                  gameDescription: input.description,
          -       characterName: "Firefly",
          +       characterName: DefaultFireflyCharacterName,
                  GSI1PK: "USER#" + identity.sub,
                  createdAt: timestamp,
                  updatedAt: timestamp,
          -       type: "FIREFLY"
          +       type: TypeFirefly
                })
              };
              return {
                operation: "TransactWriteItems",
                transactItems: [gameItem, fireflyItem]
              };
            }
            function response(context) {
              if (context.error) {
                util.appendError(context.error.message, context.error.type, context.result);
                return null;
              }
              return {
          -     PK: context.result.keys[0].PK,
          -     SK: context.result.keys[0].SK,
                gameName: context.stash.record.gameName,
                gameDescription: context.stash.record.gameDescription,
                gameId: context.stash.record.gameId,
          -     fireflyUserId: context.stash.record.fireflyUserId,
          +     playerSheets: [
          +       {
          +         gameId: context.stash.record.gameId,
          +         userId: context.stash.record.fireflyUserId,
          +         characterName: DefaultFireflyCharacterName,
          +         type: TypeFirefly,
          +         sections: [],
          +         createdAt: context.stash.record.createdAt,
          +         updatedAt: context.stash.record.updatedAt
          +       }
          +     ],
                createdAt: context.stash.record.createdAt,
                updatedAt: context.stash.record.updatedAt,
                type: context.stash.record.type
              };
            }
            export {
              request,
              response
            };
          - //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiYXBwc3luYy50cyIsICIuLi8uLi9lbnZpcm9ubWVudC5qc29uIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFBLFNBQVMsWUFBNkM7OztBQ0F0RCw0QkFBQyxNQUFPLFVBQVM7OztBREtWLFNBQVMsUUFBUSxTQUF1RDtBQUM3RSxNQUFJLENBQUMsUUFBUSxVQUFVO0FBQ3JCLFNBQUssTUFBTSxnREFBMEQ7QUFBQSxFQUN2RTtBQUVBLFFBQU0sV0FBVyxRQUFRO0FBQ3pCLE1BQUksQ0FBQyxTQUFTLEtBQUs7QUFDakIsU0FBSyxNQUFNLG1DQUE2QztBQUFBLEVBQzFEO0FBRUEsUUFBTSxRQUFRLFFBQVEsVUFBVTtBQUNoQyxRQUFNLEtBQUssS0FBSyxPQUFPO0FBQ3ZCLFFBQU0sWUFBWSxLQUFLLE9BQU87QUFDOUIsUUFBTSxZQUFZLEtBQUssS0FBSyxXQUFXO0FBRXZDLFVBQVEsTUFBTSxTQUFTO0FBQUEsSUFDckIsVUFBVSxNQUFNO0FBQUEsSUFDaEIsaUJBQWlCLE1BQU07QUFBQSxJQUN2QixRQUFRO0FBQUEsSUFDUixlQUFlLFNBQVM7QUFBQTtBQUFBLElBRXhCO0FBQUEsSUFDQSxXQUFXO0FBQUEsSUFDWCxXQUFXO0FBQUEsSUFDWCxNQUFNO0FBQUEsRUFDUjtBQUVBLFFBQU0sV0FBVztBQUFBLElBQ2YsS0FBSyxLQUFLLFNBQVMsWUFBWSxFQUFFLElBQUksVUFBVSxJQUFJLElBQUksT0FBTyxDQUFDO0FBQUEsSUFDL0QsV0FBVztBQUFBLElBQ1gsT0FBTyxhQUFhLG9CQUFZO0FBQUEsSUFDaEMsaUJBQWlCLEtBQUssU0FBUztBQUFBLE1BQzdCLFFBQVEsTUFBTTtBQUFBLElBQ2hCO0FBQUEsRUFDRjtBQUVBLFFBQU0sY0FBYztBQUFBLElBQ2xCLEtBQUssS0FBSyxTQUFTLFlBQVk7QUFBQSxNQUM3QixJQUFJLFVBQVU7QUFBQSxNQUNkLElBQUksZUFBZSxTQUFTO0FBQUEsSUFDOUIsQ0FBQztBQUFBLElBQ0QsV0FBVztBQUFBLElBQ1gsT0FBTyxhQUFhLG9CQUFZO0FBQUEsSUFDaEMsaUJBQWlCLEtBQUssU0FBUyxZQUFZO0FBQUEsTUFDekMsUUFBUSxTQUFTO0FBQUEsTUFDakIsUUFBUTtBQUFBLE1BQ1IsVUFBVSxNQUFNO0FBQUEsTUFDaEIsaUJBQWlCLE1BQU07QUFBQSxNQUN2QixlQUFlO0FBQUEsTUFDZixRQUFRLFVBQVUsU0FBUztBQUFBLE1BQzNCLFdBQVc7QUFBQSxNQUNYLFdBQVc7QUFBQSxNQUNYLE1BQU07QUFBQSxJQUNSLENBQUM7QUFBQSxFQUNIO0FBRUEsU0FBTztBQUFBLElBQ0wsV0FBVztBQUFBLElBQ1gsZUFBZSxDQUFDLFVBQVUsV0FBVztBQUFBLEVBQ3ZDO0FBQ0Y7QUFFTyxTQUFTLFNBQVMsU0FBK0I7QUFDdEQsTUFBSSxRQUFRLE9BQU87QUFDakIsU0FBSyxZQUFZLFFBQVEsTUFBTSxTQUFTLFFBQVEsTUFBTSxNQUFNLFFBQVEsTUFBTTtBQUMxRSxXQUFPO0FBQUEsRUFDVDtBQUNBLFNBQU87QUFBQSxJQUNMLElBQUksUUFBUSxPQUFPLEtBQUssQ0FBQyxFQUFFO0FBQUEsSUFDM0IsSUFBSSxRQUFRLE9BQU8sS0FBSyxDQUFDLEVBQUU7QUFBQSxJQUMzQixVQUFVLFFBQVEsTUFBTSxPQUFPO0FBQUEsSUFDL0IsaUJBQWlCLFFBQVEsTUFBTSxPQUFPO0FBQUEsSUFDdEMsUUFBUSxRQUFRLE1BQU0sT0FBTztBQUFBLElBQzdCLGVBQWUsUUFBUSxNQUFNLE9BQU87QUFBQSxJQUNwQyxXQUFXLFFBQVEsTUFBTSxPQUFPO0FBQUEsSUFDaEMsV0FBVyxRQUFRLE1BQU0sT0FBTztBQUFBLElBQ2hDLE1BQU0sUUFBUSxNQUFNLE9BQU87QUFBQSxFQUM3QjtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
          + //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiYXBwc3luYy50cyIsICIuLi8uLi9lbnZpcm9ubWVudC5qc29uIiwgIi4uLy4uL2xpYi9jb25zdGFudHMudHMiXSwKICAibWFwcGluZ3MiOiAiO0FBQUEsU0FBUyxZQUE2Qzs7O0FDQXRELDRCQUFDLE1BQU8sVUFBUzs7O0FDQVYsSUFBTSxXQUFXO0FBR2pCLElBQU0sY0FBYztBQUVwQixJQUFNLDhCQUE4Qjs7O0FGS3BDLFNBQVMsUUFBUSxTQUF1RDtBQUM3RSxNQUFJLENBQUMsUUFBUSxVQUFVO0FBQ3JCLFNBQUssTUFBTSxnREFBMEQ7QUFBQSxFQUN2RTtBQUVBLFFBQU0sV0FBVyxRQUFRO0FBQ3pCLE1BQUksQ0FBQyxTQUFTLEtBQUs7QUFDakIsU0FBSyxNQUFNLG1DQUE2QztBQUFBLEVBQzFEO0FBRUEsUUFBTSxRQUFRLFFBQVEsVUFBVTtBQUNoQyxRQUFNLEtBQUssS0FBSyxPQUFPO0FBQ3ZCLFFBQU0sWUFBWSxLQUFLLE9BQU87QUFDOUIsUUFBTSxZQUFZLEtBQUssS0FBSyxXQUFXO0FBRXZDLFVBQVEsTUFBTSxTQUFTO0FBQUEsSUFDckIsVUFBVSxNQUFNO0FBQUEsSUFDaEIsaUJBQWlCLE1BQU07QUFBQSxJQUN2QixRQUFRO0FBQUEsSUFDUixlQUFlLFNBQVM7QUFBQTtBQUFBLElBRXhCO0FBQUEsSUFDQSxXQUFXO0FBQUEsSUFDWCxXQUFXO0FBQUEsSUFDWCxNQUFNO0FBQUEsRUFDUjtBQUVBLFFBQU0sV0FBVztBQUFBLElBQ2YsS0FBSyxLQUFLLFNBQVMsWUFBWSxFQUFFLElBQUksVUFBVSxJQUFJLElBQUksT0FBTyxDQUFDO0FBQUEsSUFDL0QsV0FBVztBQUFBLElBQ1gsT0FBTyxhQUFhLG9CQUFZO0FBQUEsSUFDaEMsaUJBQWlCLEtBQUssU0FBUztBQUFBLE1BQzdCLFFBQVEsTUFBTTtBQUFBLElBQ2hCO0FBQUEsRUFDRjtBQUVBLFFBQU0sY0FBYztBQUFBLElBQ2xCLEtBQUssS0FBSyxTQUFTLFlBQVk7QUFBQSxNQUM3QixJQUFJLFVBQVU7QUFBQSxNQUNkLElBQUksZUFBZSxTQUFTO0FBQUEsSUFDOUIsQ0FBQztBQUFBLElBQ0QsV0FBVztBQUFBLElBQ1gsT0FBTyxhQUFhLG9CQUFZO0FBQUEsSUFDaEMsaUJBQWlCLEtBQUssU0FBUyxZQUFZO0FBQUEsTUFDekMsUUFBUSxTQUFTO0FBQUEsTUFDakIsUUFBUTtBQUFBLE1BQ1IsVUFBVSxNQUFNO0FBQUEsTUFDaEIsaUJBQWlCLE1BQU07QUFBQSxNQUN2QixlQUFlO0FBQUEsTUFDZixRQUFRLFVBQVUsU0FBUztBQUFBLE1BQzNCLFdBQVc7QUFBQSxNQUNYLFdBQVc7QUFBQSxNQUNYLE1BQU07QUFBQSxJQUNSLENBQUM7QUFBQSxFQUNIO0FBRUEsU0FBTztBQUFBLElBQ0wsV0FBVztBQUFBLElBQ1gsZUFBZSxDQUFDLFVBQVUsV0FBVztBQUFBLEVBQ3ZDO0FBQ0Y7QUFFTyxTQUFTLFNBQVMsU0FBK0I7QUFDdEQsTUFBSSxRQUFRLE9BQU87QUFDakIsU0FBSyxZQUFZLFFBQVEsTUFBTSxTQUFTLFFBQVEsTUFBTSxNQUFNLFFBQVEsTUFBTTtBQUMxRSxXQUFPO0FBQUEsRUFDVDtBQUNBLFNBQU87QUFBQSxJQUNMLFVBQVUsUUFBUSxNQUFNLE9BQU87QUFBQSxJQUMvQixpQkFBaUIsUUFBUSxNQUFNLE9BQU87QUFBQSxJQUN0QyxRQUFRLFFBQVEsTUFBTSxPQUFPO0FBQUEsSUFDN0IsY0FBYztBQUFBLE1BQ1o7QUFBQSxRQUNFLFFBQVEsUUFBUSxNQUFNLE9BQU87QUFBQSxRQUM3QixRQUFRLFFBQVEsTUFBTSxPQUFPO0FBQUEsUUFDN0IsZUFBZTtBQUFBLFFBQ2YsTUFBTTtBQUFBLFFBQ04sVUFBVSxDQUFDO0FBQUEsUUFDWCxXQUFXLFFBQVEsTUFBTSxPQUFPO0FBQUEsUUFDaEMsV0FBVyxRQUFRLE1BQU0sT0FBTztBQUFBLE1BQ2xDO0FBQUEsSUFDRjtBQUFBLElBQ0EsV0FBVyxRQUFRLE1BQU0sT0FBTztBQUFBLElBQ2hDLFdBQVcsUUFBUSxNQUFNLE9BQU87QUFBQSxJQUNoQyxNQUFNLFFBQVEsTUFBTSxPQUFPO0FBQUEsRUFDN0I7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
        EOT
        id                = "tfiz6mnf2nhyzpzkwm554sir5q-Mutation-createGame"
#        (9 unchanged attributes hidden)

#        (1 unchanged block hidden)
    }

  # module.wildsea.aws_appsync_resolver.resolver["getGame"] will be destroyed
  # (because key ["getGame"] is not in for_each map)
-   resource "aws_appsync_resolver" "resolver" {
-       api_id            = "tfiz6mnf2nhyzpzkwm554sir5q" -> null
-       arn               = "arn:aws:appsync:ap-southeast-2:021891603679:apis/tfiz6mnf2nhyzpzkwm554sir5q/types/Query/resolvers/getGame" -> null
-       code              = <<-EOT
            // query/getGame/appsync.ts
            import { util } from "@aws-appsync/utils";
            function request(context) {
              if (!context.identity) {
                util.error("Unauthorized: Identity information is missing.");
              }
              const identity = context.identity;
              if (!identity.sub) {
                util.error("Unauthorized: User ID is missing.");
              }
              const id = context.arguments.id;
              const key = {
                PK: "GAME#" + id,
                SK: "GAME"
              };
              return {
                operation: "GetItem",
                key: util.dynamodb.toMapValues(key)
              };
            }
            function response(context) {
              if (context.error) {
                util.appendError(context.error.message, context.error.type, context.result);
                return;
              }
              const identity = context.identity;
              if (!identity.sub) {
                util.appendError("Unauthorized: User ID is missing.");
                return;
              }
              if (!permitted(identity, context.result)) {
                util.appendError(
                  "Unauthorized: User does not have access to the game."
                );
                return;
              }
              return context.result;
            }
            function permitted(identity, data) {
              if (data === null) {
                return false;
              }
              if (data.fireflyUserId === identity.sub) {
                return true;
              }
              if (data.players) {
                for (const player of data.players) {
                  if (player === identity.sub) {
                    return true;
                  }
                }
              }
              return false;
            }
            export {
              request,
              response
            };
            //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiYXBwc3luYy50cyJdLAogICJtYXBwaW5ncyI6ICI7QUFBQSxTQUFTLFlBQTZDO0FBSS9DLFNBQVMsUUFDZCxTQUN3QjtBQUN4QixNQUFJLENBQUMsUUFBUSxVQUFVO0FBQ3JCLFNBQUssTUFBTSxnREFBMEQ7QUFBQSxFQUN2RTtBQUVBLFFBQU0sV0FBVyxRQUFRO0FBQ3pCLE1BQUksQ0FBQyxTQUFTLEtBQUs7QUFDakIsU0FBSyxNQUFNLG1DQUE2QztBQUFBLEVBQzFEO0FBRUEsUUFBTSxLQUFLLFFBQVEsVUFBVTtBQUM3QixRQUFNLE1BQU07QUFBQSxJQUNWLElBQUksVUFBVTtBQUFBLElBQ2QsSUFBSTtBQUFBLEVBQ047QUFFQSxTQUFPO0FBQUEsSUFDTCxXQUFXO0FBQUEsSUFDWCxLQUFLLEtBQUssU0FBUyxZQUFZLEdBQUc7QUFBQSxFQUNwQztBQUNGO0FBRU8sU0FBUyxTQUFTLFNBQWtCO0FBQ3pDLE1BQUksUUFBUSxPQUFPO0FBQ2pCLFNBQUssWUFBWSxRQUFRLE1BQU0sU0FBUyxRQUFRLE1BQU0sTUFBTSxRQUFRLE1BQU07QUFDMUU7QUFBQSxFQUNGO0FBRUEsUUFBTSxXQUFXLFFBQVE7QUFDekIsTUFBSSxDQUFDLFNBQVMsS0FBSztBQUNqQixTQUFLLFlBQVksbUNBQTZDO0FBQzlEO0FBQUEsRUFDRjtBQUVBLE1BQUksQ0FBQyxVQUFVLFVBQVUsUUFBUSxNQUFNLEdBQUc7QUFDeEMsU0FBSztBQUFBLE1BQ0g7QUFBQSxJQUNGO0FBQ0E7QUFBQSxFQUNGO0FBRUEsU0FBTyxRQUFRO0FBQ2pCO0FBRUEsU0FBUyxVQUFVLFVBQWtDLE1BQXFCO0FBQ3hFLE1BQUksU0FBUyxNQUFNO0FBQ2pCLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSSxLQUFLLGtCQUFrQixTQUFTLEtBQUs7QUFDdkMsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLEtBQUssU0FBUztBQUNoQixlQUFXLFVBQVUsS0FBSyxTQUFTO0FBQ2pDLFVBQUksV0FBVyxTQUFTLEtBQUs7QUFDM0IsZUFBTztBQUFBLE1BQ1Q7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFtdCn0K
        EOT -> null
-       data_source       = "Wildsea_primary" -> null
-       field             = "getGame" -> null
-       id                = "tfiz6mnf2nhyzpzkwm554sir5q-Query-getGame" -> null
-       kind              = "UNIT" -> null
-       max_batch_size    = 0 -> null
-       type              = "Query" -> null
#        (2 unchanged attributes hidden)

-       runtime {
-           name            = "APPSYNC_JS" -> null
-           runtime_version = "1.0.0" -> null
        }
    }

Plan: 3 to add, 3 to change, 1 to destroy.

✅ Plan applied in Environment Main - Apply #71

Outputs
cdn_domain_name          = "d3tinvgatp7lle.cloudfront.net"
cdn_id                   = "E2KPUTZ78NDDZ6"
cognito_identity_pool_id = "ap-southeast-2:2c578a4f-3fd8-453e-860d-4fde2187c38e"
cognito_login_domain     = "wildsea-primary.auth.ap-southeast-2.amazoncognito.com"
cognito_user_pool_id     = "ap-southeast-2_mi8U4SiYJ"
cognito_web_client_id    = "1ghmru9nk0j81l040lehbgosv1"
graphql_uri              = "https://2xdx2rdnwjbyznwjz4nc54dzbi.appsync-api.ap-southeast-2.amazonaws.com/graphql"
region                   = "ap-southeast-2"
ui_bucket                = "wildsea-primary-ui"

Copy link

sonarqubecloud bot commented Sep 7, 2024

@jarrod-lowe jarrod-lowe merged commit dcf8f36 into main Sep 7, 2024
7 checks passed
@jarrod-lowe jarrod-lowe deleted the work branch September 7, 2024 04:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant