#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 при сбое / создании.