From e076590ff2a9587d66ffdac672bdd254cb9918f1 Mon Sep 17 00:00:00 2001 From: Kasper Fabricius Kristensen <45367945+kasperkristensen@users.noreply.github.com> Date: Thu, 29 Feb 2024 00:27:49 +0100 Subject: [PATCH] feat(dashboard,medusa): Update Pub. API key table and add query params to endpoint (#6483) **What** - Updates table to use DataTable - Adds some query params to sort/filter the returned pub. keys --- .changeset/shaggy-fishes-sit.md | 6 + .../public/locales/en-US/translation.json | 1 + .../api-key-general-section.tsx | 8 +- .../api-key-management-list.tsx | 248 -------------- .../api-key-management-list-table.tsx | 316 +++--------------- .../use-api-key-management-table-columns.tsx | 158 +++++++++ .../use-api-key-management-table-filters.tsx | 22 ++ .../use-api-key-management-table-query.tsx | 34 ++ .../lib/models/GetPublishableApiKeysParams.ts | 67 ++++ .../list-publishable-api-keys.ts | 109 +++++- .../src/services/publishable-api-key.ts | 2 +- 11 files changed, 442 insertions(+), 529 deletions(-) create mode 100644 .changeset/shaggy-fishes-sit.md create mode 100644 packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-list/components/api-key-management-list-table/use-api-key-management-table-columns.tsx create mode 100644 packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-list/components/api-key-management-list-table/use-api-key-management-table-filters.tsx create mode 100644 packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-list/components/api-key-management-list-table/use-api-key-management-table-query.tsx diff --git a/.changeset/shaggy-fishes-sit.md b/.changeset/shaggy-fishes-sit.md new file mode 100644 index 0000000000..917e529bdb --- /dev/null +++ b/.changeset/shaggy-fishes-sit.md @@ -0,0 +1,6 @@ +--- +"@medusajs/client-types": patch +"@medusajs/medusa": patch +--- + +fix(medusa): Add query params to Pub. API key endpoint diff --git a/packages/admin-next/dashboard/public/locales/en-US/translation.json b/packages/admin-next/dashboard/public/locales/en-US/translation.json index f7875cbde2..6e724bce3c 100644 --- a/packages/admin-next/dashboard/public/locales/en-US/translation.json +++ b/packages/admin-next/dashboard/public/locales/en-US/translation.json @@ -411,6 +411,7 @@ "product": "Product", "createdAt": "Created at", "updatedAt": "Updated at", + "revokedAt": "Revoked at", "true": "True", "false": "False", "giftCard": "Gift Card", diff --git a/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-detail/components/api-key-general-section/api-key-general-section.tsx b/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-detail/components/api-key-general-section/api-key-general-section.tsx index ce320b4f5e..a33f7f286d 100644 --- a/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-detail/components/api-key-general-section/api-key-general-section.tsx +++ b/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-detail/components/api-key-general-section/api-key-general-section.tsx @@ -14,6 +14,7 @@ import { useAdminUser, } from "medusa-react" import { useTranslation } from "react-i18next" +import { useNavigate } from "react-router-dom" import { ActionMenu } from "../../../../../components/common/action-menu" import { Skeleton } from "../../../../../components/common/skeleton" import { UserLink } from "../../../../../components/common/user-link" @@ -24,6 +25,7 @@ type ApiKeyGeneralSectionProps = { export const ApiKeyGeneralSection = ({ apiKey }: ApiKeyGeneralSectionProps) => { const { t } = useTranslation() + const navigate = useNavigate() const prompt = usePrompt() const { mutateAsync: revokeAsync } = useAdminRevokePublishableApiKey( @@ -47,7 +49,11 @@ export const ApiKeyGeneralSection = ({ apiKey }: ApiKeyGeneralSectionProps) => { return } - await deleteAsync() + await deleteAsync(undefined, { + onSuccess: () => { + navigate("..", { replace: true }) + }, + }) } const handleRevoke = async () => { diff --git a/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-list/api-key-management-list.tsx b/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-list/api-key-management-list.tsx index b20cc90563..b28f6cae65 100644 --- a/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-list/api-key-management-list.tsx +++ b/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-list/api-key-management-list.tsx @@ -1,34 +1,4 @@ -import { PublishableApiKey, SalesChannel } from "@medusajs/medusa" -import { - Button, - Checkbox, - Container, - FocusModal, - Heading, - Hint, - Input, - Label, - Table, - Text, - clx, -} from "@medusajs/ui" -import { - createColumnHelper, - flexRender, - getCoreRowModel, - useReactTable, -} from "@tanstack/react-table" -import { - useAdminCreatePublishableApiKey, - useAdminSalesChannels, -} from "medusa-react" -import { useMemo } from "react" -import { useForm } from "react-hook-form" -import { useTranslation } from "react-i18next" -import * as zod from "zod" - import { Outlet } from "react-router-dom" -import { Form } from "../../../components/common/form" import { ApiKeyManagementListTable } from "./components/api-key-management-list-table" export const ApiKeyManagementList = () => { @@ -39,221 +9,3 @@ export const ApiKeyManagementList = () => { ) } - -const columnHelper = createColumnHelper() - -const useColumns = () => { - const { t } = useTranslation() - - const columns = useMemo( - () => [ - columnHelper.accessor("title", { - header: t("fields.title"), - cell: ({ getValue }) => getValue(), - }), - columnHelper.accessor("id", { - header: "ID", - cell: ({ getValue }) => getValue(), - }), - ], - [t] - ) - - return columns -} - -const CreatePublishableApiKeySchema = zod.object({ - title: zod.string().min(1), - sales_channel_ids: zod.array(zod.string()).min(1), -}) - -type CreatePublishableApiKeySchema = zod.infer< - typeof CreatePublishableApiKeySchema -> - -type CreatePublishableApiKeyProps = { - open: boolean - onOpenChange: (open: boolean) => void -} - -const salesChannelColumnHelper = createColumnHelper() - -const useSalesChannelColumns = () => { - const { t } = useTranslation() - - const columns = useMemo( - () => [ - salesChannelColumnHelper.display({ - id: "select", - header: ({ table }) => { - return ( - - table.toggleAllPageRowsSelected(!!value) - } - /> - ) - }, - cell: ({ row }) => { - return ( - row.toggleSelected(!!value)} - onClick={(e) => { - e.stopPropagation() - }} - /> - ) - }, - }), - salesChannelColumnHelper.accessor("name", { - header: t("fields.name"), - cell: ({ getValue }) => getValue(), - }), - salesChannelColumnHelper.accessor("description", { - header: t("fields.description"), - cell: ({ getValue }) => getValue(), - }), - ], - [t] - ) - - return columns -} - -const CreatePublishableApiKey = (props: CreatePublishableApiKeyProps) => { - const form = useForm({ - defaultValues: { - title: "", - sales_channel_ids: [], - }, - }) - - const { mutateAsync } = useAdminCreatePublishableApiKey() - - const { sales_channels, isLoading, isError, error } = useAdminSalesChannels() - const columns = useSalesChannelColumns() - - const table = useReactTable({ - data: sales_channels || [], - columns: columns, - getCoreRowModel: getCoreRowModel(), - }) - - const onSubmit = form.handleSubmit(async ({ title, sales_channel_ids }) => { - await mutateAsync({ - title, - }) - }) - - const { t } = useTranslation() - - return ( - -
- - -
- - - - -
-
- -
-
- Create API Key - - Create and manage API keys. API keys are used to limit the - scope of requests to specific sales channels. - -
-
-
- ( - - {t("fields.title")} - - - - - - )} - /> -
-
- - - -
- Sales Channels -
- - - {table.getHeaderGroups().map((headerGroup) => { - return ( - - {headerGroup.headers.map((header) => { - return ( - - {flexRender( - header.column.columnDef.header, - header.getContext() - )} - - ) - })} - - ) - })} - - - {table.getRowModel().rows.map((row) => ( - - {row.getVisibleCells().map((cell) => ( - - {flexRender( - cell.column.columnDef.cell, - cell.getContext() - )} - - ))} - - ))} - -
-
-
-
-
-
-
-
-
- ) -} diff --git a/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-list/components/api-key-management-list-table/api-key-management-list-table.tsx b/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-list/components/api-key-management-list-table/api-key-management-list-table.tsx index 1b11d86c5f..61b7ea024f 100644 --- a/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-list/components/api-key-management-list-table/api-key-management-list-table.tsx +++ b/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-list/components/api-key-management-list-table/api-key-management-list-table.tsx @@ -1,78 +1,43 @@ -import { PencilSquare, Trash, XCircle } from "@medusajs/icons" -import { PublishableApiKey } from "@medusajs/medusa" -import { - Button, - Container, - Copy, - Heading, - StatusBadge, - Table, - Text, - clx, - usePrompt, -} from "@medusajs/ui" -import { - PaginationState, - RowSelectionState, - createColumnHelper, - flexRender, - getCoreRowModel, - useReactTable, -} from "@tanstack/react-table" -import { format } from "date-fns" -import { - useAdminDeletePublishableApiKey, - useAdminPublishableApiKeys, - useAdminRevokePublishableApiKey, -} from "medusa-react" -import { useMemo, useState } from "react" +import { Button, Container, Heading } from "@medusajs/ui" +import { useAdminPublishableApiKeys } from "medusa-react" import { useTranslation } from "react-i18next" -import { Link, useNavigate } from "react-router-dom" -import { ActionMenu } from "../../../../../components/common/action-menu" -import { NoRecords } from "../../../../../components/common/empty-table-content" -import { LocalizedTablePagination } from "../../../../../components/localization/localized-table-pagination" +import { Link } from "react-router-dom" +import { DataTable } from "../../../../../components/table/data-table" +import { useDataTable } from "../../../../../hooks/use-data-table" +import { useApiKeyManagementTableColumns } from "./use-api-key-management-table-columns" +import { useApiKeyManagementTableFilters } from "./use-api-key-management-table-filters" +import { useApiKeyManagementTableQuery } from "./use-api-key-management-table-query" -const PAGE_SIZE = 50 +const PAGE_SIZE = 20 export const ApiKeyManagementListTable = () => { - const [{ pageIndex, pageSize }, setPagination] = useState({ - pageIndex: 0, + const { t } = useTranslation() + + const { searchParams, raw } = useApiKeyManagementTableQuery({ pageSize: PAGE_SIZE, }) - - const pagination = useMemo( - () => ({ - pageIndex, - pageSize, - }), - [pageIndex, pageSize] - ) - - const [rowSelection, setRowSelection] = useState({}) - const { publishable_api_keys, count, isLoading, isError, error } = - useAdminPublishableApiKeys({}) + useAdminPublishableApiKeys( + { + ...searchParams, + }, + { + keepPreviousData: true, + } + ) - const columns = useColumns() + const filters = useApiKeyManagementTableFilters() + const columns = useApiKeyManagementTableColumns() - const table = useReactTable({ + const { table } = useDataTable({ data: publishable_api_keys || [], columns, - pageCount: Math.ceil((count ?? 0) / PAGE_SIZE), - state: { - pagination, - rowSelection, - }, + count, + enablePagination: true, getRowId: (row) => row.id, - onPaginationChange: setPagination, - onRowSelectionChange: setRowSelection, - getCoreRowModel: getCoreRowModel(), - manualPagination: true, + pageSize: PAGE_SIZE, }) - const { t } = useTranslation() - const navigate = useNavigate() - if (isLoading) { return
Loading...
} @@ -91,222 +56,19 @@ export const ApiKeyManagementListTable = () => { -
- {(publishable_api_keys?.length ?? 0) > 0 ? ( -
- - - {table.getHeaderGroups().map((headerGroup) => { - return ( - - {headerGroup.headers.map((header) => { - return ( - - {flexRender( - header.column.columnDef.header, - header.getContext() - )} - - ) - })} - - ) - })} - - - {table.getRowModel().rows.map((row) => ( - - navigate( - `/settings/api-key-management/${row.original.id}` - ) - } - > - {row.getVisibleCells().map((cell) => ( - - {flexRender( - cell.column.columnDef.cell, - cell.getContext() - )} - - ))} - - ))} - -
- -
- ) : ( - - )} -
+ `/settings/api-key-management/${row.id}`} + pagination + search + queryObject={raw} + isLoading={isLoading} + /> ) } - -const KeyActions = ({ apiKey }: { apiKey: PublishableApiKey }) => { - const { mutateAsync: revokeAsync } = useAdminRevokePublishableApiKey( - apiKey.id - ) - const { mutateAsync: deleteAsync } = useAdminDeletePublishableApiKey( - apiKey.id - ) - - const { t } = useTranslation() - const prompt = usePrompt() - - const handleDelete = async () => { - const res = await prompt({ - title: t("general.areYouSure"), - description: t("apiKeyManagement.deleteKeyWarning", { - title: apiKey.title, - }), - confirmText: t("actions.delete"), - cancelText: t("actions.cancel"), - }) - - if (!res) { - return - } - - await deleteAsync() - } - - const handleRevoke = async () => { - const res = await prompt({ - title: t("general.areYouSure"), - description: t("apiKeyManagement.revokeKeyWarning", { - title: apiKey.title, - }), - confirmText: t("apiKeyManagement.revoke"), - cancelText: t("actions.cancel"), - }) - - if (!res) { - return - } - - await revokeAsync() - } - - return ( - , - label: t("actions.edit"), - to: `/settings/api-key-management/${apiKey.id}`, - }, - ], - }, - { - actions: [ - { - icon: , - label: t("apiKeyManagement.revoke"), - onClick: handleRevoke, - }, - { - icon: , - label: t("actions.delete"), - onClick: handleDelete, - }, - ], - }, - ]} - /> - ) -} - -const columnHelper = createColumnHelper() - -const useColumns = () => { - const { t } = useTranslation() - - const columns = useMemo( - () => [ - columnHelper.accessor("title", { - header: t("fields.title"), - cell: ({ getValue }) => getValue(), - }), - columnHelper.accessor("id", { - header: "Key", - cell: ({ getValue }) => { - const token = getValue() - - return ( -
e.stopPropagation()} - > - - {token} - - -
- ) - }, - }), - columnHelper.accessor("revoked_at", { - header: t("fields.status"), - cell: ({ getValue }) => { - const revokedAt = getValue() - - return ( - - {revokedAt ? t("general.revoked") : t("general.active")} - - ) - }, - }), - columnHelper.accessor("created_at", { - header: t("fields.created"), - cell: ({ getValue }) => { - const date = getValue() - - return format(new Date(date), "dd MMM, yyyy") - }, - }), - columnHelper.display({ - id: "actions", - cell: ({ row }) => { - return - }, - }), - ], - [t] - ) - - return columns -} diff --git a/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-list/components/api-key-management-list-table/use-api-key-management-table-columns.tsx b/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-list/components/api-key-management-list-table/use-api-key-management-table-columns.tsx new file mode 100644 index 0000000000..f9d3afacf0 --- /dev/null +++ b/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-list/components/api-key-management-list-table/use-api-key-management-table-columns.tsx @@ -0,0 +1,158 @@ +import { PencilSquare, Trash, XCircle } from "@medusajs/icons" +import { PublishableApiKey } from "@medusajs/medusa" +import { Copy, Text, usePrompt } from "@medusajs/ui" +import { createColumnHelper } from "@tanstack/react-table" +import { + useAdminDeletePublishableApiKey, + useAdminRevokePublishableApiKey, +} from "medusa-react" +import { useMemo } from "react" +import { useTranslation } from "react-i18next" + +import { ActionMenu } from "../../../../../components/common/action-menu" +import { DateCell } from "../../../../../components/table/table-cells/common/date-cell" +import { StatusCell } from "../../../../../components/table/table-cells/common/status-cell" + +const columnHelper = createColumnHelper() + +export const useApiKeyManagementTableColumns = () => { + const { t } = useTranslation() + + return useMemo( + () => [ + columnHelper.accessor("title", { + header: t("fields.title"), + cell: ({ getValue }) => ( +
+ {getValue()} +
+ ), + }), + columnHelper.accessor("id", { + header: "Key", + cell: ({ getValue }) => { + const token = getValue() + + return ( +
e.stopPropagation()} + > + + {token} + + +
+ ) + }, + }), + columnHelper.accessor("revoked_at", { + header: t("fields.status"), + cell: ({ getValue }) => { + const revokedAt = getValue() + + return ( + + {revokedAt ? t("general.revoked") : t("general.active")} + + ) + }, + }), + columnHelper.accessor("created_at", { + header: t("fields.created"), + cell: ({ getValue }) => { + const date = getValue() + + return + }, + }), + columnHelper.display({ + id: "actions", + cell: ({ row }) => { + return + }, + }), + ], + [t] + ) +} + +const ApiKeyActions = ({ apiKey }: { apiKey: PublishableApiKey }) => { + const { mutateAsync: revokeAsync } = useAdminRevokePublishableApiKey( + apiKey.id + ) + const { mutateAsync: deleteAsync } = useAdminDeletePublishableApiKey( + apiKey.id + ) + + const { t } = useTranslation() + const prompt = usePrompt() + + const handleDelete = async () => { + const res = await prompt({ + title: t("general.areYouSure"), + description: t("apiKeyManagement.deleteKeyWarning", { + title: apiKey.title, + }), + confirmText: t("actions.delete"), + cancelText: t("actions.cancel"), + }) + + if (!res) { + return + } + + await deleteAsync() + } + + const handleRevoke = async () => { + const res = await prompt({ + title: t("general.areYouSure"), + description: t("apiKeyManagement.revokeKeyWarning", { + title: apiKey.title, + }), + confirmText: t("apiKeyManagement.revoke"), + cancelText: t("actions.cancel"), + }) + + if (!res) { + return + } + + await revokeAsync() + } + + return ( + , + label: t("actions.edit"), + to: `/settings/api-key-management/${apiKey.id}`, + }, + ], + }, + { + actions: [ + { + icon: , + label: t("apiKeyManagement.revoke"), + onClick: handleRevoke, + }, + { + icon: , + label: t("actions.delete"), + onClick: handleDelete, + }, + ], + }, + ]} + /> + ) +} diff --git a/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-list/components/api-key-management-list-table/use-api-key-management-table-filters.tsx b/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-list/components/api-key-management-list-table/use-api-key-management-table-filters.tsx new file mode 100644 index 0000000000..052e176c6f --- /dev/null +++ b/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-list/components/api-key-management-list-table/use-api-key-management-table-filters.tsx @@ -0,0 +1,22 @@ +import { useTranslation } from "react-i18next" +import { Filter } from "../../../../../components/table/data-table" + +export const useApiKeyManagementTableFilters = () => { + const { t } = useTranslation() + + let filters: Filter[] = [] + + const dateFilters: Filter[] = [ + { label: t("fields.createdAt"), key: "created_at" }, + { label: t("fields.updatedAt"), key: "updated_at" }, + { label: t("fields.revokedAt"), key: "revoked_at" }, + ].map((f) => ({ + key: f.key, + label: f.label, + type: "date", + })) + + filters = [...filters, ...dateFilters] + + return filters +} diff --git a/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-list/components/api-key-management-list-table/use-api-key-management-table-query.tsx b/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-list/components/api-key-management-list-table/use-api-key-management-table-query.tsx new file mode 100644 index 0000000000..c1fc542f43 --- /dev/null +++ b/packages/admin-next/dashboard/src/routes/api-key-management/api-key-management-list/components/api-key-management-list-table/use-api-key-management-table-query.tsx @@ -0,0 +1,34 @@ +import { GetPublishableApiKeysParams } from "@medusajs/medusa" +import { useQueryParams } from "../../../../../hooks/use-query-params" + +type UseApiKeyManagementTableQueryProps = { + prefix?: string + pageSize?: number +} + +export const useApiKeyManagementTableQuery = ({ + prefix, + pageSize = 20, +}: UseApiKeyManagementTableQueryProps) => { + const queryObject = useQueryParams( + ["offset", "q", "created_at", "updated_at", "revoked_at", "order"], + prefix + ) + + const { offset, created_at, updated_at, revoked_at, q, order } = queryObject + + const searchParams: GetPublishableApiKeysParams = { + limit: pageSize, + offset: offset ? Number(offset) : 0, + created_at: created_at ? JSON.parse(created_at) : undefined, + updated_at: updated_at ? JSON.parse(updated_at) : undefined, + revoked_at: revoked_at ? JSON.parse(revoked_at) : undefined, + order, + q, + } + + return { + searchParams, + raw: queryObject, + } +} diff --git a/packages/generated/client-types/src/lib/models/GetPublishableApiKeysParams.ts b/packages/generated/client-types/src/lib/models/GetPublishableApiKeysParams.ts index 85c138862c..220061e4cc 100644 --- a/packages/generated/client-types/src/lib/models/GetPublishableApiKeysParams.ts +++ b/packages/generated/client-types/src/lib/models/GetPublishableApiKeysParams.ts @@ -24,4 +24,71 @@ export interface GetPublishableApiKeysParams { * Comma-separated fields that should be included in the returned publishable API keys. */ fields?: string + /** + * A field to sort-order the retrieved publishable API keys by. + */ + order?: string + /** + * Filter by a creation date range. + */ + created_at?: { + /** + * filter by dates less than this date + */ + lt?: string + /** + * filter by dates greater than this date + */ + gt?: string + /** + * filter by dates less than or equal to this date + */ + lte?: string + /** + * filter by dates greater than or equal to this date + */ + gte?: string + } + /** + * Filter by a update date range. + */ + updated_at?: { + /** + * filter by dates less than this date + */ + lt?: string + /** + * filter by dates greater than this date + */ + gt?: string + /** + * filter by dates less than or equal to this date + */ + lte?: string + /** + * filter by dates greater than or equal to this date + */ + gte?: string + } + /** + * Filter by a revocation date range. + */ + revoked_at?: { + /** + * filter by dates less than this date + */ + lt?: string + /** + * filter by dates greater than this date + */ + gt?: string + /** + * filter by dates less than or equal to this date + */ + lte?: string + /** + * filter by dates greater than or equal to this date + */ + gte?: string + } } diff --git a/packages/medusa/src/api/routes/admin/publishable-api-keys/list-publishable-api-keys.ts b/packages/medusa/src/api/routes/admin/publishable-api-keys/list-publishable-api-keys.ts index 1265ca22be..9fc6d3e40f 100644 --- a/packages/medusa/src/api/routes/admin/publishable-api-keys/list-publishable-api-keys.ts +++ b/packages/medusa/src/api/routes/admin/publishable-api-keys/list-publishable-api-keys.ts @@ -1,8 +1,12 @@ +import { IsOptional, IsString, ValidateNested } from "class-validator" import { Request, Response } from "express" -import { IsOptional, IsString } from "class-validator" -import { extendedFindParamsMixin } from "../../../../types/common" +import { Type } from "class-transformer" import PublishableApiKeyService from "../../../../services/publishable-api-key" +import { + DateComparisonOperator, + extendedFindParamsMixin, +} from "../../../../types/common" /** * @oas [get] /admin/publishable-api-keys @@ -16,6 +20,76 @@ import PublishableApiKeyService from "../../../../services/publishable-api-key" * - (query) offset=0 {number} The number of publishable API keys to skip when retrieving the publishable API keys. * - (query) expand {string} Comma-separated relations that should be expanded in the returned publishable API keys. * - (query) fields {string} Comma-separated fields that should be included in the returned publishable API keys. + * - (query) order {string} A field to sort-order the retrieved publishable API keys by. + * - in: query + * name: created_at + * required: false + * description: Filter by a creation date range. + * schema: + * type: object + * properties: + * lt: + * type: string + * description: filter by dates less than this date + * format: date + * gt: + * type: string + * description: filter by dates greater than this date + * format: date + * lte: + * type: string + * description: filter by dates less than or equal to this date + * format: date + * gte: + * type: string + * description: filter by dates greater than or equal to this date + * format: date + * - in: query + * name: updated_at + * required: false + * description: Filter by a update date range. + * schema: + * type: object + * properties: + * lt: + * type: string + * description: filter by dates less than this date + * format: date + * gt: + * type: string + * description: filter by dates greater than this date + * format: date + * lte: + * type: string + * description: filter by dates less than or equal to this date + * format: date + * gte: + * type: string + * description: filter by dates greater than or equal to this date + * format: date + * - in: query + * name: revoked_at + * required: false + * description: Filter by a revocation date range. + * schema: + * type: object + * properties: + * lt: + * type: string + * description: filter by dates less than this date + * format: date + * gt: + * type: string + * description: filter by dates greater than this date + * format: date + * lte: + * type: string + * description: filter by dates less than or equal to this date + * format: date + * gte: + * type: string + * description: filter by dates greater than or equal to this date + * format: date * x-codegen: * method: list * queryParams: GetPublishableApiKeysParams @@ -129,4 +203,35 @@ export class GetPublishableApiKeysParams extends extendedFindParamsMixin({ @IsString() @IsOptional() q?: string + + /** + * A field to sort-order the retrieved publishable API keys by. + */ + @IsString() + @IsOptional() + order?: string + + /** + * Date filters to apply on the publishable API keys' `created_at` date. + */ + @IsOptional() + @ValidateNested() + @Type(() => DateComparisonOperator) + created_at?: DateComparisonOperator + + /** + * Date filters to apply on the publishable API keys' `updated_at` date. + */ + @IsOptional() + @ValidateNested() + @Type(() => DateComparisonOperator) + updated_at?: DateComparisonOperator + + /** + * Date filters to apply on the publishable API keys' `revoked_at` date. + */ + @IsOptional() + @ValidateNested() + @Type(() => DateComparisonOperator) + revoked_at?: DateComparisonOperator } diff --git a/packages/medusa/src/services/publishable-api-key.ts b/packages/medusa/src/services/publishable-api-key.ts index 18c88cb175..f7f55d6b93 100644 --- a/packages/medusa/src/services/publishable-api-key.ts +++ b/packages/medusa/src/services/publishable-api-key.ts @@ -1,6 +1,7 @@ import { isDefined, MedusaError } from "medusa-core-utils" import { EntityManager, FindOptionsWhere, ILike } from "typeorm" +import { selectorConstraintsToString } from "@medusajs/utils" import { TransactionBaseService } from "../interfaces" import { PublishableApiKey, SalesChannel } from "../models" import { PublishableApiKeyRepository } from "../repositories/publishable-api-key" @@ -12,7 +13,6 @@ import { } from "../types/publishable-api-key" import { buildQuery, isString } from "../utils" import EventBusService from "./event-bus" -import {selectorConstraintsToString} from "@medusajs/utils"; type InjectedDependencies = { manager: EntityManager