Есть ли способ проверить, существует ли запись?

#vapor-fluent

#vapor-fluent

Вопрос:

Я использую внешнюю систему аутентификации для аутентификации пользователей. Но я хочу получить результаты из этой внешней системы и создать запись для пользователей, которая успешно проходит аутентификацию и которой еще нет в моей локальной базе данных.

Я написал пользовательское промежуточное программное обеспечение для внешней системы аутентификации, которая работает, но я не могу понять, как проверить, существует ли пользователь уже в моей текущей БД. В настоящее время я использую FluentSQLite в качестве резервной базы данных.

 let creds = returnFromExternalAuth()
// creds = ["id": "1", "emailAdress": "blah@blah.com", "firstName": "Test", "lastname": "User"]

let user = User.query(on: request).filter(.ID == id).first()
// returns EventLoopFuture<User?>

  

То, что я хотел бы сделать, это что-то вроде

 if let user = try User.query(on: request).filter(.ID == id).first(){

// Return the found DB user
return User.query(on: request).filter(.ID == id).first()

} else {

// create db entry for user
// Query and return the newly created DB object
return User.query(on: request).filter(.ID == id).first() 

}
  

Это не работает с .first(), поскольку он не возвращает необязательный.

Заранее спасибо за любую помощь, идеи или предложения.

Дерек

Ответ №1:

Обновить:

Я думаю, что у меня получилось, вот решения для всех, кто заинтересован.

 return User.query(on: request).filter(User.ID == id).first().flatMap { optional in
   if let _ = optional {
      return User.query(on: request).filter(User.ID == id).first()
   } else {
      _ = User(ID: creds["id"], emailAddress: creds["emailAddress"], firstName: creds["firstName"], lastName: creds["lastName"]).save(on: request)
      return User.query(on: request).filter(.ID == id).first()
   }
}
  

Комментарии:

1. Я думаю, что это привело бы к выполнению запросов дважды?

2. Да, это было бы. После работы с fluent намного больше, я думаю, не вернул бы User.query. Я бы swift if let returnUser = optional { request.future(returnUser) } else { return User(...).save().flatMap { ... } } уменьшил количество запросов до 1 при успешном выполнении и 2 при сбое / создании.