Add: delete tag on file
This commit is contained in:
@@ -89,6 +89,7 @@ func NewAPI(config Config) (*API, error) {
|
|||||||
apiMux.HandleFunc("/update_tag", api.HandleUpdateTag)
|
apiMux.HandleFunc("/update_tag", api.HandleUpdateTag)
|
||||||
apiMux.HandleFunc("/put_tag_on_file", api.HandlePutTagOnFile)
|
apiMux.HandleFunc("/put_tag_on_file", api.HandlePutTagOnFile)
|
||||||
apiMux.HandleFunc("/get_tags_on_file", api.HandleGetTagsOnFile)
|
apiMux.HandleFunc("/get_tags_on_file", api.HandleGetTagsOnFile)
|
||||||
|
apiMux.HandleFunc("/delete_tag_on_file", api.HandleDeleteTagOnFile)
|
||||||
// below needs token
|
// below needs token
|
||||||
apiMux.HandleFunc("/walk", api.HandleWalk)
|
apiMux.HandleFunc("/walk", api.HandleWalk)
|
||||||
apiMux.HandleFunc("/reset", api.HandleReset)
|
apiMux.HandleFunc("/reset", api.HandleReset)
|
||||||
|
|||||||
@@ -80,3 +80,40 @@ func (api *API) HandleGetTagsOnFile(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
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
10
pkg/database/error.go
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
package database
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
ErrNotFound = errors.New("object not found")
|
||||||
|
ErrTagNotFound = errors.New("tag not found")
|
||||||
|
)
|
||||||
@@ -1,8 +1,14 @@
|
|||||||
package database
|
package database
|
||||||
|
|
||||||
func (database *Database) PutTagOnFile(tagID, fileID, userID int64) error {
|
func (database *Database) PutTagOnFile(tagID, fileID, userID int64) error {
|
||||||
_, err := database.stmt.putTagOnFile.Exec(tagID, fileID, userID)
|
result, err := database.stmt.putTagOnFile.Exec(tagID, fileID, userID)
|
||||||
return err
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if rows, _ := result.RowsAffected(); rows == 0 {
|
||||||
|
return ErrTagNotFound
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (database *Database) GetTagsOnFile(fileID int64) ([]*Tag, error) {
|
func (database *Database) GetTagsOnFile(fileID int64) ([]*Tag, error) {
|
||||||
@@ -23,3 +29,14 @@ func (database *Database) GetTagsOnFile(fileID int64) ([]*Tag, error) {
|
|||||||
}
|
}
|
||||||
return tags, nil
|
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
|
||||||
|
}
|
||||||
|
|||||||
@@ -198,6 +198,8 @@ FROM file_has_tag
|
|||||||
JOIN tags ON file_has_tag.tag_id = tags.id
|
JOIN tags ON file_has_tag.tag_id = tags.id
|
||||||
WHERE file_has_tag.file_id = ?;`
|
WHERE file_has_tag.file_id = ?;`
|
||||||
|
|
||||||
|
var deleteTagOnFileQuery = `DELETE FROM file_has_tag WHERE tag_id = ? AND file_id = ?;`
|
||||||
|
|
||||||
type Stmt struct {
|
type Stmt struct {
|
||||||
initFilesTable *sql.Stmt
|
initFilesTable *sql.Stmt
|
||||||
initFoldersTable *sql.Stmt
|
initFoldersTable *sql.Stmt
|
||||||
@@ -236,6 +238,7 @@ type Stmt struct {
|
|||||||
updateTag *sql.Stmt
|
updateTag *sql.Stmt
|
||||||
putTagOnFile *sql.Stmt
|
putTagOnFile *sql.Stmt
|
||||||
getTagsOnFile *sql.Stmt
|
getTagsOnFile *sql.Stmt
|
||||||
|
deleteTagOnFile *sql.Stmt
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewPreparedStatement(sqlConn *sql.DB) (*Stmt, error) {
|
func NewPreparedStatement(sqlConn *sql.DB) (*Stmt, error) {
|
||||||
@@ -528,5 +531,11 @@ func NewPreparedStatement(sqlConn *sql.DB) (*Stmt, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// init deleteTagOnFile
|
||||||
|
stmt.deleteTagOnFile, err = sqlConn.Prepare(deleteTagOnFileQuery)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
return stmt, err
|
return stmt, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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(() => {
|
useEffect(() => {
|
||||||
refresh();
|
refresh();
|
||||||
getTags();
|
getTags();
|
||||||
@@ -116,7 +137,13 @@ function FileInfo(props) {
|
|||||||
return (
|
return (
|
||||||
<li key={tag.id}>
|
<li key={tag.id}>
|
||||||
<button>{tag.name}</button>
|
<button>{tag.name}</button>
|
||||||
<button>Remove</button>
|
<button
|
||||||
|
onClick={() => {
|
||||||
|
removeTagOnFile(tag.id);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
Remove
|
||||||
|
</button>
|
||||||
</li>
|
</li>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
|
|||||||
Reference in New Issue
Block a user