diff --git a/.golangci.yaml b/.golangci.yaml index 8bb78de..e4a0f65 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -67,6 +67,8 @@ linters-settings: disabled: true - name: use-any disabled: true + - name: var-naming + disabled: true - name: exported arguments: - "disableStutteringCheck" diff --git a/api/v1/redirector.go b/api/v1/redirector.go deleted file mode 100644 index 4475ada..0000000 --- a/api/v1/redirector.go +++ /dev/null @@ -1,118 +0,0 @@ -package v1 - -import ( - "encoding/json" - "fmt" - "html" - "net/http" - "net/url" - "strings" - - "github.com/labstack/echo/v4" - "github.com/pkg/errors" - - storepb "github.com/yourselfhosted/slash/proto/gen/store" - "github.com/yourselfhosted/slash/server/metric" - "github.com/yourselfhosted/slash/store" -) - -func (s *APIV1Service) registerRedirectorRoutes(g *echo.Group) { - g.GET("/*", func(c echo.Context) error { - ctx := c.Request().Context() - if len(c.ParamValues()) == 0 { - return echo.NewHTTPError(http.StatusBadRequest, "invalid shortcut name") - } - - shortcutName := c.ParamValues()[0] - shortcut, err := s.Store.GetShortcut(ctx, &store.FindShortcut{ - Name: &shortcutName, - }) - if err != nil { - return echo.NewHTTPError(http.StatusInternalServerError, fmt.Sprintf("failed to get shortcut, err: %s", err)).SetInternal(err) - } - if shortcut == nil { - return c.Redirect(http.StatusSeeOther, fmt.Sprintf("/404?shortcut=%s", shortcutName)) - } - if shortcut.Visibility != storepb.Visibility_PUBLIC { - userID, ok := c.Get(userIDContextKey).(int32) - if !ok { - return echo.NewHTTPError(http.StatusUnauthorized, "Unauthorized") - } - if shortcut.Visibility == storepb.Visibility_PRIVATE && shortcut.CreatorId != userID { - return echo.NewHTTPError(http.StatusUnauthorized, "Unauthorized") - } - } - - if err := s.createShortcutViewActivity(c, shortcut); err != nil { - return echo.NewHTTPError(http.StatusInternalServerError, fmt.Sprintf("failed to create activity, err: %s", err)).SetInternal(err) - } - - metric.Enqueue("shortcut redirect") - return redirectToShortcut(c, shortcut) - }) -} - -func redirectToShortcut(c echo.Context, shortcut *storepb.Shortcut) error { - isValidURL := isValidURLString(shortcut.Link) - if shortcut.OgMetadata == nil || (shortcut.OgMetadata.Title == "" && shortcut.OgMetadata.Description == "" && shortcut.OgMetadata.Image == "") { - if isValidURL { - return c.Redirect(http.StatusSeeOther, shortcut.Link) - } - return c.String(http.StatusOK, shortcut.Link) - } - - htmlTemplate := `%s%s` - metadataList := []string{ - fmt.Sprintf(`%s`, shortcut.OgMetadata.Title), - fmt.Sprintf(``, shortcut.OgMetadata.Description), - fmt.Sprintf(``, shortcut.OgMetadata.Title), - fmt.Sprintf(``, shortcut.OgMetadata.Description), - fmt.Sprintf(``, shortcut.OgMetadata.Image), - ``, - // Twitter related metadata. - fmt.Sprintf(``, shortcut.OgMetadata.Title), - fmt.Sprintf(``, shortcut.OgMetadata.Description), - fmt.Sprintf(``, shortcut.OgMetadata.Image), - ``, - } - if isValidURL { - metadataList = append(metadataList, fmt.Sprintf(``, shortcut.Link)) - } - body := "" - if isValidURL { - body = fmt.Sprintf(``, shortcut.Link) - } else { - body = html.EscapeString(shortcut.Link) - } - htmlString := fmt.Sprintf(htmlTemplate, strings.Join(metadataList, ""), body) - return c.HTML(http.StatusOK, htmlString) -} - -func (s *APIV1Service) createShortcutViewActivity(c echo.Context, shortcut *storepb.Shortcut) error { - payload := &ActivityShorcutViewPayload{ - ShortcutID: shortcut.Id, - IP: c.RealIP(), - Referer: c.Request().Referer(), - UserAgent: c.Request().UserAgent(), - } - payloadStr, err := json.Marshal(payload) - if err != nil { - return errors.Wrap(err, "Failed to marshal activity payload") - } - activity := &store.Activity{ - CreatorID: BotID, - Type: store.ActivityShortcutView, - Level: store.ActivityInfo, - Payload: string(payloadStr), - } - _, err = s.Store.CreateActivity(c.Request().Context(), activity) - if err != nil { - return errors.Wrap(err, "Failed to create activity") - } - return nil -} - -func isValidURLString(s string) bool { - _, err := url.ParseRequestURI(s) - return err == nil -} diff --git a/api/v1/redirector_test.go b/api/v1/redirector_test.go deleted file mode 100644 index 1e988a6..0000000 --- a/api/v1/redirector_test.go +++ /dev/null @@ -1,33 +0,0 @@ -package v1 - -import "testing" - -func TestIsValidURLString(t *testing.T) { - tests := []struct { - link string - expected bool - }{ - { - link: "https://google.com", - expected: true, - }, - { - link: "http://google.com", - expected: true, - }, - { - link: "google.com", - expected: false, - }, - { - link: "mailto:email@example.com", - expected: true, - }, - } - - for _, test := range tests { - if isValidURLString(test.link) != test.expected { - t.Errorf("isValidURLString(%s) = %v, expected %v", test.link, !test.expected, test.expected) - } - } -} diff --git a/api/v1/v1.go b/api/v1/v1.go index db1826b..43f28d8 100644 --- a/api/v1/v1.go +++ b/api/v1/v1.go @@ -32,10 +32,4 @@ func (s *APIV1Service) Start(apiGroup *echo.Group, secret string) { s.registerUserRoutes(apiV1Group) s.registerShortcutRoutes(apiV1Group) s.registerAnalyticsRoutes(apiV1Group) - - redirectorGroup := apiGroup.Group("/s") - redirectorGroup.Use(func(next echo.HandlerFunc) echo.HandlerFunc { - return JWTMiddleware(s, next, secret) - }) - s.registerRedirectorRoutes(redirectorGroup) } diff --git a/api/v2/shortcut_service.go b/api/v2/shortcut_service.go index 23429c4..9e25df6 100644 --- a/api/v2/shortcut_service.go +++ b/api/v2/shortcut_service.go @@ -54,7 +54,7 @@ func (s *APIV2Service) ListShortcuts(ctx context.Context, _ *apiv2pb.ListShortcu func (s *APIV2Service) GetShortcut(ctx context.Context, request *apiv2pb.GetShortcutRequest) (*apiv2pb.GetShortcutResponse, error) { shortcut, err := s.Store.GetShortcut(ctx, &store.FindShortcut{ - ID: &request.Id, + Name: &request.Name, }) if err != nil { return nil, status.Errorf(codes.Internal, "failed to get shortcut by name: %v", err) @@ -84,6 +84,38 @@ func (s *APIV2Service) GetShortcut(ctx context.Context, request *apiv2pb.GetShor return response, nil } +func (s *APIV2Service) GetShortcutById(ctx context.Context, request *apiv2pb.GetShortcutByIdRequest) (*apiv2pb.GetShortcutByIdResponse, error) { + shortcut, err := s.Store.GetShortcut(ctx, &store.FindShortcut{ + ID: &request.Id, + }) + if err != nil { + return nil, status.Errorf(codes.Internal, "failed to get shortcut by id: %v", err) + } + if shortcut == nil { + return nil, status.Errorf(codes.NotFound, "shortcut not found") + } + + userID, ok := ctx.Value(userIDContextKey).(int32) + if ok { + if shortcut.Visibility == storepb.Visibility_PRIVATE && shortcut.CreatorId != userID { + return nil, status.Errorf(codes.PermissionDenied, "Permission denied") + } + } else { + if shortcut.Visibility != storepb.Visibility_PUBLIC { + return nil, status.Errorf(codes.PermissionDenied, "Permission denied") + } + } + + composedShortcut, err := s.convertShortcutFromStorepb(ctx, shortcut) + if err != nil { + return nil, status.Errorf(codes.Internal, "failed to convert shortcut, err: %v", err) + } + response := &apiv2pb.GetShortcutByIdResponse{ + Shortcut: composedShortcut, + } + return response, nil +} + func (s *APIV2Service) CreateShortcut(ctx context.Context, request *apiv2pb.CreateShortcutRequest) (*apiv2pb.CreateShortcutResponse, error) { userID := ctx.Value(userIDContextKey).(int32) shortcut := &storepb.Shortcut{ @@ -199,7 +231,7 @@ func (s *APIV2Service) DeleteShortcut(ctx context.Context, request *apiv2pb.Dele return nil, status.Errorf(codes.Internal, "failed to get current user, err: %v", err) } shortcut, err := s.Store.GetShortcut(ctx, &store.FindShortcut{ - ID: &request.Id, + Name: &request.Name, }) if err != nil { return nil, status.Errorf(codes.Internal, "failed to get shortcut by name: %v", err) @@ -223,7 +255,7 @@ func (s *APIV2Service) DeleteShortcut(ctx context.Context, request *apiv2pb.Dele func (s *APIV2Service) GetShortcutAnalytics(ctx context.Context, request *apiv2pb.GetShortcutAnalyticsRequest) (*apiv2pb.GetShortcutAnalyticsResponse, error) { shortcut, err := s.Store.GetShortcut(ctx, &store.FindShortcut{ - ID: &request.Id, + Name: &request.Name, }) if err != nil { return nil, status.Errorf(codes.Internal, "failed to get shortcut by name: %v", err) @@ -234,7 +266,7 @@ func (s *APIV2Service) GetShortcutAnalytics(ctx context.Context, request *apiv2p activities, err := s.Store.ListActivities(ctx, &store.FindActivity{ Type: store.ActivityShortcutView, - Where: []string{fmt.Sprintf("json_extract(payload, '$.shortcutId') = %d", request.Id)}, + Where: []string{fmt.Sprintf("json_extract(payload, '$.shortcutId') = %d", shortcut.Id)}, }) if err != nil { return nil, status.Errorf(codes.Internal, "failed to get activities, err: %v", err) diff --git a/frontend/web/src/components/AnalyticsView.tsx b/frontend/web/src/components/AnalyticsView.tsx index e979c82..2f3516d 100644 --- a/frontend/web/src/components/AnalyticsView.tsx +++ b/frontend/web/src/components/AnalyticsView.tsx @@ -6,18 +6,18 @@ import { GetShortcutAnalyticsResponse } from "@/types/proto/api/v2/shortcut_serv import Icon from "./Icon"; interface Props { - shortcutId: number; + shortcutName: string; className?: string; } const AnalyticsView: React.FC = (props: Props) => { - const { shortcutId, className } = props; + const { shortcutName, className } = props; const { t } = useTranslation(); const [analytics, setAnalytics] = useState(null); const [selectedDeviceTab, setSelectedDeviceTab] = useState<"os" | "browser">("browser"); useEffect(() => { - shortcutServiceClient.getShortcutAnalytics({ id: shortcutId }).then((response) => { + shortcutServiceClient.getShortcutAnalytics({ name: shortcutName }).then((response) => { setAnalytics(response); }); }, []); diff --git a/frontend/web/src/components/CreateShortcutDrawer.tsx b/frontend/web/src/components/CreateShortcutDrawer.tsx index a322b5b..823fa6f 100644 --- a/frontend/web/src/components/CreateShortcutDrawer.tsx +++ b/frontend/web/src/components/CreateShortcutDrawer.tsx @@ -25,7 +25,7 @@ import Icon from "./Icon"; import ResourceNameInput from "./ResourceNameInput"; interface Props { - shortcutId?: number; + shortcutName?: string; initialShortcut?: Partial; onClose: () => void; onConfirm?: () => void; @@ -36,7 +36,7 @@ interface State { } const CreateShortcutDrawer: React.FC = (props: Props) => { - const { onClose, onConfirm, shortcutId, initialShortcut } = props; + const { onClose, onConfirm, shortcutName, initialShortcut } = props; const { t } = useTranslation(); const [state, setState] = useState({ shortcutCreate: Shortcut.fromPartial({ @@ -54,13 +54,13 @@ const CreateShortcutDrawer: React.FC = (props: Props) => { const shortcutList = shortcutStore.getShortcutList(); const [tag, setTag] = useState(""); const tagSuggestions = uniq(shortcutList.map((shortcut) => shortcut.tags).flat()); - const isCreating = isUndefined(shortcutId); + const isCreating = isUndefined(shortcutName); const loadingState = useLoading(!isCreating); const requestState = useLoading(false); useEffect(() => { - if (shortcutId) { - const shortcut = shortcutStore.getShortcutById(shortcutId); + if (shortcutName) { + const shortcut = shortcutStore.getShortcutByName(shortcutName); if (shortcut) { setState({ ...state, @@ -77,7 +77,7 @@ const CreateShortcutDrawer: React.FC = (props: Props) => { loadingState.setFinish(); } } - }, [shortcutId]); + }, [shortcutName]); if (loadingState.isLoading) { return null; @@ -183,15 +183,15 @@ const CreateShortcutDrawer: React.FC = (props: Props) => { } try { - if (shortcutId) { + if (shortcutName) { const updatingShortcut = { ...state.shortcutCreate, - id: shortcutId, + name: shortcutName, tags: tag.split(" ").filter(Boolean), }; await shortcutStore.updateShortcut( updatingShortcut, - getShortcutUpdateMask(shortcutStore.getShortcutById(updatingShortcut.id), updatingShortcut) + getShortcutUpdateMask(shortcutStore.getShortcutByName(updatingShortcut.name), updatingShortcut) ); } else { await shortcutStore.createShortcut({ diff --git a/frontend/web/src/components/ShortcutActionsDropdown.tsx b/frontend/web/src/components/ShortcutActionsDropdown.tsx index fdc81f6..4945ab3 100644 --- a/frontend/web/src/components/ShortcutActionsDropdown.tsx +++ b/frontend/web/src/components/ShortcutActionsDropdown.tsx @@ -31,7 +31,7 @@ const ShortcutActionsDropdown = (props: Props) => { content: `Are you sure to delete shortcut \`${shortcut.name}\`? You cannot undo this action.`, style: "danger", onConfirm: async () => { - await shortcutStore.deleteShortcut(shortcut.id); + await shortcutStore.deleteShortcut(shortcut.name); }, }); }; @@ -82,7 +82,7 @@ const ShortcutActionsDropdown = (props: Props) => { {showEditDrawer && ( setShowEditDrawer(false)} onConfirm={() => setShowEditDrawer(false)} /> diff --git a/frontend/web/src/components/ShortcutCard.tsx b/frontend/web/src/components/ShortcutCard.tsx index 3610628..b900e6a 100644 --- a/frontend/web/src/components/ShortcutCard.tsx +++ b/frontend/web/src/components/ShortcutCard.tsx @@ -37,7 +37,10 @@ const ShortcutCard = (props: Props) => { >
- + {favicon ? ( ) : ( @@ -120,7 +123,7 @@ const ShortcutCard = (props: Props) => { diff --git a/frontend/web/src/helpers/utils.ts b/frontend/web/src/helpers/utils.ts index dd7f03a..f019514 100644 --- a/frontend/web/src/helpers/utils.ts +++ b/frontend/web/src/helpers/utils.ts @@ -10,6 +10,11 @@ export const absolutifyLink = (rel: string): string => { return anchor.href; }; +export const isURL = (str: string): boolean => { + const urlRegex = /^(https?|ftp):\/\/[^\s/$.?#].[^\s]*$/i; + return urlRegex.test(str); +}; + export const releaseGuard = () => { return import.meta.env.MODE === "development"; }; diff --git a/frontend/web/src/pages/CollectionSpace.tsx b/frontend/web/src/pages/CollectionSpace.tsx index 23aa1a7..45522fc 100644 --- a/frontend/web/src/pages/CollectionSpace.tsx +++ b/frontend/web/src/pages/CollectionSpace.tsx @@ -14,7 +14,8 @@ import { Collection } from "@/types/proto/api/v2/collection_service"; import { Shortcut } from "@/types/proto/api/v2/shortcut_service"; const CollectionSpace = () => { - const { collectionName } = useParams(); + const params = useParams(); + const collectionName = params["*"]; const { sm } = useResponsiveWidth(); const userStore = useUserStore(); const collectionStore = useCollectionStore(); @@ -36,7 +37,7 @@ const CollectionSpace = () => { setShortcuts([]); for (const shortcutId of collection.shortcutIds) { try { - const shortcut = await shortcutStore.getOrFetchShortcutById(shortcutId); + const shortcut = await shortcutStore.fetchShortcutById(shortcutId); setShortcuts((shortcuts) => { return [...shortcuts, shortcut]; }); diff --git a/frontend/web/src/pages/ShortcutDetail.tsx b/frontend/web/src/pages/ShortcutDetail.tsx index e91ea06..b091b98 100644 --- a/frontend/web/src/pages/ShortcutDetail.tsx +++ b/frontend/web/src/pages/ShortcutDetail.tsx @@ -28,11 +28,11 @@ interface State { const ShortcutDetail = () => { const { t } = useTranslation(); const params = useParams(); + const shortcutName = params["*"] || ""; const navigateTo = useNavigateTo(); - const shortcutId = Number(params.shortcutId); const shortcutStore = useShortcutStore(); const userStore = useUserStore(); - const shortcut = shortcutStore.getShortcutById(shortcutId); + const shortcut = shortcutStore.getShortcutByName(shortcutName); const currentUser = useUserStore().getCurrentUser(); const [state, setState] = useState({ showEditDrawer: false, @@ -46,11 +46,11 @@ const ShortcutDetail = () => { useEffect(() => { (async () => { - const shortcut = await shortcutStore.getOrFetchShortcutById(shortcutId); + const shortcut = await shortcutStore.getOrFetchShortcutByName(shortcutName); await userStore.getOrFetchUserById(shortcut.creatorId); loadingState.setFinish(); })(); - }, [shortcutId]); + }, [shortcutName]); if (loadingState.isLoading) { return null; @@ -67,7 +67,7 @@ const ShortcutDetail = () => { content: `Are you sure to delete shortcut \`${shortcut.name}\`? You cannot undo this action.`, style: "danger", onConfirm: async () => { - await shortcutStore.deleteShortcut(shortcut.id); + await shortcutStore.deleteShortcut(shortcut.name); navigateTo("/", { replace: true, }); @@ -198,7 +198,7 @@ const ShortcutDetail = () => { {t("analytics.self")} - +
@@ -206,7 +206,7 @@ const ShortcutDetail = () => { {state.showEditDrawer && ( setState({ ...state, diff --git a/frontend/web/src/pages/ShortcutSpace.tsx b/frontend/web/src/pages/ShortcutSpace.tsx new file mode 100644 index 0000000..31fb2b0 --- /dev/null +++ b/frontend/web/src/pages/ShortcutSpace.tsx @@ -0,0 +1,36 @@ +import { useEffect } from "react"; +import toast from "react-hot-toast"; +import { useParams } from "react-router-dom"; +import { isURL } from "@/helpers/utils"; +import useShortcutStore from "@/stores/v1/shortcut"; + +const ShortcutSpace = () => { + const params = useParams(); + const shortcutName = params["*"] || ""; + const shortcutStore = useShortcutStore(); + const shortcut = shortcutStore.getShortcutByName(shortcutName); + + useEffect(() => { + (async () => { + try { + await shortcutStore.getOrFetchShortcutByName(shortcutName); + } catch (error: any) { + console.error(error); + toast.error(error.details); + } + })(); + }, [shortcutName]); + + if (!shortcut) { + return null; + } + + if (isURL(shortcut.link)) { + window.location.href = shortcut.link; + return null; + } + + return
{shortcut.link}
; +}; + +export default ShortcutSpace; diff --git a/frontend/web/src/routers/index.tsx b/frontend/web/src/routers/index.tsx index 2e3b0e1..21e7c7c 100644 --- a/frontend/web/src/routers/index.tsx +++ b/frontend/web/src/routers/index.tsx @@ -2,6 +2,7 @@ import { createBrowserRouter } from "react-router-dom"; import CollectionDashboard from "@/pages/CollectionDashboard"; import CollectionSpace from "@/pages/CollectionSpace"; import NotFound from "@/pages/NotFound"; +import ShortcutSpace from "@/pages/ShortcutSpace"; import SignIn from "@/pages/SignIn"; import SignUp from "@/pages/SignUp"; import SubscriptionSetting from "@/pages/SubscriptionSetting"; @@ -38,7 +39,7 @@ const router = createBrowserRouter([ element: , }, { - path: "/shortcut/:shortcutId", + path: "/shortcut/*", element: , }, { @@ -56,7 +57,11 @@ const router = createBrowserRouter([ ], }, { - path: "c/:collectionName", + path: "s/*", + element: , + }, + { + path: "c/*", element: , }, { diff --git a/frontend/web/src/stores/v1/shortcut.ts b/frontend/web/src/stores/v1/shortcut.ts index 60878e4..0e219fa 100644 --- a/frontend/web/src/stores/v1/shortcut.ts +++ b/frontend/web/src/stores/v1/shortcut.ts @@ -4,50 +4,61 @@ import { shortcutServiceClient } from "@/grpcweb"; import { Shortcut } from "@/types/proto/api/v2/shortcut_service"; interface ShortcutState { - shortcutMapById: Record; + shortcutMapByName: Record; fetchShortcutList: () => Promise; - getOrFetchShortcutById: (id: number) => Promise; - getShortcutById: (id: number) => Shortcut; + fetchShortcutById: (id: number) => Promise; + getOrFetchShortcutByName: (name: string) => Promise; + getShortcutByName: (name: string) => Shortcut; getShortcutList: () => Shortcut[]; createShortcut: (shortcut: Shortcut) => Promise; updateShortcut: (shortcut: Partial, updateMask: string[]) => Promise; - deleteShortcut: (id: number) => Promise; + deleteShortcut: (name: string) => Promise; } const useShortcutStore = create()((set, get) => ({ shortcutMapById: {}, + shortcutMapByName: {}, fetchShortcutList: async () => { const { shortcuts } = await shortcutServiceClient.listShortcuts({}); - const shortcutMap = get().shortcutMapById; + const shortcutMap = get().shortcutMapByName; shortcuts.forEach((shortcut) => { - shortcutMap[shortcut.id] = shortcut; + shortcutMap[shortcut.name] = shortcut; }); set(shortcutMap); return shortcuts; }, - getOrFetchShortcutById: async (id: number) => { - const shortcutMap = get().shortcutMapById; - if (shortcutMap[id]) { - return shortcutMap[id] as Shortcut; - } - - const { shortcut } = await shortcutServiceClient.getShortcut({ + fetchShortcutById: async (id: number) => { + const { shortcut } = await shortcutServiceClient.getShortcutById({ id: id, }); if (!shortcut) { throw new Error(`Shortcut with id ${id} not found`); } + return shortcut; + }, + getOrFetchShortcutByName: async (name: string) => { + const shortcutMap = get().shortcutMapByName; + if (shortcutMap[name]) { + return shortcutMap[name] as Shortcut; + } - shortcutMap[id] = shortcut; + const { shortcut } = await shortcutServiceClient.getShortcut({ + name, + }); + if (!shortcut) { + throw new Error(`Shortcut with name ${name} not found`); + } + + shortcutMap[name] = shortcut; set(shortcutMap); return shortcut; }, - getShortcutById: (id: number) => { - const shortcutMap = get().shortcutMapById; - return shortcutMap[id] || unknownShortcut; + getShortcutByName: (name: string) => { + const shortcutMap = get().shortcutMapByName; + return shortcutMap[name] || unknownShortcut; }, getShortcutList: () => { - return Object.values(get().shortcutMapById); + return Object.values(get().shortcutMapByName); }, createShortcut: async (shortcut: Shortcut) => { const { shortcut: createdShortcut } = await shortcutServiceClient.createShortcut({ @@ -56,8 +67,8 @@ const useShortcutStore = create()((set, get) => ({ if (!createdShortcut) { throw new Error(`Failed to create shortcut`); } - const shortcutMap = get().shortcutMapById; - shortcutMap[createdShortcut.id] = createdShortcut; + const shortcutMap = get().shortcutMapByName; + shortcutMap[createdShortcut.name] = createdShortcut; set(shortcutMap); return createdShortcut; }, @@ -69,17 +80,17 @@ const useShortcutStore = create()((set, get) => ({ if (!updatedShortcut) { throw new Error(`Failed to update shortcut`); } - const shortcutMap = get().shortcutMapById; - shortcutMap[updatedShortcut.id] = updatedShortcut; + const shortcutMap = get().shortcutMapByName; + shortcutMap[updatedShortcut.name] = updatedShortcut; set(shortcutMap); return updatedShortcut; }, - deleteShortcut: async (id: number) => { + deleteShortcut: async (name: string) => { await shortcutServiceClient.deleteShortcut({ - id: id, + name, }); - const shortcutMap = get().shortcutMapById; - delete shortcutMap[id]; + const shortcutMap = get().shortcutMapByName; + delete shortcutMap[name]; set(shortcutMap); }, })); diff --git a/frontend/web/vite.config.ts b/frontend/web/vite.config.ts index 28c6fab..eff5cfe 100644 --- a/frontend/web/vite.config.ts +++ b/frontend/web/vite.config.ts @@ -23,10 +23,6 @@ export default defineConfig({ target: devProxyServer, xfwd: true, }, - "^/s/": { - target: devProxyServer, - xfwd: true, - }, }, }, resolve: { diff --git a/proto/api/v2/shortcut_service.proto b/proto/api/v2/shortcut_service.proto index 010b820..cee5afb 100644 --- a/proto/api/v2/shortcut_service.proto +++ b/proto/api/v2/shortcut_service.proto @@ -15,11 +15,13 @@ service ShortcutService { rpc ListShortcuts(ListShortcutsRequest) returns (ListShortcutsResponse) { option (google.api.http) = {get: "/api/v2/shortcuts"}; } - // GetShortcut returns a shortcut by id. + // GetShortcut returns a shortcut by name. rpc GetShortcut(GetShortcutRequest) returns (GetShortcutResponse) { - option (google.api.http) = {get: "/api/v2/shortcuts/{id}"}; - option (google.api.method_signature) = "id"; + option (google.api.http) = {get: "/api/v2/shortcuts/{name}"}; + option (google.api.method_signature) = "name"; } + // GetShortcutById returns a shortcut by id. + rpc GetShortcutById(GetShortcutByIdRequest) returns (GetShortcutByIdResponse) {} // CreateShortcut creates a shortcut. rpc CreateShortcut(CreateShortcutRequest) returns (CreateShortcutResponse) { option (google.api.http) = { @@ -30,20 +32,20 @@ service ShortcutService { // UpdateShortcut updates a shortcut. rpc UpdateShortcut(UpdateShortcutRequest) returns (UpdateShortcutResponse) { option (google.api.http) = { - put: "/api/v2/shortcuts/{shortcut.id}" + put: "/api/v2/shortcuts/{shortcut.name}" body: "shortcut" }; option (google.api.method_signature) = "shortcut,update_mask"; } - // DeleteShortcut deletes a shortcut by id. + // DeleteShortcut deletes a shortcut by name. rpc DeleteShortcut(DeleteShortcutRequest) returns (DeleteShortcutResponse) { - option (google.api.http) = {delete: "/api/v2/shortcuts/{id}"}; - option (google.api.method_signature) = "id"; + option (google.api.http) = {delete: "/api/v2/shortcuts/{name}"}; + option (google.api.method_signature) = "name"; } // GetShortcutAnalytics returns the analytics for a shortcut. rpc GetShortcutAnalytics(GetShortcutAnalyticsRequest) returns (GetShortcutAnalyticsResponse) { - option (google.api.http) = {get: "/api/v2/shortcuts/{id}/analytics"}; - option (google.api.method_signature) = "id"; + option (google.api.http) = {get: "/api/v2/shortcuts/{name}/analytics"}; + option (google.api.method_signature) = "name"; } } @@ -90,13 +92,21 @@ message ListShortcutsResponse { } message GetShortcutRequest { - int32 id = 1; + string name = 1; } message GetShortcutResponse { Shortcut shortcut = 1; } +message GetShortcutByIdRequest { + int32 id = 1; +} + +message GetShortcutByIdResponse { + Shortcut shortcut = 1; +} + message CreateShortcutRequest { Shortcut shortcut = 1; } @@ -116,13 +126,13 @@ message UpdateShortcutResponse { } message DeleteShortcutRequest { - int32 id = 1; + string name = 1; } message DeleteShortcutResponse {} message GetShortcutAnalyticsRequest { - int32 id = 1; + string name = 1; } message GetShortcutAnalyticsResponse { diff --git a/proto/gen/api/v2/README.md b/proto/gen/api/v2/README.md index 8e7b170..5157b1a 100644 --- a/proto/gen/api/v2/README.md +++ b/proto/gen/api/v2/README.md @@ -83,6 +83,8 @@ - [GetShortcutAnalyticsRequest](#slash-api-v2-GetShortcutAnalyticsRequest) - [GetShortcutAnalyticsResponse](#slash-api-v2-GetShortcutAnalyticsResponse) - [GetShortcutAnalyticsResponse.AnalyticsItem](#slash-api-v2-GetShortcutAnalyticsResponse-AnalyticsItem) + - [GetShortcutByIdRequest](#slash-api-v2-GetShortcutByIdRequest) + - [GetShortcutByIdResponse](#slash-api-v2-GetShortcutByIdResponse) - [GetShortcutRequest](#slash-api-v2-GetShortcutRequest) - [GetShortcutResponse](#slash-api-v2-GetShortcutResponse) - [ListShortcutsRequest](#slash-api-v2-ListShortcutsRequest) @@ -1094,7 +1096,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| id | [int32](#int32) | | | +| name | [string](#string) | | | @@ -1119,7 +1121,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| id | [int32](#int32) | | | +| name | [string](#string) | | | @@ -1159,6 +1161,36 @@ + + +### GetShortcutByIdRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| id | [int32](#int32) | | | + + + + + + + + +### GetShortcutByIdResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| shortcut | [Shortcut](#slash-api-v2-Shortcut) | | | + + + + + + ### GetShortcutRequest @@ -1167,7 +1199,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| id | [int32](#int32) | | | +| name | [string](#string) | | | @@ -1303,10 +1335,11 @@ | Method Name | Request Type | Response Type | Description | | ----------- | ------------ | ------------- | ------------| | ListShortcuts | [ListShortcutsRequest](#slash-api-v2-ListShortcutsRequest) | [ListShortcutsResponse](#slash-api-v2-ListShortcutsResponse) | ListShortcuts returns a list of shortcuts. | -| GetShortcut | [GetShortcutRequest](#slash-api-v2-GetShortcutRequest) | [GetShortcutResponse](#slash-api-v2-GetShortcutResponse) | GetShortcut returns a shortcut by id. | +| GetShortcut | [GetShortcutRequest](#slash-api-v2-GetShortcutRequest) | [GetShortcutResponse](#slash-api-v2-GetShortcutResponse) | GetShortcut returns a shortcut by name. | +| GetShortcutById | [GetShortcutByIdRequest](#slash-api-v2-GetShortcutByIdRequest) | [GetShortcutByIdResponse](#slash-api-v2-GetShortcutByIdResponse) | GetShortcutById returns a shortcut by id. | | CreateShortcut | [CreateShortcutRequest](#slash-api-v2-CreateShortcutRequest) | [CreateShortcutResponse](#slash-api-v2-CreateShortcutResponse) | CreateShortcut creates a shortcut. | | UpdateShortcut | [UpdateShortcutRequest](#slash-api-v2-UpdateShortcutRequest) | [UpdateShortcutResponse](#slash-api-v2-UpdateShortcutResponse) | UpdateShortcut updates a shortcut. | -| DeleteShortcut | [DeleteShortcutRequest](#slash-api-v2-DeleteShortcutRequest) | [DeleteShortcutResponse](#slash-api-v2-DeleteShortcutResponse) | DeleteShortcut deletes a shortcut by id. | +| DeleteShortcut | [DeleteShortcutRequest](#slash-api-v2-DeleteShortcutRequest) | [DeleteShortcutResponse](#slash-api-v2-DeleteShortcutResponse) | DeleteShortcut deletes a shortcut by name. | | GetShortcutAnalytics | [GetShortcutAnalyticsRequest](#slash-api-v2-GetShortcutAnalyticsRequest) | [GetShortcutAnalyticsResponse](#slash-api-v2-GetShortcutAnalyticsResponse) | GetShortcutAnalytics returns the analytics for a shortcut. | diff --git a/proto/gen/api/v2/shortcut_service.pb.go b/proto/gen/api/v2/shortcut_service.pb.go index d6271f3..8fa7417 100644 --- a/proto/gen/api/v2/shortcut_service.pb.go +++ b/proto/gen/api/v2/shortcut_service.pb.go @@ -319,7 +319,7 @@ type GetShortcutRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` } func (x *GetShortcutRequest) Reset() { @@ -354,11 +354,11 @@ func (*GetShortcutRequest) Descriptor() ([]byte, []int) { return file_api_v2_shortcut_service_proto_rawDescGZIP(), []int{4} } -func (x *GetShortcutRequest) GetId() int32 { +func (x *GetShortcutRequest) GetName() string { if x != nil { - return x.Id + return x.Name } - return 0 + return "" } type GetShortcutResponse struct { @@ -408,6 +408,100 @@ func (x *GetShortcutResponse) GetShortcut() *Shortcut { return nil } +type GetShortcutByIdRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *GetShortcutByIdRequest) Reset() { + *x = GetShortcutByIdRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v2_shortcut_service_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetShortcutByIdRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetShortcutByIdRequest) ProtoMessage() {} + +func (x *GetShortcutByIdRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v2_shortcut_service_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetShortcutByIdRequest.ProtoReflect.Descriptor instead. +func (*GetShortcutByIdRequest) Descriptor() ([]byte, []int) { + return file_api_v2_shortcut_service_proto_rawDescGZIP(), []int{6} +} + +func (x *GetShortcutByIdRequest) GetId() int32 { + if x != nil { + return x.Id + } + return 0 +} + +type GetShortcutByIdResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Shortcut *Shortcut `protobuf:"bytes,1,opt,name=shortcut,proto3" json:"shortcut,omitempty"` +} + +func (x *GetShortcutByIdResponse) Reset() { + *x = GetShortcutByIdResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v2_shortcut_service_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetShortcutByIdResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetShortcutByIdResponse) ProtoMessage() {} + +func (x *GetShortcutByIdResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v2_shortcut_service_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetShortcutByIdResponse.ProtoReflect.Descriptor instead. +func (*GetShortcutByIdResponse) Descriptor() ([]byte, []int) { + return file_api_v2_shortcut_service_proto_rawDescGZIP(), []int{7} +} + +func (x *GetShortcutByIdResponse) GetShortcut() *Shortcut { + if x != nil { + return x.Shortcut + } + return nil +} + type CreateShortcutRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -419,7 +513,7 @@ type CreateShortcutRequest struct { func (x *CreateShortcutRequest) Reset() { *x = CreateShortcutRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v2_shortcut_service_proto_msgTypes[6] + mi := &file_api_v2_shortcut_service_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -432,7 +526,7 @@ func (x *CreateShortcutRequest) String() string { func (*CreateShortcutRequest) ProtoMessage() {} func (x *CreateShortcutRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v2_shortcut_service_proto_msgTypes[6] + mi := &file_api_v2_shortcut_service_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -445,7 +539,7 @@ func (x *CreateShortcutRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateShortcutRequest.ProtoReflect.Descriptor instead. func (*CreateShortcutRequest) Descriptor() ([]byte, []int) { - return file_api_v2_shortcut_service_proto_rawDescGZIP(), []int{6} + return file_api_v2_shortcut_service_proto_rawDescGZIP(), []int{8} } func (x *CreateShortcutRequest) GetShortcut() *Shortcut { @@ -466,7 +560,7 @@ type CreateShortcutResponse struct { func (x *CreateShortcutResponse) Reset() { *x = CreateShortcutResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v2_shortcut_service_proto_msgTypes[7] + mi := &file_api_v2_shortcut_service_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -479,7 +573,7 @@ func (x *CreateShortcutResponse) String() string { func (*CreateShortcutResponse) ProtoMessage() {} func (x *CreateShortcutResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v2_shortcut_service_proto_msgTypes[7] + mi := &file_api_v2_shortcut_service_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -492,7 +586,7 @@ func (x *CreateShortcutResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateShortcutResponse.ProtoReflect.Descriptor instead. func (*CreateShortcutResponse) Descriptor() ([]byte, []int) { - return file_api_v2_shortcut_service_proto_rawDescGZIP(), []int{7} + return file_api_v2_shortcut_service_proto_rawDescGZIP(), []int{9} } func (x *CreateShortcutResponse) GetShortcut() *Shortcut { @@ -514,7 +608,7 @@ type UpdateShortcutRequest struct { func (x *UpdateShortcutRequest) Reset() { *x = UpdateShortcutRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v2_shortcut_service_proto_msgTypes[8] + mi := &file_api_v2_shortcut_service_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -527,7 +621,7 @@ func (x *UpdateShortcutRequest) String() string { func (*UpdateShortcutRequest) ProtoMessage() {} func (x *UpdateShortcutRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v2_shortcut_service_proto_msgTypes[8] + mi := &file_api_v2_shortcut_service_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -540,7 +634,7 @@ func (x *UpdateShortcutRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateShortcutRequest.ProtoReflect.Descriptor instead. func (*UpdateShortcutRequest) Descriptor() ([]byte, []int) { - return file_api_v2_shortcut_service_proto_rawDescGZIP(), []int{8} + return file_api_v2_shortcut_service_proto_rawDescGZIP(), []int{10} } func (x *UpdateShortcutRequest) GetShortcut() *Shortcut { @@ -568,7 +662,7 @@ type UpdateShortcutResponse struct { func (x *UpdateShortcutResponse) Reset() { *x = UpdateShortcutResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v2_shortcut_service_proto_msgTypes[9] + mi := &file_api_v2_shortcut_service_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -581,7 +675,7 @@ func (x *UpdateShortcutResponse) String() string { func (*UpdateShortcutResponse) ProtoMessage() {} func (x *UpdateShortcutResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v2_shortcut_service_proto_msgTypes[9] + mi := &file_api_v2_shortcut_service_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -594,7 +688,7 @@ func (x *UpdateShortcutResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateShortcutResponse.ProtoReflect.Descriptor instead. func (*UpdateShortcutResponse) Descriptor() ([]byte, []int) { - return file_api_v2_shortcut_service_proto_rawDescGZIP(), []int{9} + return file_api_v2_shortcut_service_proto_rawDescGZIP(), []int{11} } func (x *UpdateShortcutResponse) GetShortcut() *Shortcut { @@ -609,13 +703,13 @@ type DeleteShortcutRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` } func (x *DeleteShortcutRequest) Reset() { *x = DeleteShortcutRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v2_shortcut_service_proto_msgTypes[10] + mi := &file_api_v2_shortcut_service_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -628,7 +722,7 @@ func (x *DeleteShortcutRequest) String() string { func (*DeleteShortcutRequest) ProtoMessage() {} func (x *DeleteShortcutRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v2_shortcut_service_proto_msgTypes[10] + mi := &file_api_v2_shortcut_service_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -641,14 +735,14 @@ func (x *DeleteShortcutRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteShortcutRequest.ProtoReflect.Descriptor instead. func (*DeleteShortcutRequest) Descriptor() ([]byte, []int) { - return file_api_v2_shortcut_service_proto_rawDescGZIP(), []int{10} + return file_api_v2_shortcut_service_proto_rawDescGZIP(), []int{12} } -func (x *DeleteShortcutRequest) GetId() int32 { +func (x *DeleteShortcutRequest) GetName() string { if x != nil { - return x.Id + return x.Name } - return 0 + return "" } type DeleteShortcutResponse struct { @@ -660,7 +754,7 @@ type DeleteShortcutResponse struct { func (x *DeleteShortcutResponse) Reset() { *x = DeleteShortcutResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v2_shortcut_service_proto_msgTypes[11] + mi := &file_api_v2_shortcut_service_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -673,7 +767,7 @@ func (x *DeleteShortcutResponse) String() string { func (*DeleteShortcutResponse) ProtoMessage() {} func (x *DeleteShortcutResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v2_shortcut_service_proto_msgTypes[11] + mi := &file_api_v2_shortcut_service_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -686,7 +780,7 @@ func (x *DeleteShortcutResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteShortcutResponse.ProtoReflect.Descriptor instead. func (*DeleteShortcutResponse) Descriptor() ([]byte, []int) { - return file_api_v2_shortcut_service_proto_rawDescGZIP(), []int{11} + return file_api_v2_shortcut_service_proto_rawDescGZIP(), []int{13} } type GetShortcutAnalyticsRequest struct { @@ -694,13 +788,13 @@ type GetShortcutAnalyticsRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` } func (x *GetShortcutAnalyticsRequest) Reset() { *x = GetShortcutAnalyticsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v2_shortcut_service_proto_msgTypes[12] + mi := &file_api_v2_shortcut_service_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -713,7 +807,7 @@ func (x *GetShortcutAnalyticsRequest) String() string { func (*GetShortcutAnalyticsRequest) ProtoMessage() {} func (x *GetShortcutAnalyticsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v2_shortcut_service_proto_msgTypes[12] + mi := &file_api_v2_shortcut_service_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -726,14 +820,14 @@ func (x *GetShortcutAnalyticsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetShortcutAnalyticsRequest.ProtoReflect.Descriptor instead. func (*GetShortcutAnalyticsRequest) Descriptor() ([]byte, []int) { - return file_api_v2_shortcut_service_proto_rawDescGZIP(), []int{12} + return file_api_v2_shortcut_service_proto_rawDescGZIP(), []int{14} } -func (x *GetShortcutAnalyticsRequest) GetId() int32 { +func (x *GetShortcutAnalyticsRequest) GetName() string { if x != nil { - return x.Id + return x.Name } - return 0 + return "" } type GetShortcutAnalyticsResponse struct { @@ -749,7 +843,7 @@ type GetShortcutAnalyticsResponse struct { func (x *GetShortcutAnalyticsResponse) Reset() { *x = GetShortcutAnalyticsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v2_shortcut_service_proto_msgTypes[13] + mi := &file_api_v2_shortcut_service_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -762,7 +856,7 @@ func (x *GetShortcutAnalyticsResponse) String() string { func (*GetShortcutAnalyticsResponse) ProtoMessage() {} func (x *GetShortcutAnalyticsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v2_shortcut_service_proto_msgTypes[13] + mi := &file_api_v2_shortcut_service_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -775,7 +869,7 @@ func (x *GetShortcutAnalyticsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetShortcutAnalyticsResponse.ProtoReflect.Descriptor instead. func (*GetShortcutAnalyticsResponse) Descriptor() ([]byte, []int) { - return file_api_v2_shortcut_service_proto_rawDescGZIP(), []int{13} + return file_api_v2_shortcut_service_proto_rawDescGZIP(), []int{15} } func (x *GetShortcutAnalyticsResponse) GetReferences() []*GetShortcutAnalyticsResponse_AnalyticsItem { @@ -811,7 +905,7 @@ type GetShortcutAnalyticsResponse_AnalyticsItem struct { func (x *GetShortcutAnalyticsResponse_AnalyticsItem) Reset() { *x = GetShortcutAnalyticsResponse_AnalyticsItem{} if protoimpl.UnsafeEnabled { - mi := &file_api_v2_shortcut_service_proto_msgTypes[14] + mi := &file_api_v2_shortcut_service_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -824,7 +918,7 @@ func (x *GetShortcutAnalyticsResponse_AnalyticsItem) String() string { func (*GetShortcutAnalyticsResponse_AnalyticsItem) ProtoMessage() {} func (x *GetShortcutAnalyticsResponse_AnalyticsItem) ProtoReflect() protoreflect.Message { - mi := &file_api_v2_shortcut_service_proto_msgTypes[14] + mi := &file_api_v2_shortcut_service_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -837,7 +931,7 @@ func (x *GetShortcutAnalyticsResponse_AnalyticsItem) ProtoReflect() protoreflect // Deprecated: Use GetShortcutAnalyticsResponse_AnalyticsItem.ProtoReflect.Descriptor instead. func (*GetShortcutAnalyticsResponse_AnalyticsItem) Descriptor() ([]byte, []int) { - return file_api_v2_shortcut_service_proto_rawDescGZIP(), []int{13, 0} + return file_api_v2_shortcut_service_proto_rawDescGZIP(), []int{15, 0} } func (x *GetShortcutAnalyticsResponse_AnalyticsItem) GetName() string { @@ -913,131 +1007,146 @@ var file_api_v2_shortcut_service_proto_rawDesc = []byte{ 0x65, 0x12, 0x34, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x52, 0x09, 0x73, 0x68, - 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x73, 0x22, 0x24, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x53, 0x68, - 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x22, 0x49, 0x0a, - 0x13, 0x47, 0x65, 0x74, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x52, 0x08, - 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x22, 0x4b, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x32, 0x0a, 0x08, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x52, 0x08, 0x73, 0x68, 0x6f, - 0x72, 0x74, 0x63, 0x75, 0x74, 0x22, 0x4c, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, - 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x32, 0x0a, 0x08, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x52, 0x08, 0x73, 0x68, 0x6f, 0x72, 0x74, - 0x63, 0x75, 0x74, 0x22, 0x88, 0x01, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, - 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, - 0x08, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x53, - 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x52, 0x08, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, - 0x74, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, - 0x73, 0x6b, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x4c, - 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, + 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x73, 0x22, 0x28, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x53, 0x68, + 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x49, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, - 0x75, 0x74, 0x52, 0x08, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x22, 0x27, 0x0a, 0x15, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x02, 0x69, 0x64, 0x22, 0x18, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, - 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x2d, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x41, 0x6e, - 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x22, 0xdd, - 0x02, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x41, 0x6e, - 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x58, 0x0a, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x41, 0x6e, - 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, - 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x0a, 0x72, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x52, 0x0a, 0x07, 0x64, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x73, 0x6c, 0x61, - 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x6f, - 0x72, 0x74, 0x63, 0x75, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, - 0x49, 0x74, 0x65, 0x6d, 0x52, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x54, 0x0a, - 0x08, 0x62, 0x72, 0x6f, 0x77, 0x73, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x75, 0x74, 0x52, 0x08, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x22, 0x28, 0x0a, 0x16, + 0x47, 0x65, 0x74, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x42, 0x79, 0x49, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x22, 0x4d, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x53, 0x68, 0x6f, + 0x72, 0x74, 0x63, 0x75, 0x74, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x32, 0x0a, 0x08, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x52, 0x08, 0x73, 0x68, 0x6f, + 0x72, 0x74, 0x63, 0x75, 0x74, 0x22, 0x4b, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, + 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, + 0x0a, 0x08, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x52, 0x08, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, + 0x75, 0x74, 0x22, 0x4c, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, 0x6f, 0x72, + 0x74, 0x63, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x08, + 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x68, + 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x52, 0x08, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, + 0x22, 0x88, 0x01, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x6f, 0x72, 0x74, + 0x63, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x08, 0x73, 0x68, + 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x73, + 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x68, 0x6f, 0x72, + 0x74, 0x63, 0x75, 0x74, 0x52, 0x08, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x12, 0x3b, + 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, + 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x4c, 0x0a, 0x16, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x52, + 0x08, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x22, 0x2b, 0x0a, 0x15, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x18, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x31, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x41, + 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0xdd, 0x02, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x53, 0x68, 0x6f, 0x72, 0x74, + 0x63, 0x75, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x6f, 0x72, 0x74, + 0x63, 0x75, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x49, 0x74, + 0x65, 0x6d, 0x52, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x52, + 0x0a, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x41, 0x6e, 0x61, 0x6c, - 0x79, 0x74, 0x69, 0x63, 0x73, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x08, 0x62, 0x72, 0x6f, 0x77, 0x73, - 0x65, 0x72, 0x73, 0x1a, 0x39, 0x0a, 0x0d, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, - 0x49, 0x74, 0x65, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x32, 0xcc, - 0x06, 0x0a, 0x0f, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x73, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, - 0x75, 0x74, 0x73, 0x12, 0x22, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x68, 0x6f, 0x72, 0x74, - 0x63, 0x75, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x73, 0x68, - 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x73, 0x12, 0x77, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, 0x68, - 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x12, 0x20, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x6f, 0x72, 0x74, - 0x63, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0xda, 0x41, 0x02, - 0x69, 0x64, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, - 0x32, 0x2f, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, - 0x12, 0x80, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, 0x6f, 0x72, 0x74, - 0x63, 0x75, 0x74, 0x12, 0x23, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, - 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x3a, 0x08, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, - 0x22, 0x11, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, - 0x75, 0x74, 0x73, 0x12, 0xa5, 0x01, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, - 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x12, 0x23, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x6f, 0x72, - 0x74, 0x63, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x73, 0x6c, - 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x48, 0xda, 0x41, 0x14, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x2c, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, - 0x3a, 0x08, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x1a, 0x1f, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x76, 0x32, 0x2f, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x73, 0x2f, 0x7b, 0x73, - 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x2e, 0x69, 0x64, 0x7d, 0x12, 0x80, 0x01, 0x0a, 0x0e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x12, 0x23, - 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x79, 0x74, 0x69, 0x63, 0x73, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x12, 0x54, 0x0a, 0x08, 0x62, 0x72, 0x6f, 0x77, 0x73, 0x65, 0x72, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x41, + 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x08, + 0x62, 0x72, 0x6f, 0x77, 0x73, 0x65, 0x72, 0x73, 0x1a, 0x39, 0x0a, 0x0d, 0x41, 0x6e, 0x61, 0x6c, + 0x79, 0x74, 0x69, 0x63, 0x73, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x32, 0xbc, 0x07, 0x0a, 0x0f, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x73, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x53, + 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x73, 0x12, 0x22, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x68, 0x6f, 0x72, + 0x74, 0x63, 0x75, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x73, + 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x76, 0x32, 0x2f, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x73, 0x12, 0x7b, 0x0a, 0x0b, + 0x47, 0x65, 0x74, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x12, 0x20, 0x2e, 0x73, 0x6c, + 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, + 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, + 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x27, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, + 0x18, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, + 0x74, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x60, 0x0a, 0x0f, 0x47, 0x65, 0x74, + 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x42, 0x79, 0x49, 0x64, 0x12, 0x24, 0x2e, 0x73, + 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x53, + 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x42, 0x79, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x42, 0x79, 0x49, + 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x80, 0x01, 0x0a, 0x0e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x12, 0x23, + 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0xda, 0x41, 0x02, 0x69, 0x64, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x2a, 0x16, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, - 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x9c, - 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x41, 0x6e, - 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x12, 0x29, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, - 0x75, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x41, 0x6e, 0x61, - 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, - 0xda, 0x41, 0x02, 0x69, 0x64, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x73, 0x2f, 0x7b, - 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x42, 0xb2, 0x01, - 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x42, 0x14, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x36, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x79, 0x6f, 0x75, 0x72, 0x73, 0x65, 0x6c, 0x66, 0x68, - 0x6f, 0x73, 0x74, 0x65, 0x64, 0x2f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x3b, 0x61, 0x70, 0x69, - 0x76, 0x32, 0xa2, 0x02, 0x03, 0x53, 0x41, 0x58, 0xaa, 0x02, 0x0c, 0x53, 0x6c, 0x61, 0x73, 0x68, - 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x56, 0x32, 0xca, 0x02, 0x0c, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x5c, - 0x41, 0x70, 0x69, 0x5c, 0x56, 0x32, 0xe2, 0x02, 0x18, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x5c, 0x41, - 0x70, 0x69, 0x5c, 0x56, 0x32, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0xea, 0x02, 0x0e, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x3a, 0x3a, 0x41, 0x70, 0x69, 0x3a, 0x3a, - 0x56, 0x32, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x76, 0x32, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x1d, 0x3a, 0x08, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x22, 0x11, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x73, 0x12, 0xa7, + 0x01, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, + 0x74, 0x12, 0x23, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x6f, 0x72, + 0x74, 0x63, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4a, 0xda, 0x41, + 0x14, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x2c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x3a, 0x08, 0x73, 0x68, 0x6f, + 0x72, 0x74, 0x63, 0x75, 0x74, 0x1a, 0x21, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x73, + 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x73, 0x2f, 0x7b, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, + 0x75, 0x74, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x84, 0x01, 0x0a, 0x0e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x12, 0x23, 0x2e, 0x73, 0x6c, + 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x24, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x2a, 0x18, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x73, + 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, + 0xa0, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x41, + 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x12, 0x29, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x6f, 0x72, 0x74, + 0x63, 0x75, 0x74, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x41, 0x6e, + 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x31, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x12, 0x22, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, + 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, + 0x63, 0x73, 0x42, 0xb2, 0x01, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x42, 0x14, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, + 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, + 0x36, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x79, 0x6f, 0x75, 0x72, + 0x73, 0x65, 0x6c, 0x66, 0x68, 0x6f, 0x73, 0x74, 0x65, 0x64, 0x2f, 0x73, 0x6c, 0x61, 0x73, 0x68, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, + 0x32, 0x3b, 0x61, 0x70, 0x69, 0x76, 0x32, 0xa2, 0x02, 0x03, 0x53, 0x41, 0x58, 0xaa, 0x02, 0x0c, + 0x53, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x56, 0x32, 0xca, 0x02, 0x0c, 0x53, + 0x6c, 0x61, 0x73, 0x68, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x32, 0xe2, 0x02, 0x18, 0x53, 0x6c, + 0x61, 0x73, 0x68, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x32, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x3a, 0x3a, + 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x56, 0x32, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1052,7 +1161,7 @@ func file_api_v2_shortcut_service_proto_rawDescGZIP() []byte { return file_api_v2_shortcut_service_proto_rawDescData } -var file_api_v2_shortcut_service_proto_msgTypes = make([]protoimpl.MessageInfo, 15) +var file_api_v2_shortcut_service_proto_msgTypes = make([]protoimpl.MessageInfo, 17) var file_api_v2_shortcut_service_proto_goTypes = []interface{}{ (*Shortcut)(nil), // 0: slash.api.v2.Shortcut (*OpenGraphMetadata)(nil), // 1: slash.api.v2.OpenGraphMetadata @@ -1060,53 +1169,58 @@ var file_api_v2_shortcut_service_proto_goTypes = []interface{}{ (*ListShortcutsResponse)(nil), // 3: slash.api.v2.ListShortcutsResponse (*GetShortcutRequest)(nil), // 4: slash.api.v2.GetShortcutRequest (*GetShortcutResponse)(nil), // 5: slash.api.v2.GetShortcutResponse - (*CreateShortcutRequest)(nil), // 6: slash.api.v2.CreateShortcutRequest - (*CreateShortcutResponse)(nil), // 7: slash.api.v2.CreateShortcutResponse - (*UpdateShortcutRequest)(nil), // 8: slash.api.v2.UpdateShortcutRequest - (*UpdateShortcutResponse)(nil), // 9: slash.api.v2.UpdateShortcutResponse - (*DeleteShortcutRequest)(nil), // 10: slash.api.v2.DeleteShortcutRequest - (*DeleteShortcutResponse)(nil), // 11: slash.api.v2.DeleteShortcutResponse - (*GetShortcutAnalyticsRequest)(nil), // 12: slash.api.v2.GetShortcutAnalyticsRequest - (*GetShortcutAnalyticsResponse)(nil), // 13: slash.api.v2.GetShortcutAnalyticsResponse - (*GetShortcutAnalyticsResponse_AnalyticsItem)(nil), // 14: slash.api.v2.GetShortcutAnalyticsResponse.AnalyticsItem - (*timestamppb.Timestamp)(nil), // 15: google.protobuf.Timestamp - (RowStatus)(0), // 16: slash.api.v2.RowStatus - (Visibility)(0), // 17: slash.api.v2.Visibility - (*fieldmaskpb.FieldMask)(nil), // 18: google.protobuf.FieldMask + (*GetShortcutByIdRequest)(nil), // 6: slash.api.v2.GetShortcutByIdRequest + (*GetShortcutByIdResponse)(nil), // 7: slash.api.v2.GetShortcutByIdResponse + (*CreateShortcutRequest)(nil), // 8: slash.api.v2.CreateShortcutRequest + (*CreateShortcutResponse)(nil), // 9: slash.api.v2.CreateShortcutResponse + (*UpdateShortcutRequest)(nil), // 10: slash.api.v2.UpdateShortcutRequest + (*UpdateShortcutResponse)(nil), // 11: slash.api.v2.UpdateShortcutResponse + (*DeleteShortcutRequest)(nil), // 12: slash.api.v2.DeleteShortcutRequest + (*DeleteShortcutResponse)(nil), // 13: slash.api.v2.DeleteShortcutResponse + (*GetShortcutAnalyticsRequest)(nil), // 14: slash.api.v2.GetShortcutAnalyticsRequest + (*GetShortcutAnalyticsResponse)(nil), // 15: slash.api.v2.GetShortcutAnalyticsResponse + (*GetShortcutAnalyticsResponse_AnalyticsItem)(nil), // 16: slash.api.v2.GetShortcutAnalyticsResponse.AnalyticsItem + (*timestamppb.Timestamp)(nil), // 17: google.protobuf.Timestamp + (RowStatus)(0), // 18: slash.api.v2.RowStatus + (Visibility)(0), // 19: slash.api.v2.Visibility + (*fieldmaskpb.FieldMask)(nil), // 20: google.protobuf.FieldMask } var file_api_v2_shortcut_service_proto_depIdxs = []int32{ - 15, // 0: slash.api.v2.Shortcut.created_time:type_name -> google.protobuf.Timestamp - 15, // 1: slash.api.v2.Shortcut.updated_time:type_name -> google.protobuf.Timestamp - 16, // 2: slash.api.v2.Shortcut.row_status:type_name -> slash.api.v2.RowStatus - 17, // 3: slash.api.v2.Shortcut.visibility:type_name -> slash.api.v2.Visibility + 17, // 0: slash.api.v2.Shortcut.created_time:type_name -> google.protobuf.Timestamp + 17, // 1: slash.api.v2.Shortcut.updated_time:type_name -> google.protobuf.Timestamp + 18, // 2: slash.api.v2.Shortcut.row_status:type_name -> slash.api.v2.RowStatus + 19, // 3: slash.api.v2.Shortcut.visibility:type_name -> slash.api.v2.Visibility 1, // 4: slash.api.v2.Shortcut.og_metadata:type_name -> slash.api.v2.OpenGraphMetadata 0, // 5: slash.api.v2.ListShortcutsResponse.shortcuts:type_name -> slash.api.v2.Shortcut 0, // 6: slash.api.v2.GetShortcutResponse.shortcut:type_name -> slash.api.v2.Shortcut - 0, // 7: slash.api.v2.CreateShortcutRequest.shortcut:type_name -> slash.api.v2.Shortcut - 0, // 8: slash.api.v2.CreateShortcutResponse.shortcut:type_name -> slash.api.v2.Shortcut - 0, // 9: slash.api.v2.UpdateShortcutRequest.shortcut:type_name -> slash.api.v2.Shortcut - 18, // 10: slash.api.v2.UpdateShortcutRequest.update_mask:type_name -> google.protobuf.FieldMask - 0, // 11: slash.api.v2.UpdateShortcutResponse.shortcut:type_name -> slash.api.v2.Shortcut - 14, // 12: slash.api.v2.GetShortcutAnalyticsResponse.references:type_name -> slash.api.v2.GetShortcutAnalyticsResponse.AnalyticsItem - 14, // 13: slash.api.v2.GetShortcutAnalyticsResponse.devices:type_name -> slash.api.v2.GetShortcutAnalyticsResponse.AnalyticsItem - 14, // 14: slash.api.v2.GetShortcutAnalyticsResponse.browsers:type_name -> slash.api.v2.GetShortcutAnalyticsResponse.AnalyticsItem - 2, // 15: slash.api.v2.ShortcutService.ListShortcuts:input_type -> slash.api.v2.ListShortcutsRequest - 4, // 16: slash.api.v2.ShortcutService.GetShortcut:input_type -> slash.api.v2.GetShortcutRequest - 6, // 17: slash.api.v2.ShortcutService.CreateShortcut:input_type -> slash.api.v2.CreateShortcutRequest - 8, // 18: slash.api.v2.ShortcutService.UpdateShortcut:input_type -> slash.api.v2.UpdateShortcutRequest - 10, // 19: slash.api.v2.ShortcutService.DeleteShortcut:input_type -> slash.api.v2.DeleteShortcutRequest - 12, // 20: slash.api.v2.ShortcutService.GetShortcutAnalytics:input_type -> slash.api.v2.GetShortcutAnalyticsRequest - 3, // 21: slash.api.v2.ShortcutService.ListShortcuts:output_type -> slash.api.v2.ListShortcutsResponse - 5, // 22: slash.api.v2.ShortcutService.GetShortcut:output_type -> slash.api.v2.GetShortcutResponse - 7, // 23: slash.api.v2.ShortcutService.CreateShortcut:output_type -> slash.api.v2.CreateShortcutResponse - 9, // 24: slash.api.v2.ShortcutService.UpdateShortcut:output_type -> slash.api.v2.UpdateShortcutResponse - 11, // 25: slash.api.v2.ShortcutService.DeleteShortcut:output_type -> slash.api.v2.DeleteShortcutResponse - 13, // 26: slash.api.v2.ShortcutService.GetShortcutAnalytics:output_type -> slash.api.v2.GetShortcutAnalyticsResponse - 21, // [21:27] is the sub-list for method output_type - 15, // [15:21] is the sub-list for method input_type - 15, // [15:15] is the sub-list for extension type_name - 15, // [15:15] is the sub-list for extension extendee - 0, // [0:15] is the sub-list for field type_name + 0, // 7: slash.api.v2.GetShortcutByIdResponse.shortcut:type_name -> slash.api.v2.Shortcut + 0, // 8: slash.api.v2.CreateShortcutRequest.shortcut:type_name -> slash.api.v2.Shortcut + 0, // 9: slash.api.v2.CreateShortcutResponse.shortcut:type_name -> slash.api.v2.Shortcut + 0, // 10: slash.api.v2.UpdateShortcutRequest.shortcut:type_name -> slash.api.v2.Shortcut + 20, // 11: slash.api.v2.UpdateShortcutRequest.update_mask:type_name -> google.protobuf.FieldMask + 0, // 12: slash.api.v2.UpdateShortcutResponse.shortcut:type_name -> slash.api.v2.Shortcut + 16, // 13: slash.api.v2.GetShortcutAnalyticsResponse.references:type_name -> slash.api.v2.GetShortcutAnalyticsResponse.AnalyticsItem + 16, // 14: slash.api.v2.GetShortcutAnalyticsResponse.devices:type_name -> slash.api.v2.GetShortcutAnalyticsResponse.AnalyticsItem + 16, // 15: slash.api.v2.GetShortcutAnalyticsResponse.browsers:type_name -> slash.api.v2.GetShortcutAnalyticsResponse.AnalyticsItem + 2, // 16: slash.api.v2.ShortcutService.ListShortcuts:input_type -> slash.api.v2.ListShortcutsRequest + 4, // 17: slash.api.v2.ShortcutService.GetShortcut:input_type -> slash.api.v2.GetShortcutRequest + 6, // 18: slash.api.v2.ShortcutService.GetShortcutById:input_type -> slash.api.v2.GetShortcutByIdRequest + 8, // 19: slash.api.v2.ShortcutService.CreateShortcut:input_type -> slash.api.v2.CreateShortcutRequest + 10, // 20: slash.api.v2.ShortcutService.UpdateShortcut:input_type -> slash.api.v2.UpdateShortcutRequest + 12, // 21: slash.api.v2.ShortcutService.DeleteShortcut:input_type -> slash.api.v2.DeleteShortcutRequest + 14, // 22: slash.api.v2.ShortcutService.GetShortcutAnalytics:input_type -> slash.api.v2.GetShortcutAnalyticsRequest + 3, // 23: slash.api.v2.ShortcutService.ListShortcuts:output_type -> slash.api.v2.ListShortcutsResponse + 5, // 24: slash.api.v2.ShortcutService.GetShortcut:output_type -> slash.api.v2.GetShortcutResponse + 7, // 25: slash.api.v2.ShortcutService.GetShortcutById:output_type -> slash.api.v2.GetShortcutByIdResponse + 9, // 26: slash.api.v2.ShortcutService.CreateShortcut:output_type -> slash.api.v2.CreateShortcutResponse + 11, // 27: slash.api.v2.ShortcutService.UpdateShortcut:output_type -> slash.api.v2.UpdateShortcutResponse + 13, // 28: slash.api.v2.ShortcutService.DeleteShortcut:output_type -> slash.api.v2.DeleteShortcutResponse + 15, // 29: slash.api.v2.ShortcutService.GetShortcutAnalytics:output_type -> slash.api.v2.GetShortcutAnalyticsResponse + 23, // [23:30] is the sub-list for method output_type + 16, // [16:23] is the sub-list for method input_type + 16, // [16:16] is the sub-list for extension type_name + 16, // [16:16] is the sub-list for extension extendee + 0, // [0:16] is the sub-list for field type_name } func init() { file_api_v2_shortcut_service_proto_init() } @@ -1189,7 +1303,7 @@ func file_api_v2_shortcut_service_proto_init() { } } file_api_v2_shortcut_service_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateShortcutRequest); i { + switch v := v.(*GetShortcutByIdRequest); i { case 0: return &v.state case 1: @@ -1201,7 +1315,7 @@ func file_api_v2_shortcut_service_proto_init() { } } file_api_v2_shortcut_service_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateShortcutResponse); i { + switch v := v.(*GetShortcutByIdResponse); i { case 0: return &v.state case 1: @@ -1213,7 +1327,7 @@ func file_api_v2_shortcut_service_proto_init() { } } file_api_v2_shortcut_service_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateShortcutRequest); i { + switch v := v.(*CreateShortcutRequest); i { case 0: return &v.state case 1: @@ -1225,7 +1339,7 @@ func file_api_v2_shortcut_service_proto_init() { } } file_api_v2_shortcut_service_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateShortcutResponse); i { + switch v := v.(*CreateShortcutResponse); i { case 0: return &v.state case 1: @@ -1237,7 +1351,7 @@ func file_api_v2_shortcut_service_proto_init() { } } file_api_v2_shortcut_service_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteShortcutRequest); i { + switch v := v.(*UpdateShortcutRequest); i { case 0: return &v.state case 1: @@ -1249,7 +1363,7 @@ func file_api_v2_shortcut_service_proto_init() { } } file_api_v2_shortcut_service_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteShortcutResponse); i { + switch v := v.(*UpdateShortcutResponse); i { case 0: return &v.state case 1: @@ -1261,7 +1375,7 @@ func file_api_v2_shortcut_service_proto_init() { } } file_api_v2_shortcut_service_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetShortcutAnalyticsRequest); i { + switch v := v.(*DeleteShortcutRequest); i { case 0: return &v.state case 1: @@ -1273,7 +1387,7 @@ func file_api_v2_shortcut_service_proto_init() { } } file_api_v2_shortcut_service_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetShortcutAnalyticsResponse); i { + switch v := v.(*DeleteShortcutResponse); i { case 0: return &v.state case 1: @@ -1285,6 +1399,30 @@ func file_api_v2_shortcut_service_proto_init() { } } file_api_v2_shortcut_service_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetShortcutAnalyticsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v2_shortcut_service_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetShortcutAnalyticsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v2_shortcut_service_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetShortcutAnalyticsResponse_AnalyticsItem); i { case 0: return &v.state @@ -1303,7 +1441,7 @@ func file_api_v2_shortcut_service_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_api_v2_shortcut_service_proto_rawDesc, NumEnums: 0, - NumMessages: 15, + NumMessages: 17, NumExtensions: 0, NumServices: 1, }, diff --git a/proto/gen/api/v2/shortcut_service.pb.gw.go b/proto/gen/api/v2/shortcut_service.pb.gw.go index 82ab319..6e9e3d0 100644 --- a/proto/gen/api/v2/shortcut_service.pb.gw.go +++ b/proto/gen/api/v2/shortcut_service.pb.gw.go @@ -60,14 +60,14 @@ func request_ShortcutService_GetShortcut_0(ctx context.Context, marshaler runtim _ = err ) - val, ok = pathParams["id"] + val, ok = pathParams["name"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") } - protoReq.Id, err = runtime.Int32(val) + protoReq.Name, err = runtime.String(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) } msg, err := client.GetShortcut(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -86,14 +86,14 @@ func local_request_ShortcutService_GetShortcut_0(ctx context.Context, marshaler _ = err ) - val, ok = pathParams["id"] + val, ok = pathParams["name"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") } - protoReq.Id, err = runtime.Int32(val) + protoReq.Name, err = runtime.String(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) } msg, err := server.GetShortcut(ctx, &protoReq) @@ -136,7 +136,7 @@ func local_request_ShortcutService_CreateShortcut_0(ctx context.Context, marshal } var ( - filter_ShortcutService_UpdateShortcut_0 = &utilities.DoubleArray{Encoding: map[string]int{"shortcut": 0, "id": 1}, Base: []int{1, 4, 5, 2, 0, 0, 0, 0}, Check: []int{0, 1, 1, 2, 4, 2, 2, 3}} + filter_ShortcutService_UpdateShortcut_0 = &utilities.DoubleArray{Encoding: map[string]int{"shortcut": 0, "name": 1}, Base: []int{1, 4, 5, 2, 0, 0, 0, 0}, Check: []int{0, 1, 1, 2, 4, 2, 2, 3}} ) func request_ShortcutService_UpdateShortcut_0(ctx context.Context, marshaler runtime.Marshaler, client ShortcutServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -158,14 +158,14 @@ func request_ShortcutService_UpdateShortcut_0(ctx context.Context, marshaler run _ = err ) - val, ok = pathParams["shortcut.id"] + val, ok = pathParams["shortcut.name"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "shortcut.id") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "shortcut.name") } - err = runtime.PopulateFieldFromPath(&protoReq, "shortcut.id", val) + err = runtime.PopulateFieldFromPath(&protoReq, "shortcut.name", val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "shortcut.id", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "shortcut.name", err) } if err := req.ParseForm(); err != nil { @@ -199,14 +199,14 @@ func local_request_ShortcutService_UpdateShortcut_0(ctx context.Context, marshal _ = err ) - val, ok = pathParams["shortcut.id"] + val, ok = pathParams["shortcut.name"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "shortcut.id") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "shortcut.name") } - err = runtime.PopulateFieldFromPath(&protoReq, "shortcut.id", val) + err = runtime.PopulateFieldFromPath(&protoReq, "shortcut.name", val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "shortcut.id", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "shortcut.name", err) } if err := req.ParseForm(); err != nil { @@ -232,14 +232,14 @@ func request_ShortcutService_DeleteShortcut_0(ctx context.Context, marshaler run _ = err ) - val, ok = pathParams["id"] + val, ok = pathParams["name"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") } - protoReq.Id, err = runtime.Int32(val) + protoReq.Name, err = runtime.String(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) } msg, err := client.DeleteShortcut(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -258,14 +258,14 @@ func local_request_ShortcutService_DeleteShortcut_0(ctx context.Context, marshal _ = err ) - val, ok = pathParams["id"] + val, ok = pathParams["name"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") } - protoReq.Id, err = runtime.Int32(val) + protoReq.Name, err = runtime.String(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) } msg, err := server.DeleteShortcut(ctx, &protoReq) @@ -284,14 +284,14 @@ func request_ShortcutService_GetShortcutAnalytics_0(ctx context.Context, marshal _ = err ) - val, ok = pathParams["id"] + val, ok = pathParams["name"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") } - protoReq.Id, err = runtime.Int32(val) + protoReq.Name, err = runtime.String(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) } msg, err := client.GetShortcutAnalytics(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -310,14 +310,14 @@ func local_request_ShortcutService_GetShortcutAnalytics_0(ctx context.Context, m _ = err ) - val, ok = pathParams["id"] + val, ok = pathParams["name"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") } - protoReq.Id, err = runtime.Int32(val) + protoReq.Name, err = runtime.String(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) } msg, err := server.GetShortcutAnalytics(ctx, &protoReq) @@ -364,7 +364,7 @@ func RegisterShortcutServiceHandlerServer(ctx context.Context, mux *runtime.Serv inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) var err error var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/slash.api.v2.ShortcutService/GetShortcut", runtime.WithHTTPPathPattern("/api/v2/shortcuts/{id}")) + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/slash.api.v2.ShortcutService/GetShortcut", runtime.WithHTTPPathPattern("/api/v2/shortcuts/{name}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -414,7 +414,7 @@ func RegisterShortcutServiceHandlerServer(ctx context.Context, mux *runtime.Serv inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) var err error var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/slash.api.v2.ShortcutService/UpdateShortcut", runtime.WithHTTPPathPattern("/api/v2/shortcuts/{shortcut.id}")) + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/slash.api.v2.ShortcutService/UpdateShortcut", runtime.WithHTTPPathPattern("/api/v2/shortcuts/{shortcut.name}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -439,7 +439,7 @@ func RegisterShortcutServiceHandlerServer(ctx context.Context, mux *runtime.Serv inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) var err error var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/slash.api.v2.ShortcutService/DeleteShortcut", runtime.WithHTTPPathPattern("/api/v2/shortcuts/{id}")) + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/slash.api.v2.ShortcutService/DeleteShortcut", runtime.WithHTTPPathPattern("/api/v2/shortcuts/{name}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -464,7 +464,7 @@ func RegisterShortcutServiceHandlerServer(ctx context.Context, mux *runtime.Serv inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) var err error var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/slash.api.v2.ShortcutService/GetShortcutAnalytics", runtime.WithHTTPPathPattern("/api/v2/shortcuts/{id}/analytics")) + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/slash.api.v2.ShortcutService/GetShortcutAnalytics", runtime.WithHTTPPathPattern("/api/v2/shortcuts/{name}/analytics")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -550,7 +550,7 @@ func RegisterShortcutServiceHandlerClient(ctx context.Context, mux *runtime.Serv inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) var err error var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/slash.api.v2.ShortcutService/GetShortcut", runtime.WithHTTPPathPattern("/api/v2/shortcuts/{id}")) + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/slash.api.v2.ShortcutService/GetShortcut", runtime.WithHTTPPathPattern("/api/v2/shortcuts/{name}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -594,7 +594,7 @@ func RegisterShortcutServiceHandlerClient(ctx context.Context, mux *runtime.Serv inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) var err error var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/slash.api.v2.ShortcutService/UpdateShortcut", runtime.WithHTTPPathPattern("/api/v2/shortcuts/{shortcut.id}")) + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/slash.api.v2.ShortcutService/UpdateShortcut", runtime.WithHTTPPathPattern("/api/v2/shortcuts/{shortcut.name}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -616,7 +616,7 @@ func RegisterShortcutServiceHandlerClient(ctx context.Context, mux *runtime.Serv inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) var err error var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/slash.api.v2.ShortcutService/DeleteShortcut", runtime.WithHTTPPathPattern("/api/v2/shortcuts/{id}")) + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/slash.api.v2.ShortcutService/DeleteShortcut", runtime.WithHTTPPathPattern("/api/v2/shortcuts/{name}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -638,7 +638,7 @@ func RegisterShortcutServiceHandlerClient(ctx context.Context, mux *runtime.Serv inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) var err error var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/slash.api.v2.ShortcutService/GetShortcutAnalytics", runtime.WithHTTPPathPattern("/api/v2/shortcuts/{id}/analytics")) + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/slash.api.v2.ShortcutService/GetShortcutAnalytics", runtime.WithHTTPPathPattern("/api/v2/shortcuts/{name}/analytics")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -660,15 +660,15 @@ func RegisterShortcutServiceHandlerClient(ctx context.Context, mux *runtime.Serv var ( pattern_ShortcutService_ListShortcuts_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v2", "shortcuts"}, "")) - pattern_ShortcutService_GetShortcut_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v2", "shortcuts", "id"}, "")) + pattern_ShortcutService_GetShortcut_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v2", "shortcuts", "name"}, "")) pattern_ShortcutService_CreateShortcut_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v2", "shortcuts"}, "")) - pattern_ShortcutService_UpdateShortcut_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v2", "shortcuts", "shortcut.id"}, "")) + pattern_ShortcutService_UpdateShortcut_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v2", "shortcuts", "shortcut.name"}, "")) - pattern_ShortcutService_DeleteShortcut_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v2", "shortcuts", "id"}, "")) + pattern_ShortcutService_DeleteShortcut_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v2", "shortcuts", "name"}, "")) - pattern_ShortcutService_GetShortcutAnalytics_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v2", "shortcuts", "id", "analytics"}, "")) + pattern_ShortcutService_GetShortcutAnalytics_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v2", "shortcuts", "name", "analytics"}, "")) ) var ( diff --git a/proto/gen/api/v2/shortcut_service_grpc.pb.go b/proto/gen/api/v2/shortcut_service_grpc.pb.go index 83ff16e..acf34e8 100644 --- a/proto/gen/api/v2/shortcut_service_grpc.pb.go +++ b/proto/gen/api/v2/shortcut_service_grpc.pb.go @@ -21,6 +21,7 @@ const _ = grpc.SupportPackageIsVersion7 const ( ShortcutService_ListShortcuts_FullMethodName = "/slash.api.v2.ShortcutService/ListShortcuts" ShortcutService_GetShortcut_FullMethodName = "/slash.api.v2.ShortcutService/GetShortcut" + ShortcutService_GetShortcutById_FullMethodName = "/slash.api.v2.ShortcutService/GetShortcutById" ShortcutService_CreateShortcut_FullMethodName = "/slash.api.v2.ShortcutService/CreateShortcut" ShortcutService_UpdateShortcut_FullMethodName = "/slash.api.v2.ShortcutService/UpdateShortcut" ShortcutService_DeleteShortcut_FullMethodName = "/slash.api.v2.ShortcutService/DeleteShortcut" @@ -33,13 +34,15 @@ const ( type ShortcutServiceClient interface { // ListShortcuts returns a list of shortcuts. ListShortcuts(ctx context.Context, in *ListShortcutsRequest, opts ...grpc.CallOption) (*ListShortcutsResponse, error) - // GetShortcut returns a shortcut by id. + // GetShortcut returns a shortcut by name. GetShortcut(ctx context.Context, in *GetShortcutRequest, opts ...grpc.CallOption) (*GetShortcutResponse, error) + // GetShortcutById returns a shortcut by id. + GetShortcutById(ctx context.Context, in *GetShortcutByIdRequest, opts ...grpc.CallOption) (*GetShortcutByIdResponse, error) // CreateShortcut creates a shortcut. CreateShortcut(ctx context.Context, in *CreateShortcutRequest, opts ...grpc.CallOption) (*CreateShortcutResponse, error) // UpdateShortcut updates a shortcut. UpdateShortcut(ctx context.Context, in *UpdateShortcutRequest, opts ...grpc.CallOption) (*UpdateShortcutResponse, error) - // DeleteShortcut deletes a shortcut by id. + // DeleteShortcut deletes a shortcut by name. DeleteShortcut(ctx context.Context, in *DeleteShortcutRequest, opts ...grpc.CallOption) (*DeleteShortcutResponse, error) // GetShortcutAnalytics returns the analytics for a shortcut. GetShortcutAnalytics(ctx context.Context, in *GetShortcutAnalyticsRequest, opts ...grpc.CallOption) (*GetShortcutAnalyticsResponse, error) @@ -71,6 +74,15 @@ func (c *shortcutServiceClient) GetShortcut(ctx context.Context, in *GetShortcut return out, nil } +func (c *shortcutServiceClient) GetShortcutById(ctx context.Context, in *GetShortcutByIdRequest, opts ...grpc.CallOption) (*GetShortcutByIdResponse, error) { + out := new(GetShortcutByIdResponse) + err := c.cc.Invoke(ctx, ShortcutService_GetShortcutById_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *shortcutServiceClient) CreateShortcut(ctx context.Context, in *CreateShortcutRequest, opts ...grpc.CallOption) (*CreateShortcutResponse, error) { out := new(CreateShortcutResponse) err := c.cc.Invoke(ctx, ShortcutService_CreateShortcut_FullMethodName, in, out, opts...) @@ -113,13 +125,15 @@ func (c *shortcutServiceClient) GetShortcutAnalytics(ctx context.Context, in *Ge type ShortcutServiceServer interface { // ListShortcuts returns a list of shortcuts. ListShortcuts(context.Context, *ListShortcutsRequest) (*ListShortcutsResponse, error) - // GetShortcut returns a shortcut by id. + // GetShortcut returns a shortcut by name. GetShortcut(context.Context, *GetShortcutRequest) (*GetShortcutResponse, error) + // GetShortcutById returns a shortcut by id. + GetShortcutById(context.Context, *GetShortcutByIdRequest) (*GetShortcutByIdResponse, error) // CreateShortcut creates a shortcut. CreateShortcut(context.Context, *CreateShortcutRequest) (*CreateShortcutResponse, error) // UpdateShortcut updates a shortcut. UpdateShortcut(context.Context, *UpdateShortcutRequest) (*UpdateShortcutResponse, error) - // DeleteShortcut deletes a shortcut by id. + // DeleteShortcut deletes a shortcut by name. DeleteShortcut(context.Context, *DeleteShortcutRequest) (*DeleteShortcutResponse, error) // GetShortcutAnalytics returns the analytics for a shortcut. GetShortcutAnalytics(context.Context, *GetShortcutAnalyticsRequest) (*GetShortcutAnalyticsResponse, error) @@ -136,6 +150,9 @@ func (UnimplementedShortcutServiceServer) ListShortcuts(context.Context, *ListSh func (UnimplementedShortcutServiceServer) GetShortcut(context.Context, *GetShortcutRequest) (*GetShortcutResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetShortcut not implemented") } +func (UnimplementedShortcutServiceServer) GetShortcutById(context.Context, *GetShortcutByIdRequest) (*GetShortcutByIdResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetShortcutById not implemented") +} func (UnimplementedShortcutServiceServer) CreateShortcut(context.Context, *CreateShortcutRequest) (*CreateShortcutResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateShortcut not implemented") } @@ -197,6 +214,24 @@ func _ShortcutService_GetShortcut_Handler(srv interface{}, ctx context.Context, return interceptor(ctx, in, info, handler) } +func _ShortcutService_GetShortcutById_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetShortcutByIdRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ShortcutServiceServer).GetShortcutById(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ShortcutService_GetShortcutById_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ShortcutServiceServer).GetShortcutById(ctx, req.(*GetShortcutByIdRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _ShortcutService_CreateShortcut_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CreateShortcutRequest) if err := dec(in); err != nil { @@ -284,6 +319,10 @@ var ShortcutService_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetShortcut", Handler: _ShortcutService_GetShortcut_Handler, }, + { + MethodName: "GetShortcutById", + Handler: _ShortcutService_GetShortcutById_Handler, + }, { MethodName: "CreateShortcut", Handler: _ShortcutService_CreateShortcut_Handler,