Swift Vapor 3 вызывает роутер из другого - PullRequest
0 голосов
/ 12 марта 2020

У меня есть серверное приложение с Vapor 3, я настроил три модели Book, Author, Publisher, относительные маршрутизаторы и контроллеры с CRUD и связями (у Author и Publisher есть родственные отношения с книгой). Все было бы хорошо, если бы не входящие данные: Json, который я получаю, имеет другую структуру данных, где издатели и авторы хранятся в массивах внутри книги.

Я не могу декодировать в Book.self, потому что Я бы потерял данные, относящиеся к издателям и авторам, поэтому я создал BookTotal, который не представлен в базе данных (нет миграции), поэтому я мог бы

req.content.decode(BookTotal.self).flatMap

На этом этапе я бы нравится вызывать функции сохранения или обновления на контроллерах Publisher и Author, передавая массив BookTotal.Publisher и BookTotal.Author.

Но пока я могу получить доступ к методам с помощью чего-то вроде

`PublisherController.Save()`

Или

    let client = req.make(Client.self)
    let response = client(“path/for/the/router”)

Я не знаю, как передать им данные. Методы CRUD внутри контроллеров имеют параметр Request в качестве параметра, но я не знаю, как его создать.

let newReq = Request()
newReq.content = BookTotal.Author

Было бы моим предположением, но Request хочет контейнер, а я не знаю, как я должен go об этом. Я искал вокруг, но не смог найти ни одного примера / учебника по этому вопросу. Я даже на правильном пути с этим?

1 Ответ

1 голос
/ 13 марта 2020

Итак, у вас есть несколько вариантов для достижения того, что вы хотите сделать. Один из вариантов - переписать ваши обработчики запросов в контроллерах, чтобы они принимали эти данные, используя одну из вспомогательных функций. Так что

func savePublisher(_ req: Request, data: Publisher) throws -> Future<Publisher>

Затем вы можете изменить router.post("your", "url", use: savePublisher) на router.post(Publisher.self, at: "your", "url", use: savePublisher). Затем, если ваш код, вы можете вызвать этот метод и передать данные по мере необходимости.

(потенциально) лучшим способом было бы извлечь код, который сохраняет издателя в отдельную функцию, которую вы затем можете вызвать из ваш savePublisher маршрут и ваш bookTotal маршрут. Для базовых c маршрутов это, вероятно, будет то же самое, что и первый вариант, но для большинства сложных маршрутов это путь к go.

...