Проверьте, есть ли у приложения новейшие данные, используя 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();