Browse Source

Update category with parent chaging

Vova Tkach 6 years ago
parent
commit
861cf0509d
1 changed files with 112 additions and 14 deletions
  1. 112 14
      modules/module_blog_categories.go

+ 112 - 14
modules/module_blog_categories.go

@@ -130,19 +130,117 @@ func (this *Modules) blog_ActionCategoryAdd(wrap *wrapper.Wrapper, pf_id, pf_nam
 }
 
 func (this *Modules) blog_ActionCategoryUpdate(wrap *wrapper.Wrapper, pf_id, pf_name, pf_alias, pf_parent string) error {
-	// TODO: add parent change updates if parent was changed
-	_, err := wrap.DB.Query(`
-		UPDATE blog_cats SET
-			name = ?,
-			alias = ?
-		WHERE
-			id = ?
-		;`,
-		pf_name,
-		pf_alias,
-		pf_id,
-	)
-	return err
+	parentId := this.blog_GetCategoryParentId(wrap, utils.StrToInt(pf_id))
+
+	if utils.StrToInt(pf_parent) == parentId {
+		// If parent not changed, just update category data
+		_, err := wrap.DB.Query(`
+			UPDATE blog_cats SET
+				name = ?,
+				alias = ?
+			WHERE
+				id > 1 AND
+				id = ?
+			;`,
+			pf_name,
+			pf_alias,
+			pf_id,
+		)
+		return err
+	} else {
+		// Parent is changed, move category to new parent
+		// Load target category data
+		data := utils.MySql_blog_category{
+			A_id:   0,
+			A_user: 0,
+		}
+		err := wrap.DB.QueryRow(`
+			SELECT
+				id,
+				user
+			FROM
+				blog_cats
+			WHERE
+				id > 1 AND
+				id = ?
+			LIMIT 1;`,
+			utils.StrToInt(pf_id),
+		).Scan(
+			&data.A_id,
+			&data.A_user,
+		)
+		if err != nil {
+			return err
+		}
+
+		///////////////////////////////////////////////////////////////////////
+		// Start transaction with table lock
+		_, err = wrap.DB.Exec("LOCK TABLE blog_cats WRITE;")
+		if err != nil {
+			return err
+		}
+		tx, err := wrap.DB.Begin()
+		if err != nil {
+			return err
+		}
+
+		// Delete
+		if _, err = tx.Exec("SELECT @ml := lft, @mr := rgt FROM blog_cats WHERE id = ?;", pf_id); err != nil {
+			tx.Rollback()
+			return err
+		}
+		if _, err = tx.Exec("DELETE FROM blog_cats WHERE id = ?;", pf_id); err != nil {
+			tx.Rollback()
+			return err
+		}
+		if _, err = tx.Exec("UPDATE blog_cats SET lft = lft - 1, rgt = rgt - 1 WHERE lft > @ml AND rgt < @mr;"); err != nil {
+			tx.Rollback()
+			return err
+		}
+		if _, err = tx.Exec("UPDATE blog_cats SET lft = lft - 2 WHERE lft > @mr;"); err != nil {
+			tx.Rollback()
+			return err
+		}
+		if _, err = tx.Exec("UPDATE blog_cats SET rgt = rgt - 2 WHERE rgt > @mr;"); err != nil {
+			tx.Rollback()
+			return err
+		}
+
+		// Insert
+		if _, err = tx.Exec("SELECT @mr := rgt FROM blog_cats WHERE id = ?;", pf_parent); err != nil {
+			tx.Rollback()
+			return err
+		}
+		if _, err = tx.Exec("UPDATE blog_cats SET rgt = rgt + 2  WHERE rgt > @mr;"); err != nil {
+			tx.Rollback()
+			return err
+		}
+		if _, err = tx.Exec("UPDATE blog_cats SET lft = lft + 2  WHERE lft > @mr;"); err != nil {
+			tx.Rollback()
+			return err
+		}
+		if _, err = tx.Exec("UPDATE blog_cats SET rgt = rgt + 2  WHERE id = ?;", pf_parent); err != nil {
+			tx.Rollback()
+			return err
+		}
+		if _, err = tx.Exec("INSERT INTO blog_cats (id, user, name, alias, lft, rgt) VALUES (?, ?, ?, ?, @mr, @mr + 1);", data.A_id, data.A_user, pf_name, pf_alias); err != nil {
+			tx.Rollback()
+			return err
+		}
+
+		// Commit all changes and unlock table
+		err = tx.Commit()
+		if err != nil {
+			return err
+		}
+		_, err = wrap.DB.Exec("UNLOCK TABLES;")
+		if err != nil {
+			return err
+		}
+		///////////////////////////////////////////////////////////////////////
+	}
+
+	return nil
 }
 
 func (this *Modules) RegisterAction_BlogCategoriesModify() *Action {
@@ -239,7 +337,7 @@ func (this *Modules) RegisterAction_BlogCategoriesDelete() *Action {
 			return
 		}
 
-		// Update and insert new category
+		// Update and delete target category
 		if _, err = tx.Exec("SELECT @ml := lft, @mr := rgt FROM blog_cats WHERE id = ?;", pf_id); err != nil {
 			tx.Rollback()
 			wrap.MsgError(err.Error())