diff --git a/cmd/model/articles_tags.go b/cmd/model/articles_tags.go index 4cfd095..b44de77 100644 --- a/cmd/model/articles_tags.go +++ b/cmd/model/articles_tags.go @@ -6,10 +6,7 @@ import ( ) func (db *DB) WriteArticleTags(articleID int64, tagIDs []int64) error { - query := ` - INSERT INTO articles_tags (article_id, tag_id) - VALUES (?, ?) - ` + query := "INSERT INTO articles_tags (article_id, tag_id) VALUES (?, ?)" for i := 0; i < TxMaxRetries; i++ { err := func() error { @@ -68,8 +65,8 @@ func (db *DB) GetArticleTags(articleID int64) ([]*Tag, error) { } func (db *DB) UpdateArticleTags(articleID int64, tagIDs []int64) error { - query := ` - ` + deleteQuery := "DELETE FROM articles_tags WHERE article_id = ?" + insertQuery := "INSERT INTO articles_tags (article_id, tag_id) VALUES (?, ?)" for i := 0; i < TxMaxRetries; i++ { err := func() error { @@ -78,6 +75,22 @@ func (db *DB) UpdateArticleTags(articleID int64, tagIDs []int64) error { return fmt.Errorf("error starting transaction: %v", err) } + if _, err := tx.Exec(deleteQuery, articleID); err != nil { + if rollbackErr := tx.Rollback(); rollbackErr != nil { + log.Fatalf("transaction error: %v, rollback error: %v", err, rollbackErr) + } + return fmt.Errorf("error deleting entries from articles_tags before inserting new ones: %v", err) + } + + for _, tagID := range tagIDs { + if _, err := tx.Exec(insertQuery, articleID, tagID); err != nil { + if rollbackErr := tx.Rollback(); rollbackErr != nil { + log.Fatalf("transaction error: %v, rollback error: %v", err, rollbackErr) + } + return fmt.Errorf("error inserting new entries into articles_tags: %v", err) + } + } + if err = tx.Commit(); err != nil { return fmt.Errorf("error committing transaction: %v", err) } diff --git a/cmd/view/articles.go b/cmd/view/articles.go index 96a6b74..ce41633 100644 --- a/cmd/view/articles.go +++ b/cmd/view/articles.go @@ -100,7 +100,7 @@ func ResubmitArticle(db *model.DB, s *control.CookieStore) http.HandlerFunc { description := r.PostFormValue("article-description") content := r.PostFormValue("article-content") - if err := db.UpdateAttributes( + if err = db.UpdateAttributes( &model.Attribute{Table: "articles", ID: id, AttName: "title", Value: title}, &model.Attribute{Table: "articles", ID: id, AttName: "description", Value: description}, &model.Attribute{Table: "articles", ID: id, AttName: "content", Value: content}, @@ -111,6 +111,23 @@ func ResubmitArticle(db *model.DB, s *control.CookieStore) http.HandlerFunc { return } + r.ParseForm() + tags := make([]int64, 0) + for _, tag := range r.Form["tags"] { + tagID, err := strconv.ParseInt(tag, 10, 64) + if err != nil { + log.Println(err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + tags = append(tags, tagID) + } + if err = db.UpdateArticleTags(id, tags); err != nil { + log.Println(err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + session, err := s.Get(r, "cookie") if err != nil { tmpl, err := template.ParseFiles("web/templates/login.html")