Add: support delete file

This commit is contained in:
2021-12-16 11:41:07 +08:00
parent 0edc7f7141
commit 435e3605f7
5 changed files with 188 additions and 54 deletions

View File

@@ -79,6 +79,7 @@ func NewAPI(config Config) (*API, error) {
apiMux.HandleFunc("/get_file_info", api.HandleGetFileInfo)
apiMux.HandleFunc("/get_file_stream_direct", api.HandleGetFileStreamDirect)
apiMux.HandleFunc("/prepare_file_stream_direct", api.HandlePrepareFileStreamDirect)
apiMux.HandleFunc("/delete_file", api.HandleDeleteFile)
// feedback
apiMux.HandleFunc("/feedback", api.HandleFeedback)
apiMux.HandleFunc("/get_feedbacks", api.HandleGetFeedbacks)

View File

@@ -0,0 +1,34 @@
package api
import (
"encoding/json"
"net/http"
)
type DeleteFileRequest struct {
ID int64 `json:"id"`
}
func (api *API) HandleDeleteFile(w http.ResponseWriter, r *http.Request) {
// check admin
err := api.CheckAdmin(w, r)
if err != nil {
api.HandleError(w, r, err)
return
}
req := &DeleteFileRequest{}
err = json.NewDecoder(r.Body).Decode(req)
if err != nil {
api.HandleError(w, r, err)
return
}
err = api.Db.DeleteFile(req.ID)
if err != nil {
api.HandleError(w, r, err)
return
}
api.HandleOK(w, r)
}

View File

@@ -321,3 +321,43 @@ func (database *Database) UpdateFoldername(folderId int64, foldername string) er
}
return nil
}
func (database *Database) DeleteFile(fileId int64) error {
database.singleThreadLock.Lock()
defer database.singleThreadLock.Unlock()
// begin transaction
tx, err := database.sqlConn.Begin()
if err != nil {
return err
}
// delete file
_, err = tx.Stmt(database.stmt.deleteFile).Exec(fileId)
if err != nil {
tx.Rollback()
return err
}
// delete tag on file
_, err = tx.Stmt(database.stmt.deleteFileReferenceInFileHasTag).Exec(fileId)
if err != nil {
tx.Rollback()
return err
}
// delete reviews on file
_, err = tx.Stmt(database.stmt.deleteFileReferenceInReviews).Exec(fileId)
if err != nil {
tx.Rollback()
return err
}
// commit transaction
err = tx.Commit()
if err != nil {
return err
}
return nil
}

View File

@@ -268,6 +268,12 @@ WHERE reviews.user_id = ?
ORDER BY reviews.created_at
;`
var deleteFileQuery = `DELETE FROM files WHERE id = ?;`
var deleteFileReferenceInFileHasTagQuery = `DELETE FROM file_has_tag WHERE file_id = ?;`
var deleteFileReferenceInReviewsQuery = `DELETE FROM reviews WHERE file_id = ?;`
type Stmt struct {
initFilesTable *sql.Stmt
initFoldersTable *sql.Stmt
@@ -323,6 +329,9 @@ type Stmt struct {
updateReview *sql.Stmt
deleteReview *sql.Stmt
getReviewsByUser *sql.Stmt
deleteFile *sql.Stmt
deleteFileReferenceInFileHasTag *sql.Stmt
deleteFileReferenceInReviews *sql.Stmt
}
func NewPreparedStatement(sqlConn *sql.DB) (*Stmt, error) {
@@ -718,5 +727,25 @@ func NewPreparedStatement(sqlConn *sql.DB) (*Stmt, error) {
return nil, err
}
// init deleteFile
stmt.deleteFile, err = sqlConn.Prepare(deleteFileQuery)
if err != nil {
return nil, err
}
// init deleteFileReferenceInFileHasTag
stmt.deleteFileReferenceInFileHasTag, err = sqlConn.Prepare(
deleteFileReferenceInFileHasTagQuery)
if err != nil {
return nil, err
}
// init deleteFileReferenceInReviews
stmt.deleteFileReferenceInReviews, err = sqlConn.Prepare(
deleteFileReferenceInReviewsQuery)
if err != nil {
return nil, err
}
return stmt, err
}

View File

@@ -88,6 +88,29 @@ function FileInfo(props) {
});
}
function deleteFile() {
// show Warning
if (window.confirm("Are you sure you want to delete this file?")) {
fetch(`/api/v1/delete_file`, {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
id: parseInt(params.id),
}),
})
.then((res) => res.json())
.then((data) => {
if (data.error) {
alert(data.error);
} else {
navigate(-1);
}
});
}
}
useEffect(() => {
refresh();
getTags();
@@ -120,6 +143,13 @@ function FileInfo(props) {
>
Share
</button>
<button
onClick={() => {
deleteFile();
}}
>
Delete
</button>
</div>
<div>
<label htmlFor="foldername">Folder Name:</label>