Add: delete tag on file

This commit is contained in:
2021-12-12 17:35:30 +08:00
parent 003f8cace2
commit 93a0fe7a31
6 changed files with 104 additions and 3 deletions

View File

@@ -89,6 +89,7 @@ func NewAPI(config Config) (*API, error) {
apiMux.HandleFunc("/update_tag", api.HandleUpdateTag)
apiMux.HandleFunc("/put_tag_on_file", api.HandlePutTagOnFile)
apiMux.HandleFunc("/get_tags_on_file", api.HandleGetTagsOnFile)
apiMux.HandleFunc("/delete_tag_on_file", api.HandleDeleteTagOnFile)
// below needs token
apiMux.HandleFunc("/walk", api.HandleWalk)
apiMux.HandleFunc("/reset", api.HandleReset)

View File

@@ -80,3 +80,40 @@ func (api *API) HandleGetTagsOnFile(w http.ResponseWriter, r *http.Request) {
return
}
}
type DeleteTagOnFileRequest struct {
TagID int64 `json:"tag_id"`
FileID int64 `json:"file_id"`
}
func (api *API) HandleDeleteTagOnFile(w http.ResponseWriter, r *http.Request) {
// check if the user is admin
err := api.CheckAdmin(w, r)
if err != nil {
api.HandleError(w, r, err)
return
}
req := &DeleteTagOnFileRequest{}
err = json.NewDecoder(r.Body).Decode(req)
if err != nil {
api.HandleError(w, r, err)
return
}
// check empty
if req.TagID == 0 || req.FileID == 0 {
api.HandleError(w, r, ErrEmpty)
return
}
log.Println("Delete tag on file request:", req)
err = api.Db.DeleteTagOnFile(req.TagID, req.FileID)
if err != nil {
api.HandleError(w, r, err)
return
}
api.HandleOK(w, r)
}

10
pkg/database/error.go Normal file
View File

@@ -0,0 +1,10 @@
package database
import (
"errors"
)
var (
ErrNotFound = errors.New("object not found")
ErrTagNotFound = errors.New("tag not found")
)

View File

@@ -1,8 +1,14 @@
package database
func (database *Database) PutTagOnFile(tagID, fileID, userID int64) error {
_, err := database.stmt.putTagOnFile.Exec(tagID, fileID, userID)
return err
result, err := database.stmt.putTagOnFile.Exec(tagID, fileID, userID)
if err != nil {
return err
}
if rows, _ := result.RowsAffected(); rows == 0 {
return ErrTagNotFound
}
return nil
}
func (database *Database) GetTagsOnFile(fileID int64) ([]*Tag, error) {
@@ -23,3 +29,14 @@ func (database *Database) GetTagsOnFile(fileID int64) ([]*Tag, error) {
}
return tags, nil
}
func (database *Database) DeleteTagOnFile(tagID, fileID int64) error {
result, err := database.stmt.deleteTagOnFile.Exec(tagID, fileID)
if err != nil {
return err
}
if rows, _ := result.RowsAffected(); rows == 0 {
return ErrTagNotFound
}
return nil
}

View File

@@ -198,6 +198,8 @@ FROM file_has_tag
JOIN tags ON file_has_tag.tag_id = tags.id
WHERE file_has_tag.file_id = ?;`
var deleteTagOnFileQuery = `DELETE FROM file_has_tag WHERE tag_id = ? AND file_id = ?;`
type Stmt struct {
initFilesTable *sql.Stmt
initFoldersTable *sql.Stmt
@@ -236,6 +238,7 @@ type Stmt struct {
updateTag *sql.Stmt
putTagOnFile *sql.Stmt
getTagsOnFile *sql.Stmt
deleteTagOnFile *sql.Stmt
}
func NewPreparedStatement(sqlConn *sql.DB) (*Stmt, error) {
@@ -528,5 +531,11 @@ func NewPreparedStatement(sqlConn *sql.DB) (*Stmt, error) {
return nil, err
}
// init deleteTagOnFile
stmt.deleteTagOnFile, err = sqlConn.Prepare(deleteTagOnFileQuery)
if err != nil {
return nil, err
}
return stmt, err
}

View File

@@ -67,6 +67,27 @@ function FileInfo(props) {
});
}
function removeTagOnFile(tag_id) {
fetch(`/api/v1/delete_tag_on_file`, {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
file_id: parseInt(params.id),
tag_id: tag_id,
}),
})
.then((res) => res.json())
.then((data) => {
if (data.error) {
alert(data.error);
} else {
getTagsOnFile();
}
});
}
useEffect(() => {
refresh();
getTags();
@@ -116,7 +137,13 @@ function FileInfo(props) {
return (
<li key={tag.id}>
<button>{tag.name}</button>
<button>Remove</button>
<button
onClick={() => {
removeTagOnFile(tag.id);
}}
>
Remove
</button>
</li>
);
})}