From 7efde3cf6f2223b3ce4bea8179ee1fd795a46745 Mon Sep 17 00:00:00 2001 From: heimoshuiyu Date: Thu, 16 Dec 2021 12:15:35 +0800 Subject: [PATCH] Add: support change filename Fix: path method use realname --- pkg/api/api.go | 1 + pkg/api/handle_manage_file.go | 34 ++++++++++++++++++++++++++++++++++ pkg/database/method.go | 15 +++++++++++++-- pkg/database/sql_stmt.go | 18 ++++++++++++++---- pkg/database/struct.go | 3 ++- web/src/component/FileInfo.js | 35 ++++++++++++++++++++++++++++++++++- 6 files changed, 98 insertions(+), 8 deletions(-) diff --git a/pkg/api/api.go b/pkg/api/api.go index a4baab8..a2ab756 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -80,6 +80,7 @@ func NewAPI(config Config) (*API, error) { apiMux.HandleFunc("/get_file_stream_direct", api.HandleGetFileStreamDirect) apiMux.HandleFunc("/prepare_file_stream_direct", api.HandlePrepareFileStreamDirect) apiMux.HandleFunc("/delete_file", api.HandleDeleteFile) + apiMux.HandleFunc("/update_filename", api.HandleUpdateFilename) // feedback apiMux.HandleFunc("/feedback", api.HandleFeedback) apiMux.HandleFunc("/get_feedbacks", api.HandleGetFeedbacks) diff --git a/pkg/api/handle_manage_file.go b/pkg/api/handle_manage_file.go index 5c71665..88a2faa 100644 --- a/pkg/api/handle_manage_file.go +++ b/pkg/api/handle_manage_file.go @@ -3,6 +3,7 @@ package api import ( "encoding/json" "net/http" + "log" ) type DeleteFileRequest struct { @@ -24,6 +25,8 @@ func (api *API) HandleDeleteFile(w http.ResponseWriter, r *http.Request) { return } + log.Println("[api] delete file", req.ID) + err = api.Db.DeleteFile(req.ID) if err != nil { api.HandleError(w, r, err) @@ -32,3 +35,34 @@ func (api *API) HandleDeleteFile(w http.ResponseWriter, r *http.Request) { api.HandleOK(w, r) } + +type UpdateFilenameRequest struct { + ID int64 `json:"id"` + Filename string `json:"filename"` +} + +func (api *API) HandleUpdateFilename(w http.ResponseWriter, r *http.Request) { + // check admin + err := api.CheckAdmin(w, r) + if err != nil { + api.HandleError(w, r, err) + return + } + + req := &UpdateFilenameRequest{} + err = json.NewDecoder(r.Body).Decode(req) + if err != nil { + api.HandleError(w, r, err) + return + } + + log.Println("[api] update filename", req.ID, req.Filename) + + err = api.Db.UpdateFilename(req.ID, req.Filename) + if err != nil { + api.HandleError(w, r, err) + return + } + + api.HandleOK(w, r) +} diff --git a/pkg/database/method.go b/pkg/database/method.go index 25b3587..dfa1cec 100644 --- a/pkg/database/method.go +++ b/pkg/database/method.go @@ -108,7 +108,7 @@ func (database *Database) GetFile(id int64) (*File, error) { database.singleThreadLock.Lock() defer database.singleThreadLock.Unlock() - err := database.stmt.getFile.QueryRow(id).Scan(&file.ID, &file.Folder_id, &file.Filename, &file.Foldername, &file.Filesize) + err := database.stmt.getFile.QueryRow(id).Scan(&file.ID, &file.Folder_id, &file.Realname, &file.Filename, &file.Foldername, &file.Filesize) if err != nil { return nil, err } @@ -277,7 +277,7 @@ func (database *Database) InsertFile(folderId int64, filename string, filesize i database.singleThreadLock.Lock() defer database.singleThreadLock.Unlock() - result, err := database.stmt.insertFile.Exec(folderId, filename, filesize) + result, err := database.stmt.insertFile.Exec(folderId, filename, filename, filesize) if err != nil { return 0, err } @@ -361,3 +361,14 @@ func (database *Database) DeleteFile(fileId int64) error { return nil } + +func (database *Database) UpdateFilename(fileId int64, filename string) error { + database.singleThreadLock.Lock() + defer database.singleThreadLock.Unlock() + + _, err := database.stmt.updateFilename.Exec(filename, fileId) + if err != nil { + return err + } + return nil +} diff --git a/pkg/database/sql_stmt.go b/pkg/database/sql_stmt.go index 45dace2..195cab5 100644 --- a/pkg/database/sql_stmt.go +++ b/pkg/database/sql_stmt.go @@ -7,6 +7,7 @@ import ( var initFilesTableQuery = `CREATE TABLE IF NOT EXISTS files ( id INTEGER PRIMARY KEY, folder_id INTEGER NOT NULL, + realname TEXT NOT NULL, filename TEXT NOT NULL, filesize INTEGER NOT NULL, FOREIGN KEY(folder_id) REFERENCES folders(id) @@ -115,10 +116,10 @@ VALUES (?, ?);` var findFolderQuery = `SELECT id FROM folders WHERE folder = ? LIMIT 1;` -var findFileQuery = `SELECT id FROM files WHERE folder_id = ? AND filename = ? LIMIT 1;` +var findFileQuery = `SELECT id FROM files WHERE folder_id = ? AND realname = ? LIMIT 1;` -var insertFileQuery = `INSERT INTO files (folder_id, filename, filesize) -VALUES (?, ?, ?);` +var insertFileQuery = `INSERT INTO files (folder_id, realname, filename, filesize) +VALUES (?, ?, ?, ?);` var searchFilesQuery = `SELECT files.id, files.folder_id, files.filename, folders.foldername, files.filesize @@ -134,7 +135,7 @@ var dropFilesQuery = `DROP TABLE files;` var dropFolderQuery = `DROP TABLE folders;` var getFileQuery = `SELECT -files.id, files.folder_id, files.filename, folders.foldername, files.filesize +files.id, files.folder_id, files.realname, files.filename, folders.foldername, files.filesize FROM files JOIN folders ON files.folder_id = folders.id WHERE files.id = ? @@ -274,6 +275,8 @@ var deleteFileReferenceInFileHasTagQuery = `DELETE FROM file_has_tag WHERE file_ var deleteFileReferenceInReviewsQuery = `DELETE FROM reviews WHERE file_id = ?;` +var updateFilenameQuery = `UPDATE files SET filename = ? WHERE id = ?;` + type Stmt struct { initFilesTable *sql.Stmt initFoldersTable *sql.Stmt @@ -332,6 +335,7 @@ type Stmt struct { deleteFile *sql.Stmt deleteFileReferenceInFileHasTag *sql.Stmt deleteFileReferenceInReviews *sql.Stmt + updateFilename *sql.Stmt } func NewPreparedStatement(sqlConn *sql.DB) (*Stmt, error) { @@ -746,6 +750,12 @@ func NewPreparedStatement(sqlConn *sql.DB) (*Stmt, error) { if err != nil { return nil, err } + + // init updateFilename + stmt.updateFilename, err = sqlConn.Prepare(updateFilenameQuery) + if err != nil { + return nil, err + } return stmt, err } diff --git a/pkg/database/struct.go b/pkg/database/struct.go index fa8afce..d33accf 100644 --- a/pkg/database/struct.go +++ b/pkg/database/struct.go @@ -9,6 +9,7 @@ type File struct { ID int64 `json:"id"` Folder_id int64 `json:"folder_id"` Foldername string `json:"foldername"` + Realname string `json:"-"` Filename string `json:"filename"` Filesize int64 `json:"filesize"` } @@ -68,5 +69,5 @@ func (f *File) Path() (string, error) { if err != nil { return "", err } - return filepath.Join(folder.Folder, f.Filename), nil + return filepath.Join(folder.Folder, f.Realname), nil } diff --git a/web/src/component/FileInfo.js b/web/src/component/FileInfo.js index 3b6ef63..be1eabc 100644 --- a/web/src/component/FileInfo.js +++ b/web/src/component/FileInfo.js @@ -111,6 +111,28 @@ function FileInfo(props) { } } + function updateFilename() { + fetch(`/api/v1/update_filename`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + id: parseInt(params.id), + filename: file.filename, + }), + }) + .then((res) => res.json()) + .then((data) => { + if (data.error) { + alert(data.error); + } else { + alert("Filename updated"); + refresh(); + } + }); + } + useEffect(() => { refresh(); getTags(); @@ -163,10 +185,21 @@ function FileInfo(props) { readOnly /> - + { + setFile({ + ...file, + filename: event.target.value, + }); + }} + /> +