Есть ли способ проверить, существует ли запись? - PullRequest
1 голос
/ 24 апреля 2019

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

Я написал специальное промежуточное программное обеспечение для внешней системы аутентификации, которая работает, но я не могу понять, как проверить, существует ли пользователь в моей текущей БД. В настоящее время я использую 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 (), поскольку не возвращает Optional.

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

Derek

1 Ответ

1 голос
/ 24 апреля 2019

Обновление:

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

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()
   }
}
...