Краткий способ обновления модели для соответствия тела запроса со Swift?

Учитывая метод контроллера, который принимает тело запроса, которое соответствует некоторым или всем свойствам объекта в Vapor, есть ли способ обновить объект, не назначая вручную все его свойства? В настоящее время я должен сделать это:

func update(_ req: Request) throws -> Future<Mission> {
    let mission = try req.parameters.next(Mission.self)
    let content = try req.content.decode(Mission.self)

    return flatMap(to: Mission.self, mission, content) { (mission, content) in
       mission.propertyA = content.propertyA
       mission.propB = content.propB
       mission.propC = content.propC
       return mission.save(on: req)
    }
}

Это не очень масштабируемо, так как требует, чтобы я вручную назначал каждое свойство. Я ищу что-то вроде этого:

func update(_ req: Request) throws -> Future<Mission> {
    let mission = try req.parameters.next(Mission.self)
    let content = try req.content.decode(Mission.self)

    return mission.save(on: content)
}

Однако это приводит к ошибке Argument type 'EventLoopFuture<Mission>' does not conform to expected type 'DatabaseConnectable',

Какое здесь хорошее решение?

2 ответа

Эта ошибка, которую вы получаете, заключается в том, что вы пытаетесь сохранить (on: content), вам нужно сохранить запрос:

return mission.save(on: req)

При этом, что вы действительно хотите, это:

func update(_ req: Request) throws -> Future<Mission> {

    let updatedMission = try req.content.decode(Mission.self)

    return updatedMission.update(on: req)
}

Это декодирует объект Миссии, который находится в теле запроса, а затем обновляет Миссию с соответствующим идентификатором в базе данных. Поэтому убедитесь, что когда вы отправляете Mission JSON в теле, у него есть идентификатор.

С представлениями вы должны быть в состоянии сделать:

func create(req: Request) throws -> Future<Either<Mission, SubmissionValidationError>> {
    return try req.content.decode(Mission.Submission.self)
        .updateValid(on: req)
        .save(on: req)
        .promoteErrors()
}

Требуется некоторая настройка, но она гибкая и позволяет проверять введенные данные. promoteErrors функция + Either в результате помогите создать полезный ответ об ошибке, но вы можете обойтись без них.

Другие вопросы по тегам