From 5649924625cca832136758b3e1e0fc1adb29ef76 Mon Sep 17 00:00:00 2001 From: Luca Restagno <59067245+lucarestagno@users.noreply.github.com> Date: Fri, 21 Apr 2023 09:52:50 +0200 Subject: [PATCH] Use bulk_keep_going for tracking actions PR-URL: https://github.com/hasura/graphql-engine-mono/pull/8837 Co-authored-by: Vijay Prasanna <11921040+vijayprasanna13@users.noreply.github.com> GitOrigin-RevId: 9e31bcde24303d690f602f8e8bfc0918a8c5f55c --- .../ManageTable/components/handlers.mock.ts | 2 +- .../Data/ManageTable/parts/TableList.tsx | 41 +++++++++++++++-- .../components/TrackedRelationships.tsx | 46 ++++++++++++++----- .../components/UntrackedRelationships.tsx | 8 ---- .../lib/features/Data/hooks/useTrackTables.ts | 15 ++++-- .../hooks/useAllSuggestedRelationships.ts | 33 +++++++++++-- .../hasura-metadata-types/source/source.ts | 11 +++++ .../legacy-ce/src/lib/metadata/queryUtils.ts | 1 + 8 files changed, 123 insertions(+), 34 deletions(-) diff --git a/frontend/libs/console/legacy-ce/src/lib/features/Data/ManageTable/components/handlers.mock.ts b/frontend/libs/console/legacy-ce/src/lib/features/Data/ManageTable/components/handlers.mock.ts index d749e48fade69..1dd5405bee5fa 100644 --- a/frontend/libs/console/legacy-ce/src/lib/features/Data/ManageTable/components/handlers.mock.ts +++ b/frontend/libs/console/legacy-ce/src/lib/features/Data/ManageTable/components/handlers.mock.ts @@ -76,7 +76,7 @@ export const resetMetadata = () => { }; function isTrackOrUntrackTable(body: any) { - return body.type === 'bulk'; + return body.type === 'bulk_keep_going'; } function isTrackTable(arg: any) { diff --git a/frontend/libs/console/legacy-ce/src/lib/features/Data/ManageTable/parts/TableList.tsx b/frontend/libs/console/legacy-ce/src/lib/features/Data/ManageTable/parts/TableList.tsx index 99c485b0f4793..1573ec1d8dd58 100644 --- a/frontend/libs/console/legacy-ce/src/lib/features/Data/ManageTable/parts/TableList.tsx +++ b/frontend/libs/console/legacy-ce/src/lib/features/Data/ManageTable/parts/TableList.tsx @@ -56,11 +56,27 @@ export const TableList = (props: TableListProps) => { if (mode === 'track') { untrackTables({ tablesToBeTracked: tables, - onSuccess: () => { + onSuccess: response => { + response.forEach(result => { + if ('error' in result) { + hasuraToast({ + type: 'error', + title: 'Error while untracking table', + children: result.error, + }); + } + }); + + const successfullyUntrackedCounter = response.filter( + result => 'message' in result && result.message === 'success' + ).length; + + const plural = successfullyUntrackedCounter > 1 ? 's' : ''; + hasuraToast({ type: 'success', title: 'Successfully untracked', - message: `${tables.length} objects untracked`, + message: `${successfullyUntrackedCounter} object${plural} untracked`, }); }, onError: err => { @@ -74,11 +90,26 @@ export const TableList = (props: TableListProps) => { } else { trackTables({ tablesToBeTracked: tables, - onSuccess: () => { + onSuccess: response => { + response.forEach(result => { + if ('error' in result) { + hasuraToast({ + type: 'error', + title: 'Error while tracking table', + children: result.error, + }); + } + }); + + const successfulTrackingsCounter = response.filter( + result => 'message' in result && result.message === 'success' + ).length; + const plural = successfulTrackingsCounter > 1 ? 's' : ''; + hasuraToast({ type: 'success', - title: 'Successfully tracked', - message: `${tables.length} objects tracked`, + title: 'Successfully untracked', + message: `${successfulTrackingsCounter} object${plural} tracked`, }); }, onError: err => { diff --git a/frontend/libs/console/legacy-ce/src/lib/features/Data/TrackResources/components/TrackedRelationships.tsx b/frontend/libs/console/legacy-ce/src/lib/features/Data/TrackResources/components/TrackedRelationships.tsx index 406d8c42ff16a..a37ba874989ad 100644 --- a/frontend/libs/console/legacy-ce/src/lib/features/Data/TrackResources/components/TrackedRelationships.tsx +++ b/frontend/libs/console/legacy-ce/src/lib/features/Data/TrackResources/components/TrackedRelationships.tsx @@ -31,6 +31,8 @@ import Skeleton from 'react-loading-skeleton'; import { generateQueryKeys } from '../../../DatabaseRelationships/utils/queryClientUtils'; import { useQueryClient } from 'react-query'; import { useCheckRows } from '../../../DatabaseRelationships/hooks/useCheckRows'; +import { APIError } from '../../../../hooks/error'; +import { BulkKeepGoingResponse } from '../../../hasura-metadata-types'; const getQueryFunction = (relationship: Relationship) => { if (relationship.type === 'localRelationship') { @@ -70,7 +72,7 @@ export const TrackedRelationships: React.VFC = ({ relationships, }) => { const httpClient = useHttpClient(); - const { mutateAsync } = useMetadataMigration(); + const { mutateAsync } = useMetadataMigration(); const queryClient = useQueryClient(); const [isTrackingSelectedRelationships, setTrackingSelectedRelationships] = @@ -138,27 +140,47 @@ export const TrackedRelationships: React.VFC = ({ await mutateAsync( { query: { - type: 'bulk', + type: 'bulk_keep_going', args: queries, }, }, { - onSuccess: () => { + onSuccess: response => { + response.forEach(result => { + if ('error' in result) { + hasuraToast({ + type: 'error', + title: 'Error while tracking table', + children: result.error, + }); + } + }); + + const successfullyTrackedCounter = response.filter( + result => 'message' in result && result.message === 'success' + ).length; + const plural = successfullyTrackedCounter > 1 ? 's' : ''; + + hasuraToast({ + type: 'success', + title: 'Successfully untracked', + message: `${successfullyTrackedCounter} object${plural} tracked`, + }); + }, + onError: err => { + hasuraToast({ + type: 'error', + title: 'Unable to perform operation', + message: (err as APIError).message, + }); + }, + onSettled: () => { queryClient.invalidateQueries(generateQueryKeys.metadata()); }, } ); onUpdate(); - - const plural = selectedRelationships.length > 1 ? 's' : ''; - const toastMessage = `${selectedRelationships.length} relationship${plural} untracked`; - - hasuraToast({ - title: 'Success', - message: toastMessage, - type: 'success', - }); } } catch (err) { console.error(err); diff --git a/frontend/libs/console/legacy-ce/src/lib/features/Data/TrackResources/components/UntrackedRelationships.tsx b/frontend/libs/console/legacy-ce/src/lib/features/Data/TrackResources/components/UntrackedRelationships.tsx index ed7448a567d3c..fd0c953cade86 100644 --- a/frontend/libs/console/legacy-ce/src/lib/features/Data/TrackResources/components/UntrackedRelationships.tsx +++ b/frontend/libs/console/legacy-ce/src/lib/features/Data/TrackResources/components/UntrackedRelationships.tsx @@ -12,7 +12,6 @@ import { Badge } from '../../../../new-components/Badge'; import { SuggestedRelationshipWithName } from '../../../DatabaseRelationships/components/SuggestedRelationships/hooks/useSuggestedRelationships'; import { RelationshipRow } from './RelationshipRow'; import { SuggestedRelationshipTrackModal } from '../../../DatabaseRelationships/components/SuggestedRelationshipTrackModal/SuggestedRelationshipTrackModal'; -import { hasuraToast } from '../../../../new-components/Toasts'; import Skeleton from 'react-loading-skeleton'; import { AddSuggestedRelationship, @@ -111,13 +110,6 @@ export const UntrackedRelationships: React.VFC = ({ selectedRelationships.map(adaptTrackRelationship); await onAddMultipleSuggestedRelationships(trackRelationships); - - const plural = selectedRelationships.length > 1 ? 's' : ''; - hasuraToast({ - title: 'Success', - message: `${selectedRelationships.length} relationship${plural} tracked`, - type: 'success', - }); } catch (err) { setTrackingSelectedRelationships(false); } diff --git a/frontend/libs/console/legacy-ce/src/lib/features/Data/hooks/useTrackTables.ts b/frontend/libs/console/legacy-ce/src/lib/features/Data/hooks/useTrackTables.ts index b596723e99f95..02e4347a4b887 100644 --- a/frontend/libs/console/legacy-ce/src/lib/features/Data/hooks/useTrackTables.ts +++ b/frontend/libs/console/legacy-ce/src/lib/features/Data/hooks/useTrackTables.ts @@ -7,6 +7,7 @@ import { } from '../../hasura-metadata-api'; import type { TrackableTable } from '../TrackResources/types'; import { MetadataMigrationOptions } from '../../MetadataAPI/hooks/useMetadataMigration'; +import { BulkKeepGoingResponse } from '../../hasura-metadata-types'; export const useTrackTables = ({ dataSourceName, @@ -19,7 +20,7 @@ export const useTrackTables = ({ const invalidateMetadata = useInvalidateMetadata(); - const { mutate, ...rest } = useMetadataMigration({ + const { mutate, ...rest } = useMetadataMigration({ ...globalMutateOptions, onSuccess: (data, variables, ctx) => { invalidateMetadata(); @@ -31,11 +32,13 @@ export const useTrackTables = ({ ({ tablesToBeTracked, ...mutateOptions - }: { tablesToBeTracked: TrackableTable[] } & MetadataMigrationOptions) => { + }: { + tablesToBeTracked: TrackableTable[]; + } & MetadataMigrationOptions) => { mutate( { query: { - type: 'bulk', + type: 'bulk_keep_going', source: dataSourceName, resource_version, args: tablesToBeTracked.map(trackableTable => ({ @@ -58,11 +61,13 @@ export const useTrackTables = ({ ({ tablesToBeTracked, ...mutateOptions - }: { tablesToBeTracked: TrackableTable[] } & MetadataMigrationOptions) => { + }: { + tablesToBeTracked: TrackableTable[]; + } & MetadataMigrationOptions) => { mutate( { query: { - type: 'bulk', + type: 'bulk_keep_going', source: dataSourceName, resource_version, args: tablesToBeTracked.map(trackableTable => ({ diff --git a/frontend/libs/console/legacy-ce/src/lib/features/DatabaseRelationships/components/SuggestedRelationships/hooks/useAllSuggestedRelationships.ts b/frontend/libs/console/legacy-ce/src/lib/features/DatabaseRelationships/components/SuggestedRelationships/hooks/useAllSuggestedRelationships.ts index cf0f1fb3da4ba..dfab08fedb2f8 100644 --- a/frontend/libs/console/legacy-ce/src/lib/features/DatabaseRelationships/components/SuggestedRelationships/hooks/useAllSuggestedRelationships.ts +++ b/frontend/libs/console/legacy-ce/src/lib/features/DatabaseRelationships/components/SuggestedRelationships/hooks/useAllSuggestedRelationships.ts @@ -10,8 +10,13 @@ import { SuggestedRelationshipsResponse, } from './useSuggestedRelationships'; import { useMetadataMigration } from '../../../../MetadataAPI'; -import { NamingConvention, Table } from '../../../../hasura-metadata-types'; +import { + BulkKeepGoingResponse, + NamingConvention, + Table, +} from '../../../../hasura-metadata-types'; import { getTrackedRelationshipsCacheKey } from '../../../../Data/TrackResources/components/hooks/useTrackedRelationships'; +import { hasuraToast } from '../../../../../new-components/Toasts'; export type AddSuggestedRelationship = { name: string; @@ -89,7 +94,7 @@ export const useAllSuggestedRelationships = ({ const rawSuggestedRelationships = data?.relationships || []; - const metadataMutation = useMetadataMigration({}); + const metadataMutation = useMetadataMigration({}); const queryClient = useQueryClient(); const onAddMultipleSuggestedRelationships = async ( @@ -118,11 +123,33 @@ export const useAllSuggestedRelationships = ({ await metadataMutation.mutateAsync( { query: { - type: 'bulk', + type: 'bulk_keep_going', args: queries, }, }, { + onSuccess: response => { + response.forEach(result => { + if ('error' in result) { + hasuraToast({ + type: 'error', + title: 'Error while tracking foreign key', + children: result.error, + }); + } + }); + + const successfullyTrackedCounter = response.filter( + result => 'message' in result && result.message === 'success' + ).length; + const plural = successfullyTrackedCounter > 1 ? 's' : ''; + + hasuraToast({ + type: 'success', + title: 'Successfully tracked', + message: `${successfullyTrackedCounter} foreign key${plural} tracked`, + }); + }, onSettled: () => { queryClient.invalidateQueries({ queryKey: getAllSuggestedRelationshipsCacheQuery( diff --git a/frontend/libs/console/legacy-ce/src/lib/features/hasura-metadata-types/source/source.ts b/frontend/libs/console/legacy-ce/src/lib/features/hasura-metadata-types/source/source.ts index 031e9209f5631..5c50c2896ff14 100644 --- a/frontend/libs/console/legacy-ce/src/lib/features/hasura-metadata-types/source/source.ts +++ b/frontend/libs/console/legacy-ce/src/lib/features/hasura-metadata-types/source/source.ts @@ -85,3 +85,14 @@ export type Source = { ); export type QualifiedFunction = unknown; + +export type BulkKeepGoingResponse = [ + | { + message: 'success'; + } + | { + code: string; + error: string; + path: string; + } +]; diff --git a/frontend/libs/console/legacy-ce/src/lib/metadata/queryUtils.ts b/frontend/libs/console/legacy-ce/src/lib/metadata/queryUtils.ts index 1dc917712a6cd..6a2abaa6ae7a6 100644 --- a/frontend/libs/console/legacy-ce/src/lib/metadata/queryUtils.ts +++ b/frontend/libs/console/legacy-ce/src/lib/metadata/queryUtils.ts @@ -88,6 +88,7 @@ export const metadataQueryTypes = [ 'set_custom_types', 'dump_internal_state', 'bulk', + 'bulk_keep_going', 'get_catalog_state', 'set_catalog_state', 'set_table_customization',