Search code examples
fluentvapor

Create parent entity and children and redirect request in fluent vapor


I´m trying to create an entity Task and one children using the same request object

func create(_ req: Request) throws -> Future<Response> {
    return try req.content.decode(Task.TaskForm.self).flatMap { taskForm in
        let user = try req.requireAuthenticated(User.self)
        let task = Task(name: taskForm.name, userId: user.id!)
        return task.save(on: req).map { t in
            let interval = try Interval(taskId: t.requireID())
            let t = interval.save(on: req)
            return t.save(on: req).map { _ in
                return req.redirect(to: "/dashboard")
            }
        }
    }
}

The error that I'm getting is this one:

Cannot convert return expression of type 'EventLoopFuture' to return type 'Response'.

Any ideas on what's the problem?


Solution

  • This code should work

    func create(_ req: Request) throws -> Future<Response> {
        return try req.content.decode(Task.TaskForm.self).flatMap { taskForm in
            let user = try req.requireAuthenticated(User.self)
            let task = Task(name: taskForm.name, userId: user.id!)
            return task.create(on: req).flatMap { t in
                let interval = try Interval(taskId: t.requireID())
                return interval.create(on: req).flatMap { _ in
                    return t.create(on: req).transform(to: req.redirect(to: "/dashboard"))
                    // or your previous variant
    //                return t.create(on: req).map { _ in
    //                    return req.redirect(to: "/dashboard")
    //                }
                }
            }
        }
    }
    

    There are a few things you could learn

    1. use map when you have to return non-future result
    2. use flatMap you have to return Future<> result
    3. use create instead of save when you are creating object in the db
    4. don't leave future calls without handling them like you do on line #7