在Swift Vapor框架中链接两个未来

4c8rllxm  于 2022-12-22  发布在  Swift
关注(0)|答案(1)|浏览(116)

我有一个函数,在注册过程中检查用户名是否已经存在于数据库中(REST API)。如果用户名已经存在,则会显示一个漂亮的错误消息。现在我想为电子邮件添加相同的检查,带有一个漂亮的错误消息,并检查用户名和电子邮件是否都已经存在,同样带有它自己的漂亮的错误消息。
我没有太多的异步编码经验,我不明白如何链两个未来。
主要功能如下:

fileprivate func create(req: Request) throws -> EventLoopFuture<NewSession> {
        try UserSignup.validate(content: req)
        let userSignup = try req.content.decode(UserSignup.self)
        let user = try User.create(from: userSignup)
        var token: Token!
        
        return checkIfUserExists(userSignup.username, req: req).flatMap { exists in
            guard !exists else {
                return req.eventLoop.future(error: UserError.usernameTaken)
            }
            return user.save(on: req.db)
        }.flatMap {
            guard let newToken = try? user.createToken(source: .signup) else {
                return req.eventLoop.future(error: Abort(.internalServerError))
            }
            token = newToken
            
            return token.save(on: req.db)
        }.flatMapThrowing {
            NewSession(token: token.value, user: try user.asPublic())
        }
    }

这是checkIfUserExists函数:

private func checkIfUserExists(_ username: String, req: Request) -> EventLoopFuture<Bool> {
        User.query(on: req.db)
            .filter(\.$username == username)
            .first()
            .map { $0 != nil }
    }

这是checkIfEmailExists函数:

private func checkIfEmailExists(_ email: String, req: Request) -> EventLoopFuture<Bool> {
        User.query(on: req.db)
            .filter(\.$email == email)
            .first()
            .map { $0 != nil }
    }

我试过if-else,试过.add()和其他奇怪的东西,但我不能让它工作。而且我需要保持这种语法,而不是使用async/await语法。

6l7fqoea

6l7fqoea1#

修改查询以包含group

query.group(.or) { group in
    group.filter(\User.$username == username).filter(\User.$email == email)
}

相关问题