diff --git a/pkg/api/api.go b/pkg/api/api.go index 929a259..b4c14b4 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -86,6 +86,7 @@ func NewAPI(config Config) (*API, error) { apiMux.HandleFunc("/get_tags", api.HandleGetTags) apiMux.HandleFunc("/get_tag_info", api.HandleGetTagInfo) apiMux.HandleFunc("/insert_tag", api.HandleInsertTag) + apiMux.HandleFunc("/update_tag", api.HandleUpdateTag) // below needs token apiMux.HandleFunc("/walk", api.HandleWalk) apiMux.HandleFunc("/reset", api.HandleReset) diff --git a/pkg/api/handle_tag.go b/pkg/api/handle_tag.go index 2988386..69b1a60 100644 --- a/pkg/api/handle_tag.go +++ b/pkg/api/handle_tag.go @@ -91,3 +91,28 @@ func (api *API) HandleGetTagInfo(w http.ResponseWriter, r *http.Request) { return } } + +func (api *API) HandleUpdateTag(w http.ResponseWriter, r *http.Request) { + // check if user is admin + err := api.CheckAdmin(w, r) + if err != nil { + return + } + + req := &database.Tag{} + err = json.NewDecoder(r.Body).Decode(req) + if err != nil { + api.HandleError(w, r, err) + return + } + tag, err := api.Db.UpdateTag(req) + if err != nil { + api.HandleError(w, r, err) + return + } + err = json.NewEncoder(w).Encode(tag) + if err != nil { + api.HandleError(w, r, err) + return + } +} diff --git a/pkg/database/method_tag.go b/pkg/database/method_tag.go index e2737ff..95353f9 100644 --- a/pkg/database/method_tag.go +++ b/pkg/database/method_tag.go @@ -1,5 +1,7 @@ package database +import "errors" + func (database *Database) InsertTag(tag string, description string) (*Tag, error) { result, err := database.stmt.insertTag.Exec(tag, description) if err != nil { @@ -38,3 +40,18 @@ func (database *Database) GetTags() ([]Tag, error) { } return tags, nil } + +func (database *Database) UpdateTag(tag *Tag) (*Tag, error) { + result, err := database.stmt.updateTag.Exec(tag.Name, tag.Description, tag.ID) + if err != nil { + return nil, err + } + rowsAffected, err := result.RowsAffected() + if err != nil { + return nil, err + } + if rowsAffected == 0 { + return nil, errors.New("No rows affected") + } + return database.GetTag(tag.ID) +} diff --git a/pkg/database/sql_stmt.go b/pkg/database/sql_stmt.go index 496f3fb..21d7a2c 100644 --- a/pkg/database/sql_stmt.go +++ b/pkg/database/sql_stmt.go @@ -176,6 +176,8 @@ var getTagQuery = `SELECT id, name, description FROM tags WHERE id = ? LIMIT 1;` var getTagsQuery = `SELECT id, name, description FROM tags;` +var updateTagQuery = `UPDATE tags SET name = ?, description = ? WHERE id = ?;` + type Stmt struct { initFilesTable *sql.Stmt initFoldersTable *sql.Stmt @@ -211,6 +213,7 @@ type Stmt struct { insertTag *sql.Stmt getTag *sql.Stmt getTags *sql.Stmt + updateTag *sql.Stmt } func NewPreparedStatement(sqlConn *sql.DB) (*Stmt, error) { @@ -485,5 +488,11 @@ func NewPreparedStatement(sqlConn *sql.DB) (*Stmt, error) { return nil, err } + // init updateTag + stmt.updateTag, err = sqlConn.Prepare(updateTagQuery) + if err != nil { + return nil, err + } + return stmt, err } diff --git a/web/src/component/EditTag.js b/web/src/component/EditTag.js index e339f7b..e5e9de4 100644 --- a/web/src/component/EditTag.js +++ b/web/src/component/EditTag.js @@ -3,9 +3,13 @@ import { useParams } from "react-router"; function EditTag() { let params = useParams(); - const [tag, setTag] = useState({}); + const [tag, setTag] = useState({ + id: "", + name: "", + description: "", + }); - useEffect(() => { + function refreshTagInfo() { fetch("/api/v1/get_tag_info", { method: "POST", headers: { @@ -23,6 +27,33 @@ function EditTag() { setTag(data.tag); } }); + } + + function updateTagInfo() { + fetch("/api/v1/update_tag", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + id: parseInt(params.id), + name: tag.name, + description: tag.description, + }), + }) + .then((res) => res.json()) + .then((data) => { + if (data.error) { + alert(data.error); + } else { + alert("Tag updated successfully"); + refreshTagInfo(); + } + }); + } + + useEffect(() => { + refreshTagInfo(); }, []); return ( @@ -53,7 +84,7 @@ function EditTag() { value={tag.description} onChange={(e) => setTag({ ...tag, description: e.target.value })} /> - + );