-
Notifications
You must be signed in to change notification settings - Fork 392
upcoming: [M3-9225] - Add API queries for MarketplaceV2 #13255
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weβll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 2 commits
140aac1
1bbbcf1
56d813e
5e38907
83185f4
68a6772
ffaed0c
c147bab
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,5 @@ | ||
| --- | ||
| "@linode/queries": Upcoming Features | ||
| --- | ||
|
|
||
| Add API queries for MarketplaceV2 ([#13255](https://github.com/linode/manager/pull/13255)) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,3 @@ | ||
| export * from './keys'; | ||
| export * from './marketplace'; | ||
| export * from './requests'; |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,108 @@ | ||
| import { | ||
| getMarketplaceCategories, | ||
| getMarketplacePartners, | ||
| getMarketplaceProduct, | ||
| getMarketplaceProducts, | ||
| getMarketplaceTypes, | ||
| } from '@linode/api-v4'; | ||
| import { createQueryKeys } from '@lukemorales/query-key-factory'; | ||
|
|
||
| import { | ||
| getAllMarketplaceCategories, | ||
| getAllMarketplacePartners, | ||
| getAllMarketplaceProducts, | ||
| getAllMarketplaceTypes, | ||
| } from './requests'; | ||
|
|
||
| import type { Filter, Params } from '@linode/api-v4'; | ||
|
|
||
| export const marketplaceQueries = createQueryKeys('marketplace', { | ||
| product: (productId: number) => ({ | ||
| queryFn: () => getMarketplaceProduct(productId), | ||
| queryKey: [productId], | ||
| }), | ||
| products: { | ||
| contextQueries: { | ||
| all: (params: Params = {}, filter: Filter = {}) => ({ | ||
| queryFn: () => getAllMarketplaceProducts(params, filter), | ||
| queryKey: [params, filter], | ||
| }), | ||
| infinite: (filter: Filter = {}) => ({ | ||
| queryFn: ({ pageParam }) => | ||
| getMarketplaceProducts( | ||
| { page: pageParam as number, page_size: 25 }, | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should page size be 25 for products api also?
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Minimum size for a page is 25 |
||
| filter, | ||
| ), | ||
| queryKey: [filter], | ||
| }), | ||
| paginated: (params: Params = {}, filter: Filter = {}) => ({ | ||
| queryFn: () => getMarketplaceProducts(params, filter), | ||
| queryKey: [params, filter], | ||
| }), | ||
| }, | ||
| queryKey: null, | ||
| }, | ||
| categories: { | ||
| contextQueries: { | ||
| all: (params: Params = {}, filter: Filter = {}) => ({ | ||
| queryFn: () => getAllMarketplaceCategories(params, filter), | ||
| queryKey: [params, filter], | ||
| }), | ||
| infinite: (filter: Filter = {}) => ({ | ||
| queryFn: ({ pageParam }) => | ||
| getMarketplaceCategories( | ||
| { page: pageParam as number, page_size: 25 }, | ||
| filter, | ||
| ), | ||
| queryKey: [filter], | ||
| }), | ||
| paginated: (params: Params = {}, filter: Filter = {}) => ({ | ||
| queryFn: () => getMarketplaceCategories(params, filter), | ||
| queryKey: [params, filter], | ||
| }), | ||
| }, | ||
| queryKey: null, | ||
| }, | ||
| types: { | ||
| contextQueries: { | ||
| all: (params: Params = {}, filter: Filter = {}) => ({ | ||
| queryFn: () => getAllMarketplaceTypes(params, filter), | ||
| queryKey: [params, filter], | ||
| }), | ||
| infinite: (filter: Filter = {}) => ({ | ||
| queryFn: ({ pageParam }) => | ||
| getMarketplaceTypes( | ||
| { page: pageParam as number, page_size: 25 }, | ||
| filter, | ||
| ), | ||
| queryKey: [filter], | ||
| }), | ||
| paginated: (params: Params = {}, filter: Filter = {}) => ({ | ||
| queryFn: () => getMarketplaceTypes(params, filter), | ||
| queryKey: [params, filter], | ||
| }), | ||
| }, | ||
| queryKey: null, | ||
| }, | ||
| partners: { | ||
| contextQueries: { | ||
| all: (params: Params = {}, filter: Filter = {}) => ({ | ||
| queryFn: () => getAllMarketplacePartners(params, filter), | ||
| queryKey: [params, filter], | ||
| }), | ||
| infinite: (filter: Filter = {}) => ({ | ||
| queryFn: ({ pageParam }) => | ||
| getMarketplacePartners( | ||
| { page: pageParam as number, page_size: 25 }, | ||
| filter, | ||
| ), | ||
| queryKey: [filter], | ||
| }), | ||
| paginated: (params: Params = {}, filter: Filter = {}) => ({ | ||
| queryFn: () => getMarketplaceTypes(params, filter), | ||
|
||
| queryKey: [params, filter], | ||
| }), | ||
| }, | ||
| queryKey: null, | ||
| }, | ||
| }); | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,165 @@ | ||
| import { | ||
|
Check warning on line 1 in packages/queries/src/marketplace/marketplace.ts
|
||
| APIError, | ||
| createPartnerReferral, | ||
| Filter, | ||
| MarketplaceCategory, | ||
| MarketplacePartner, | ||
| MarketplacePartnerReferralPayload, | ||
| MarketplaceProduct, | ||
|
||
| Params, | ||
| ResourcePage, | ||
| } from '@linode/api-v4'; | ||
| import { | ||
| keepPreviousData, | ||
| useInfiniteQuery, | ||
| useMutation, | ||
| useQuery, | ||
| useQueryClient, | ||
| } from '@tanstack/react-query'; | ||
|
|
||
| import { accountQueries } from '../account'; | ||
| import { marketplaceQueries } from './keys'; | ||
|
|
||
| export const useMarketplaceProductsQuery = ( | ||
| params: Params, | ||
| filter: Filter, | ||
| enabled: boolean = false, | ||
|
||
| ) => { | ||
| useQuery<ResourcePage<MarketplaceProduct>, APIError[]>({ | ||
pmakode-akamai marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| ...marketplaceQueries.products._ctx.paginated(params, filter), | ||
| enabled, | ||
| placeholderData: keepPreviousData, | ||
| }); | ||
| }; | ||
|
|
||
| export const useAllMarketplaceProductsQuery = ( | ||
| params: Params = {}, | ||
| filter: Filter = {}, | ||
| enabled: boolean = false, | ||
| ) => | ||
| useQuery<MarketplaceProduct[], APIError[]>({ | ||
| ...marketplaceQueries.products._ctx.all(params, filter), | ||
| enabled, | ||
| }); | ||
|
|
||
| export const useInfiniteMarketplaceProductsQuery = ( | ||
| filter: Filter, | ||
| enabled: boolean, | ||
| ) => { | ||
| return useInfiniteQuery<ResourcePage<MarketplaceProduct>, APIError[]>({ | ||
| ...marketplaceQueries.products._ctx.infinite(filter), | ||
| enabled, | ||
| getNextPageParam: ({ page, pages }) => { | ||
| if (page === pages) { | ||
| return undefined; | ||
| } | ||
| return page + 1; | ||
| }, | ||
| initialPageParam: 1, | ||
| retry: false, | ||
| }); | ||
| }; | ||
|
|
||
| export const useMarketplaceProductQuery = ( | ||
| productId: number, | ||
| enabled: boolean = false, | ||
| ) => | ||
| useQuery<MarketplaceProduct, APIError[]>({ | ||
| ...marketplaceQueries.product(productId), | ||
| enabled, | ||
| }); | ||
|
|
||
| export const useMarketplaceCategoriesQuery = ( | ||
| params: Params, | ||
| filter: Filter, | ||
| enabled: boolean = false, | ||
| ) => { | ||
| useQuery<ResourcePage<MarketplaceCategory>, APIError[]>({ | ||
pmakode-akamai marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| ...marketplaceQueries.categories._ctx.paginated(params, filter), | ||
| enabled, | ||
| placeholderData: keepPreviousData, | ||
| }); | ||
| }; | ||
|
|
||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There is no types defined in here like (like useMarketplaceTypesQuery, useAllMarketplaceTypesQuery, etc.). In keys we have queries defined for types api though. Hook should be added here for types. |
||
| export const useAllMarketplaceCategoriesQuery = ( | ||
| params: Params = {}, | ||
| filter: Filter = {}, | ||
| enabled: boolean = false, | ||
| ) => | ||
| useQuery<MarketplaceCategory[], APIError[]>({ | ||
| ...marketplaceQueries.categories._ctx.all(params, filter), | ||
| enabled, | ||
| }); | ||
|
|
||
| export const useInfiniteMarketplaceCategoriesQuery = ( | ||
| filter: Filter, | ||
| enabled: boolean, | ||
| ) => { | ||
| return useInfiniteQuery<ResourcePage<MarketplaceCategory>, APIError[]>({ | ||
| ...marketplaceQueries.categories._ctx.infinite(filter), | ||
| enabled, | ||
| getNextPageParam: ({ page, pages }) => { | ||
| if (page === pages) { | ||
| return undefined; | ||
| } | ||
| return page + 1; | ||
| }, | ||
| initialPageParam: 1, | ||
| retry: false, | ||
| }); | ||
| }; | ||
|
|
||
| export const useMarketplacePartnersQuery = ( | ||
| params: Params, | ||
| filter: Filter, | ||
| enabled: boolean = false, | ||
| ) => { | ||
| useQuery<ResourcePage<MarketplacePartner>, APIError[]>({ | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. need to have a return statement before useQuery |
||
| ...marketplaceQueries.partners._ctx.paginated(params, filter), | ||
| enabled, | ||
| placeholderData: keepPreviousData, | ||
| }); | ||
| }; | ||
|
|
||
| export const useAllMarketplacePartnersQuery = ( | ||
| params: Params = {}, | ||
| filter: Filter = {}, | ||
| enabled: boolean = false, | ||
| ) => | ||
| useQuery<MarketplacePartner[], APIError[]>({ | ||
| ...marketplaceQueries.partners._ctx.all(params, filter), | ||
| enabled, | ||
| }); | ||
|
|
||
| export const useInfiniteMarketplacePartnersQuery = ( | ||
| filter: Filter, | ||
| enabled: boolean, | ||
| ) => { | ||
| return useInfiniteQuery<ResourcePage<MarketplacePartner>, APIError[]>({ | ||
| ...marketplaceQueries.partners._ctx.infinite(filter), | ||
| enabled, | ||
| getNextPageParam: ({ page, pages }) => { | ||
| if (page === pages) { | ||
| return undefined; | ||
| } | ||
| return page + 1; | ||
| }, | ||
| initialPageParam: 1, | ||
| retry: false, | ||
| }); | ||
| }; | ||
|
|
||
| export const useCreatePartnerReferralMutation = () => { | ||
| const queryClient = useQueryClient(); | ||
| return useMutation<{}, APIError[], MarketplacePartnerReferralPayload>({ | ||
|
Check warning on line 154 in packages/queries/src/marketplace/marketplace.ts
|
||
| mutationFn: createPartnerReferral, | ||
| onSuccess: () => { | ||
| setTimeout(() => { | ||
| // Refetch notifications after 1.5 seconds. The API needs some time to process. | ||
| queryClient.invalidateQueries({ | ||
| queryKey: accountQueries.notifications.queryKey, | ||
| }); | ||
| }, 1500); | ||
| }, | ||
| }); | ||
| }; | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,60 @@ | ||
| import { | ||
| getMarketplaceCategories, | ||
| getMarketplacePartners, | ||
| getMarketplaceProducts, | ||
| getMarketplaceTypes, | ||
| } from '@linode/api-v4'; | ||
| import { getAll } from '@linode/utilities'; | ||
|
|
||
| import type { | ||
| Filter, | ||
| MarketplaceCategory, | ||
| MarketplacePartner, | ||
| MarketplaceProduct, | ||
| MarketplaceType, | ||
| Params, | ||
| } from '@linode/api-v4'; | ||
|
|
||
| export const getAllMarketplaceProducts = ( | ||
| passedParams: Params = {}, | ||
| passedFilter: Filter = {}, | ||
| ) => | ||
| getAll<MarketplaceProduct>((params, filter) => | ||
| getMarketplaceProducts( | ||
| { ...params, ...passedParams }, | ||
| { ...filter, ...passedFilter }, | ||
| ), | ||
| )().then((data) => data.data); | ||
|
|
||
| export const getAllMarketplaceCategories = ( | ||
| passedParams: Params = {}, | ||
| passedFilter: Filter = {}, | ||
| ) => | ||
| getAll<MarketplaceCategory>((params, filter) => | ||
| getMarketplaceCategories( | ||
| { ...params, ...passedParams }, | ||
| { ...filter, ...passedFilter }, | ||
| ), | ||
| )().then((data) => data.data); | ||
|
|
||
| export const getAllMarketplaceTypes = ( | ||
| passedParams: Params = {}, | ||
| passedFilter: Filter = {}, | ||
| ) => | ||
| getAll<MarketplaceType>((params, filter) => | ||
| getMarketplaceTypes( | ||
| { ...params, ...passedParams }, | ||
| { ...filter, ...passedFilter }, | ||
| ), | ||
| )().then((data) => data.data); | ||
|
|
||
| export const getAllMarketplacePartners = ( | ||
| passedParams: Params = {}, | ||
| passedFilter: Filter = {}, | ||
| ) => | ||
| getAll<MarketplacePartner>((params, filter) => | ||
| getMarketplacePartners( | ||
| { ...params, ...passedParams }, | ||
| { ...filter, ...passedFilter }, | ||
| ), | ||
| )().then((data) => data.data); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
now the api has changed from /marketplace/products/{id} to /marketplace/products/{id}/details