diff --git a/pkg/api/api.go b/pkg/api/api.go index 0a3e45c..3012d9d 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -90,6 +90,8 @@ func NewAPI(config Config) (*API, error) { apiMux.HandleFunc("/put_tag_on_file", api.HandlePutTagOnFile) apiMux.HandleFunc("/get_tags_on_file", api.HandleGetTagsOnFile) apiMux.HandleFunc("/delete_tag_on_file", api.HandleDeleteTagOnFile) + // folder + apiMux.HandleFunc("/update_foldername", api.HandleUpdateFoldername) // below needs token apiMux.HandleFunc("/walk", api.HandleWalk) apiMux.HandleFunc("/reset", api.HandleReset) diff --git a/pkg/api/handle_folder.go b/pkg/api/handle_folder.go new file mode 100644 index 0000000..53eadf8 --- /dev/null +++ b/pkg/api/handle_folder.go @@ -0,0 +1,35 @@ +package api + +import ( + "encoding/json" + "net/http" +) + +type UpdateFoldernameRequest struct { + ID int64 `json:"id"` + Foldername string `json:"foldername"` +} + +func (api *API) HandleUpdateFoldername(w http.ResponseWriter, r *http.Request) { + req := &UpdateFoldernameRequest{} + err := json.NewDecoder(r.Body).Decode(req) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + // check is admin + err = api.CheckAdmin(w, r) + if err != nil { + api.HandleError(w, r, err) + return + } + + err = api.Db.UpdateFoldername(req.ID, req.Foldername) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + api.HandleOK(w, r) +} diff --git a/pkg/database/method.go b/pkg/database/method.go index fc0294e..9083d85 100644 --- a/pkg/database/method.go +++ b/pkg/database/method.go @@ -239,3 +239,11 @@ func (database *Database) Insert(path string, filesize int64) error { } return nil } + +func (database *Database) UpdateFoldername(folderId int64, foldername string) error { + _, err := database.stmt.updateFoldername.Exec(foldername, folderId) + if err != nil { + return err + } + return nil +} diff --git a/pkg/database/sql_stmt.go b/pkg/database/sql_stmt.go index 1004073..b348954 100644 --- a/pkg/database/sql_stmt.go +++ b/pkg/database/sql_stmt.go @@ -200,6 +200,8 @@ WHERE file_has_tag.file_id = ?;` var deleteTagOnFileQuery = `DELETE FROM file_has_tag WHERE tag_id = ? AND file_id = ?;` +var updateFoldernameQuery = `UPDATE folders SET foldername = ? WHERE id = ?;` + type Stmt struct { initFilesTable *sql.Stmt initFoldersTable *sql.Stmt @@ -239,6 +241,7 @@ type Stmt struct { putTagOnFile *sql.Stmt getTagsOnFile *sql.Stmt deleteTagOnFile *sql.Stmt + updateFoldername *sql.Stmt } func NewPreparedStatement(sqlConn *sql.DB) (*Stmt, error) { @@ -537,5 +540,11 @@ func NewPreparedStatement(sqlConn *sql.DB) (*Stmt, error) { return nil, err } + // init updateFoldername + stmt.updateFoldername, err = sqlConn.Prepare(updateFoldernameQuery) + if err != nil { + return nil, err + } + return stmt, err } diff --git a/web/src/component/FilesInFolder.js b/web/src/component/FilesInFolder.js index 0f27e28..52af466 100644 --- a/web/src/component/FilesInFolder.js +++ b/web/src/component/FilesInFolder.js @@ -7,9 +7,10 @@ function FilesInFolder(props) { const [files, setFiles] = useState([]); const [isLoading, setIsLoading] = useState(false); const [offset, setOffset] = useState(0); + const [newFoldername, setNewFoldername] = useState(""); const limit = 10; - useEffect(() => { + function refresh() { setIsLoading(true); fetch("/api/v1/get_files_in_folder", { method: "POST", @@ -22,12 +23,21 @@ function FilesInFolder(props) { }) .then((response) => response.json()) .then((data) => { - setFiles(data.files ? data.files : []); + if (data.error) { + alert(data.error); + } else { + setFiles(data.files); + setNewFoldername(data.files[0].foldername); + } }) .catch((error) => alert(error)) .finally(() => { setIsLoading(false); }); + } + + useEffect(() => { + refresh(); }, [params.id, offset]); function nextPage() { @@ -42,6 +52,30 @@ function FilesInFolder(props) { setOffset(offsetValue); } + function updateFoldername() { + setIsLoading(true); + fetch("/api/v1/update_foldername", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + id: parseInt(params.id), + foldername: newFoldername, + }), + }) + .then((response) => response.json()) + .then((data) => { + if (data.error) { + alert(data.error); + } else { + refresh(); + } + }) + .catch((error) => alert(error)) + .finally(() => { + setIsLoading(false); + }); + } + return (

Files in Folder

@@ -53,6 +87,14 @@ function FilesInFolder(props) {
+
+ setNewFoldername(e.target.value)} + /> + +
); }