Vapor 3 API: встроить Future <Model>в объект ответа - PullRequest
0 голосов
/ 22 октября 2018

Предположим, у меня есть модель с именем Estimate.У меня есть Vapor 3 API, который я хочу вернуть список этих моделей, отфильтрованных по параметрам запроса.В настоящее время это возвращает Future<[Estimate]>, в результате чего API возвращает JSON, который выглядит следующим образом:

[{estimate object}, {estimate object}, ...]

Вместо этого я бы хотел, чтобы он возвращал что-то такое:

{"estimates": [{estimate object}, {estimate object}, ...]}

То же самое, что и раньше, но обернуто в объект JSON одним ключом, "estimates".

Согласно документации , всякий раз, когда я хочу вернуть что-то нестандартное, я должен создать для него новый тип;это говорит мне о том, что мне следует создать такой тип:

final class EstimatesResponse: Codable {
  var estimates: [Estimate]?
}

Однако после фильтрации я получаю Future<[Estimate]>, а НЕ чистый [Estimate] массив, то есть я не могу присвоить его своему EstimatesResponse estimates собственность.Кажется странным, чтобы тип estimates был Future<[Estimate]>, и я не уверен, как это получится.

Как тогда я могу вернуть JSON правильного формата?

1 Ответ

0 голосов
/ 22 октября 2018

Во-первых, вам нужно создать объект Codable, я предпочитаю struct, как показано ниже.Необходимо реализовать протокол Содержимое для маршрутизации.

struct EstimatesResponse: Codable {
  var estimates: [Estimate]
 }

 extension EstimatesResponse: Content { } 

Я предположил, что вы используете контроллер, а внутри контроллера вы можете использовать следующий псевдокод.Настройте код так, чтобы val было Future <[Estimate]> , затем используйте flatmap / map , чтобы получить [Estimate] .

func  getEstimates(_ req: Request) throws -> Future<EstimatesResponse> {
        let val = Estimate.query(on: req).all()
        return val.flatMap { model in
            let all = EstimatesResponse(estimates: model)
            return Future.map(on: req) {return all }
        }
    }
...