Unverified Commit fae0b64a authored by boojack's avatar boojack Committed by GitHub

fix: delete tag api (#950)

* fix: delete tag api

* chore: update
parent 677750ef
...@@ -4,6 +4,7 @@ import ( ...@@ -4,6 +4,7 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"net/http" "net/http"
"net/url"
"regexp" "regexp"
"sort" "sort"
...@@ -133,8 +134,10 @@ func (s *Server) registerTagRoutes(g *echo.Group) { ...@@ -133,8 +134,10 @@ func (s *Server) registerTagRoutes(g *echo.Group) {
return echo.NewHTTPError(http.StatusUnauthorized, "Missing user in session") return echo.NewHTTPError(http.StatusUnauthorized, "Missing user in session")
} }
tagName := c.Param("tagName") tagName, err := url.QueryUnescape(c.Param("tagName"))
if tagName == "" { if err != nil {
return echo.NewHTTPError(http.StatusBadRequest, "Invalid tag name").SetInternal(err)
} else if tagName == "" {
return echo.NewHTTPError(http.StatusBadRequest, "Tag name cannot be empty") return echo.NewHTTPError(http.StatusBadRequest, "Tag name cannot be empty")
} }
......
import { getResourceUrl } from "../utils/resource";
import Icon from "./Icon"; import Icon from "./Icon";
interface Props { interface Props {
...@@ -7,7 +8,7 @@ interface Props { ...@@ -7,7 +8,7 @@ interface Props {
const MemoResource: React.FC<Props> = (props: Props) => { const MemoResource: React.FC<Props> = (props: Props) => {
const { className, resource } = props; const { className, resource } = props;
const resourceUrl = `${window.location.origin}/o/r/${resource.id}/${resource.filename}`; const resourceUrl = getResourceUrl(resource);
const handlePreviewBtnClick = () => { const handlePreviewBtnClick = () => {
window.open(resourceUrl); window.open(resourceUrl);
......
import { absolutifyLink } from "../helpers/utils"; import { absolutifyLink } from "../helpers/utils";
import { getResourceUrl } from "../utils/resource";
import SquareDiv from "./common/SquareDiv"; import SquareDiv from "./common/SquareDiv";
import showPreviewImageDialog from "./PreviewImageDialog"; import showPreviewImageDialog from "./PreviewImageDialog";
import MemoResource from "./MemoResource"; import MemoResource from "./MemoResource";
...@@ -27,7 +28,7 @@ const MemoResources: React.FC<Props> = (props: Props) => { ...@@ -27,7 +28,7 @@ const MemoResources: React.FC<Props> = (props: Props) => {
const imgUrls = availableResourceList const imgUrls = availableResourceList
.filter((resource) => resource.type.startsWith("image")) .filter((resource) => resource.type.startsWith("image"))
.map((resource) => { .map((resource) => {
return `/o/r/${resource.id}/${resource.filename}`; return getResourceUrl(resource);
}); });
const handleImageClick = (imgUrl: string) => { const handleImageClick = (imgUrl: string) => {
...@@ -41,7 +42,7 @@ const MemoResources: React.FC<Props> = (props: Props) => { ...@@ -41,7 +42,7 @@ const MemoResources: React.FC<Props> = (props: Props) => {
{availableResourceList.length > 0 && ( {availableResourceList.length > 0 && (
<div className="images-wrapper"> <div className="images-wrapper">
{availableResourceList.map((resource) => { {availableResourceList.map((resource) => {
const url = `/o/r/${resource.id}/${resource.filename}`; const url = getResourceUrl(resource);
if (resource.type.startsWith("image")) { if (resource.type.startsWith("image")) {
return ( return (
<SquareDiv key={resource.id} className="memo-resource"> <SquareDiv key={resource.id} className="memo-resource">
......
import { Tooltip } from "@mui/joy"; import { Tooltip } from "@mui/joy";
import copy from "copy-to-clipboard"; import copy from "copy-to-clipboard";
import { useCallback, useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import useLoading from "../hooks/useLoading"; import useLoading from "../hooks/useLoading";
import { useResourceStore } from "../store/module"; import { useResourceStore } from "../store/module";
import { getResourceUrl } from "../utils/resource";
import Icon from "./Icon"; import Icon from "./Icon";
import toastHelper from "./Toast"; import toastHelper from "./Toast";
import Dropdown from "./common/Dropdown"; import Dropdown from "./common/Dropdown";
...@@ -83,10 +84,6 @@ const ResourcesDialog: React.FC<Props> = (props: Props) => { ...@@ -83,10 +84,6 @@ const ResourcesDialog: React.FC<Props> = (props: Props) => {
inputEl.click(); inputEl.click();
}; };
const getResourceUrl = useCallback((resource: Resource) => {
return `${window.location.origin}/o/r/${resource.id}/${resource.filename}`;
}, []);
const handlePreviewBtnClick = (resource: Resource) => { const handlePreviewBtnClick = (resource: Resource) => {
const resourceUrl = getResourceUrl(resource); const resourceUrl = getResourceUrl(resource);
if (resource.type.startsWith("image")) { if (resource.type.startsWith("image")) {
...@@ -104,7 +101,8 @@ const ResourcesDialog: React.FC<Props> = (props: Props) => { ...@@ -104,7 +101,8 @@ const ResourcesDialog: React.FC<Props> = (props: Props) => {
}; };
const handleCopyResourceLinkBtnClick = (resource: Resource) => { const handleCopyResourceLinkBtnClick = (resource: Resource) => {
copy(`${window.location.origin}/o/r/${resource.id}/${resource.filename}`); const url = getResourceUrl(resource);
copy(url);
toastHelper.success(t("message.succeed-copy-resource-link")); toastHelper.success(t("message.succeed-copy-resource-link"));
}; };
......
import { Checkbox, Tooltip } from "@mui/joy"; import { Checkbox, Tooltip } from "@mui/joy";
import { useCallback, useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import useLoading from "../hooks/useLoading"; import useLoading from "../hooks/useLoading";
import { useEditorStore, useResourceStore } from "../store/module"; import { useEditorStore, useResourceStore } from "../store/module";
import { getResourceUrl } from "../utils/resource";
import Icon from "./Icon"; import Icon from "./Icon";
import toastHelper from "./Toast"; import toastHelper from "./Toast";
import { generateDialog } from "./Dialog"; import { generateDialog } from "./Dialog";
...@@ -47,10 +48,6 @@ const ResourcesSelectorDialog: React.FC<Props> = (props: Props) => { ...@@ -47,10 +48,6 @@ const ResourcesSelectorDialog: React.FC<Props> = (props: Props) => {
}); });
}, [resources]); }, [resources]);
const getResourceUrl = useCallback((resource: Resource) => {
return `${window.location.origin}/o/r/${resource.id}/${resource.filename}`;
}, []);
const handlePreviewBtnClick = (resource: Resource) => { const handlePreviewBtnClick = (resource: Resource) => {
const resourceUrl = getResourceUrl(resource); const resourceUrl = getResourceUrl(resource);
if (resource.type.startsWith("image")) { if (resource.type.startsWith("image")) {
......
...@@ -198,7 +198,7 @@ export function upsertTag(tagName: string) { ...@@ -198,7 +198,7 @@ export function upsertTag(tagName: string) {
} }
export function deleteTag(tagName: string) { export function deleteTag(tagName: string) {
return axios.delete<ResponseObject<string>>(`/api/tag/${tagName}`); return axios.delete<ResponseObject<string>>(`/api/tag/${encodeURI(tagName)}`);
} }
export async function getRepoStarCount() { export async function getRepoStarCount() {
......
export const getResourceUrl = (resource: Resource, withOrigin = true) => {
return `${withOrigin ? window.location.origin : ""}/o/r/${resource.id}/${encodeURI(resource.filename)}`;
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment