Как получить «идентификатор» записи / строки из «элемента» в записи / строке? - PullRequest
1 голос
/ 10 апреля 2020

Создание приложения с использованием React Native (для iOS) с использованием AWS Усиление

Я хочу сделать что-то, казалось бы, такое простое, но я немного растерялся относительно того, как это сделать: у меня есть таблица с пользовательской информацией уже в нем. Вот схема:

type Users @model {
  id: ID!
  userName: String
  firstname: String
  weblink: String
  email: String
  mobileNum: String
 .
 .
 .
}


//**Here's my current Query.js**
export const getUsers = `query GetUsers($id: ID!) {
  getUsers(id: $id) {
    id
    userName
    firstname
    weblink
    email
    .
    .
    .
  }
}
`;

Эта таблица заполняется в DynamoDB, когда я проверяю консоль AWS. Что мне нужно, чтобы иметь возможность получить идентификатор из таблицы, используя userName (а не наоборот). Идентификатор генерируется при создании createUser () и используется в моем приложении для получения всей информации моего пользователя. Однако когда пользователь входит в новый телефон, этот идентификатор больше не доступен. Поэтому, когда они входят через Cognito, я знаю имя пользователя и все, что мне нужно сделать, это получить этот идентификатор. Поскольку существует только один уникальный userName , он должен возвращать только один id

. Вот что я пока думаю: используйте GSI (глобальный вторичный индекс). Поэтому измените мою схему на:

type Users @model
    @key(
       name: "ByUsername"
       fields: ["userName"]
       queryField: "getIdFromUserName"
    )  
{
  id: ID!
  userName: String
  firstname: String
  weblink: String
  email: String
  mobileNum: String
 .
 .
 .
}

Затем вызовите в моем приложении:

const data = await API.graphql(graphqlOperation(getIdFromUserName, { userName }));

5 вопросов:

1) Есть ли более простой способ, чем GSI?

2) Это как вы добавляете GSI? Или это более надежно сделать в консоли AWS?

3) Как должен выглядеть мой Запрос. js тогда?

4) Делать мне нужно сделать собственный распознаватель, или этого достаточно?

5) Я что-то пропустил, или я могу просто

amplify push  ?

//11/04/2020
//Resolver

## [Start] Prepare DynamoDB PutItem Request. **
$util.qr($context.args.input.put("createdAt", $util.defaultIfNull($ctx.args.input.createdAt, $util.time.nowISO8601())))
$util.qr($context.args.input.put("updatedAt", $util.defaultIfNull($ctx.args.input.updatedAt, $util.time.nowISO8601())))
$util.qr($context.args.input.put("__typename", "Users"))
#set( $condition = {
  "expression": "attribute_not_exists(#id)",
  "expressionNames": {
      "#id": "id"
  }
} )
#if( $context.args.condition )
  #set( $condition.expressionValues = {} )
  #set( $conditionFilterExpressions = $util.parseJson($util.transform.toDynamoDBConditionExpression($context.args.condition)) )
  $util.qr($condition.put("expression", "($condition.expression) AND $conditionFilterExpressions.expression"))
  $util.qr($condition.expressionNames.putAll($conditionFilterExpressions.expressionNames))
  $util.qr($condition.expressionValues.putAll($conditionFilterExpressions.expressionValues))
#end
#if( $condition.expressionValues && $condition.expressionValues.size() == 0 )
  #set( $condition = {
  "expression": $condition.expression,
  "expressionNames": $condition.expressionNames
} )
#end
{
  "version": "2017-02-28",
  "operation": "PutItem",
  "key": #if( $modelObjectKey ) $util.toJson($modelObjectKey) #else {
  "id":   $util.dynamodb.toDynamoDBJson($util.defaultIfNullOrBlank($ctx.args.input.id, $util.autoId()))
} #end,
  "attributeValues": $util.dynamodb.toMapValuesJson($context.args.input),
  "condition": $util.toJson($condition)
}
## [End] Prepare DynamoDB PutItem Request. **

1 Ответ

0 голосов
/ 10 апреля 2020

1) Вам не нужно создавать GSI (глобальный вторичный индекс).

2) Вы можете обновить свой преобразователь createUser, вместо использования $util.autoId() вы можете передать $ctx.args.input.userName как идентификатор

...