Проверьте, есть ли у приложения новейшие данные, используя Vapor 3

Я делаю форму для добавления вопросов в викторину, используя Vapor 3.

Что я хочу сделать, это:

  • отправить вопрос в таблицу "Вопрос" в базе данных (готово)
  • обновить вторую таблицу с "версией БД" одновременно / сразу после

Форма представлена ​​с листа

<form action="/save" method="POST" class="form-horizontal" enctype="multipart/form-data" id="upload-form">

И использует Vapor Route для запуска метода создания

func create(_ req: Request) throws -> Future<Response> {

    return try req.content.decode(ImageUpload.self).flatMap { image in

        if image.image?.filename != "", let img = image.image {

            let uploadDir = try req.sharedContainer.make(DirectoryConfig.self).workDir + "Public/Uploads/"

            let uploadURL = URL(fileURLWithPath: uploadDir + img.filename)
            try image.image?.data.write(to: uploadURL)

        }

        return try req.content.decode(Question.self).flatMap { question in

            if image.image?.filename != "", let img = image.image{
                question.imageName = img.filename
            }

            question.timestamp = Date()

            return question.save(on: req).map { _ in
                return req.redirect(to: "/dbVersion")
            }
        }

    }

И метод обновления

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



    return try req.parameters.next(Question.self).flatMap { question in
        return try req.content.decode(questionForm.self).flatMap { questionForm in
            question.questionText = questionForm.questionText
            question.answers[0] = questionForm.alt0
            question.answers[1] = questionForm.alt1
            question.answers[2] = questionForm.alt2
            question.answers[3] = questionForm.alt3
            question.theme = questionForm.theme
            question.subject = questionForm.subject
            question.timestamp = Date()

            return question.save(on: req).map { _ in
                return req.redirect(to: "/form")
            }
        }
    }
}

Как я могу запустить обновление / создание версии БД внутри этих методов?

Или я могу просто запустить их последовательно, на одном действии?:

protectedRouter.post("save", use: questionController.create)
protectedRouter.post("save", use: databaseController.create)

1 ответ

Спасибо за обновление. Это не совсем Vapor-подход, но я бы сказал, что он, вероятно, самый чистый / простой. Хотя я не совсем уверен, по какой причине вам нужно делать это вообще или какую пользу это дает?:). Я бы создал вторую таблицу, как у вас, но использовал бы триггер базы данных. Таким образом, каждый раз, когда обновляется строка, вы можете "запустить" обновление во второй таблице. Вот соответствующие документы, вот некоторый непроверенный код. Если это не сработает, найдите меня в Vapor Discourse, и я могу помочь, если вы выберете этот подход.

CREATE TABLE questions (
    question text,
    ...
);

CREATE TABLE db_version (
    id serial,
    db_version_date timestamp
);

CREATE FUNCTION update_version() RETURNS trigger AS $update_version$
    BEGIN

        INSERT INTO db_version SELECT now() ;
        RETURN NULL; -- result is ignored since this is an AFTER trigger
    END;

$update_version$ LANGUAGE plpgsql;

CREATE TRIGGER update_version AFTER INSERT OR UPDATE OR DELETE ON questions
    FOR EACH ROW EXECUTE PROCEDURE update_version();
Другие вопросы по тегам