Separate system operations from core objects in GraphQL endpoints (#12977)

Moves system-level operations (auth, billing, admin) to use the
/metadata endpoint instead of /graphql.

This cleans up the endpoint separation so /graphql is purely for core
objects (Company, People, etc.) and /metadata handles all system
operations.

Part of prep work for webhook/API key core migration.
This commit is contained in:
nitin
2025-07-01 21:59:32 +05:30
committed by GitHub
parent 76c517aa29
commit d2ddd6f473
229 changed files with 9425 additions and 8804 deletions

View File

@ -1,9 +1,9 @@
import { useApolloClient } from '@apollo/client';
import { useCallback } from 'react';
import { v4 } from 'uuid';
import { triggerCreateRecordsOptimisticEffect } from '@/apollo/optimistic-effect/utils/triggerCreateRecordsOptimisticEffect';
import { triggerUpdateRecordOptimisticEffect } from '@/apollo/optimistic-effect/utils/triggerUpdateRecordOptimisticEffect';
import { useApolloCoreClient } from '@/object-metadata/hooks/useApolloCoreClient';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems';
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
@ -35,14 +35,14 @@ export const usePersistViewFieldRecords = () => {
const { objectMetadataItems } = useObjectMetadataItems();
const { objectPermissionsByObjectMetadataId } = useObjectPermissions();
const apolloClient = useApolloClient();
const apolloCoreClient = useApolloCoreClient();
const createViewFieldRecords = useCallback(
(viewFieldsToCreate: ViewField[], view: GraphQLView) => {
if (!viewFieldsToCreate.length) return;
return Promise.all(
viewFieldsToCreate.map((viewField) =>
apolloClient.mutate({
apolloCoreClient.mutate({
mutation: createOneRecordMutation,
variables: {
input: {
@ -71,7 +71,7 @@ export const usePersistViewFieldRecords = () => {
);
},
[
apolloClient,
apolloCoreClient,
createOneRecordMutation,
objectMetadataItem,
objectMetadataItems,
@ -85,7 +85,7 @@ export const usePersistViewFieldRecords = () => {
return Promise.all(
viewFieldsToUpdate.map((viewField) =>
apolloClient.mutate({
apolloCoreClient.mutate({
mutation: updateOneRecordMutation,
variables: {
idToUpdate: viewField.id,
@ -119,7 +119,7 @@ export const usePersistViewFieldRecords = () => {
);
},
[
apolloClient,
apolloCoreClient,
getRecordFromCache,
objectMetadataItem,
objectMetadataItems,

View File

@ -1,9 +1,9 @@
import { useApolloClient } from '@apollo/client';
import { useCallback } from 'react';
import { triggerCreateRecordsOptimisticEffect } from '@/apollo/optimistic-effect/utils/triggerCreateRecordsOptimisticEffect';
import { triggerDestroyRecordsOptimisticEffect } from '@/apollo/optimistic-effect/utils/triggerDestroyRecordsOptimisticEffect';
import { triggerUpdateRecordOptimisticEffect } from '@/apollo/optimistic-effect/utils/triggerUpdateRecordOptimisticEffect';
import { useApolloCoreClient } from '@/object-metadata/hooks/useApolloCoreClient';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems';
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
@ -39,11 +39,11 @@ export const usePersistViewFilterGroupRecords = () => {
const { objectMetadataItems } = useObjectMetadataItems();
const { objectPermissionsByObjectMetadataId } = useObjectPermissions();
const apolloClient = useApolloClient();
const apolloCoreClient = useApolloCoreClient();
const createViewFilterGroupRecord = useCallback(
async (viewFilterGroup: ViewFilterGroup, view: GraphQLView) => {
const result = await apolloClient.mutate<{
const result = await apolloCoreClient.mutate<{
createViewFilterGroup: ViewFilterGroup;
}>({
mutation: createOneRecordMutation,
@ -78,7 +78,7 @@ export const usePersistViewFilterGroupRecords = () => {
return { newRecordId: result.data.createViewFilterGroup.id };
},
[
apolloClient,
apolloCoreClient,
createOneRecordMutation,
objectMetadataItem,
objectMetadataItems,
@ -129,7 +129,7 @@ export const usePersistViewFilterGroupRecords = () => {
if (!viewFilterGroupsToUpdate.length) return;
return Promise.all(
viewFilterGroupsToUpdate.map((viewFilterGroup) =>
apolloClient.mutate<{ updateViewFilterGroup: ViewFilterGroup }>({
apolloCoreClient.mutate<{ updateViewFilterGroup: ViewFilterGroup }>({
mutation: updateOneRecordMutation,
variables: {
idToUpdate: viewFilterGroup.id,
@ -164,7 +164,7 @@ export const usePersistViewFilterGroupRecords = () => {
);
},
[
apolloClient,
apolloCoreClient,
getRecordFromCache,
objectMetadataItem,
objectMetadataItems,
@ -177,7 +177,7 @@ export const usePersistViewFilterGroupRecords = () => {
if (!viewFilterGroupIdsToDelete.length) return;
return Promise.all(
viewFilterGroupIdsToDelete.map((viewFilterGroupId) =>
apolloClient.mutate<{ destroyViewFilterGroup: ViewFilterGroup }>({
apolloCoreClient.mutate<{ destroyViewFilterGroup: ViewFilterGroup }>({
mutation: destroyOneRecordMutation,
variables: {
idToDestroy: viewFilterGroupId,
@ -201,7 +201,7 @@ export const usePersistViewFilterGroupRecords = () => {
);
},
[
apolloClient,
apolloCoreClient,
destroyOneRecordMutation,
getRecordFromCache,
objectMetadataItem,

View File

@ -1,9 +1,9 @@
import { useApolloClient } from '@apollo/client';
import { useCallback } from 'react';
import { triggerCreateRecordsOptimisticEffect } from '@/apollo/optimistic-effect/utils/triggerCreateRecordsOptimisticEffect';
import { triggerDestroyRecordsOptimisticEffect } from '@/apollo/optimistic-effect/utils/triggerDestroyRecordsOptimisticEffect';
import { triggerUpdateRecordOptimisticEffect } from '@/apollo/optimistic-effect/utils/triggerUpdateRecordOptimisticEffect';
import { useApolloCoreClient } from '@/object-metadata/hooks/useApolloCoreClient';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems';
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
@ -39,7 +39,7 @@ export const usePersistViewFilterRecords = () => {
const { objectMetadataItems } = useObjectMetadataItems();
const { objectPermissionsByObjectMetadataId } = useObjectPermissions();
const apolloClient = useApolloClient();
const apolloCoreClient = useApolloCoreClient();
const createViewFilterRecords = useCallback(
(viewFiltersToCreate: ViewFilter[], view: GraphQLView) => {
@ -47,7 +47,7 @@ export const usePersistViewFilterRecords = () => {
return Promise.all(
viewFiltersToCreate.map((viewFilter) =>
apolloClient.mutate({
apolloCoreClient.mutate({
mutation: createOneRecordMutation,
variables: {
input: {
@ -79,7 +79,7 @@ export const usePersistViewFilterRecords = () => {
);
},
[
apolloClient,
apolloCoreClient,
createOneRecordMutation,
objectMetadataItem,
objectMetadataItems,
@ -92,7 +92,7 @@ export const usePersistViewFilterRecords = () => {
if (!viewFiltersToUpdate.length) return;
return Promise.all(
viewFiltersToUpdate.map((viewFilter) =>
apolloClient.mutate({
apolloCoreClient.mutate({
mutation: updateOneRecordMutation,
variables: {
idToUpdate: viewFilter.id,
@ -128,7 +128,7 @@ export const usePersistViewFilterRecords = () => {
);
},
[
apolloClient,
apolloCoreClient,
getRecordFromCache,
objectMetadataItem,
objectMetadataItems,
@ -141,7 +141,7 @@ export const usePersistViewFilterRecords = () => {
if (!viewFilterIdsToDelete.length) return;
return Promise.all(
viewFilterIdsToDelete.map((viewFilterId) =>
apolloClient.mutate({
apolloCoreClient.mutate({
mutation: destroyOneRecordMutation,
variables: {
idToDestroy: viewFilterId,
@ -168,7 +168,7 @@ export const usePersistViewFilterRecords = () => {
);
},
[
apolloClient,
apolloCoreClient,
destroyOneRecordMutation,
getRecordFromCache,
objectMetadataItem,

View File

@ -1,18 +1,18 @@
import { useCallback } from 'react';
import { useApolloCoreClient } from '@/object-metadata/hooks/useApolloCoreClient';
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { useCreateManyRecords } from '@/object-record/hooks/useCreateManyRecords';
import { useDestroyManyRecords } from '@/object-record/hooks/useDestroyManyRecords';
import { useUpdateOneRecordMutation } from '@/object-record/hooks/useUpdateOneRecordMutation';
import { ViewGroup } from '@/views/types/ViewGroup';
import { useApolloClient } from '@apollo/client';
type CreateViewGroupRecordsArgs = {
viewGroupsToCreate: ViewGroup[];
viewId: string;
};
export const usePersistViewGroupRecords = () => {
const apolloClient = useApolloClient();
const apolloCoreClient = useApolloCoreClient();
const { createManyRecords } = useCreateManyRecords({
objectNameSingular: CoreObjectNameSingular.ViewGroup,
@ -46,7 +46,7 @@ export const usePersistViewGroupRecords = () => {
if (!viewGroupsToUpdate.length) return;
const mutationPromises = viewGroupsToUpdate.map((viewGroup) =>
apolloClient.mutate<{ updateViewGroup: ViewGroup }>({
apolloCoreClient.mutate<{ updateViewGroup: ViewGroup }>({
mutation: updateOneRecordMutation,
variables: {
idToUpdate: viewGroup.id,
@ -69,8 +69,8 @@ export const usePersistViewGroupRecords = () => {
if (!record) return;
apolloClient.cache.modify({
id: apolloClient.cache.identify({
apolloCoreClient.cache.modify({
id: apolloCoreClient.cache.identify({
__typename: 'ViewGroup',
id: record.id,
}),
@ -81,7 +81,7 @@ export const usePersistViewGroupRecords = () => {
});
});
},
[apolloClient, updateOneRecordMutation],
[apolloCoreClient, updateOneRecordMutation],
);
const deleteViewGroupRecords = useCallback(

View File

@ -1,9 +1,9 @@
import { useApolloClient } from '@apollo/client';
import { useCallback } from 'react';
import { triggerCreateRecordsOptimisticEffect } from '@/apollo/optimistic-effect/utils/triggerCreateRecordsOptimisticEffect';
import { triggerDestroyRecordsOptimisticEffect } from '@/apollo/optimistic-effect/utils/triggerDestroyRecordsOptimisticEffect';
import { triggerUpdateRecordOptimisticEffect } from '@/apollo/optimistic-effect/utils/triggerUpdateRecordOptimisticEffect';
import { useApolloCoreClient } from '@/object-metadata/hooks/useApolloCoreClient';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems';
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
@ -39,14 +39,14 @@ export const usePersistViewSortRecords = () => {
const { objectMetadataItems } = useObjectMetadataItems();
const { objectPermissionsByObjectMetadataId } = useObjectPermissions();
const apolloClient = useApolloClient();
const apolloCoreClient = useApolloCoreClient();
const createViewSortRecords = useCallback(
(viewSortsToCreate: ViewSort[], view: GraphQLView) => {
if (!viewSortsToCreate.length) return;
return Promise.all(
viewSortsToCreate.map((viewSort) =>
apolloClient.mutate({
apolloCoreClient.mutate({
mutation: createOneRecordMutation,
variables: {
input: {
@ -73,7 +73,7 @@ export const usePersistViewSortRecords = () => {
);
},
[
apolloClient,
apolloCoreClient,
createOneRecordMutation,
objectMetadataItem,
objectMetadataItems,
@ -86,7 +86,7 @@ export const usePersistViewSortRecords = () => {
if (!viewSortsToUpdate.length) return;
return Promise.all(
viewSortsToUpdate.map((viewSort) =>
apolloClient.mutate({
apolloCoreClient.mutate({
mutation: updateOneRecordMutation,
variables: {
idToUpdate: viewSort.id,
@ -117,7 +117,7 @@ export const usePersistViewSortRecords = () => {
);
},
[
apolloClient,
apolloCoreClient,
getRecordFromCache,
objectMetadataItem,
objectMetadataItems,
@ -130,7 +130,7 @@ export const usePersistViewSortRecords = () => {
if (!viewSortIdsToDelete.length) return;
return Promise.all(
viewSortIdsToDelete.map((viewSortId) =>
apolloClient.mutate({
apolloCoreClient.mutate({
mutation: destroyOneRecordMutation,
variables: {
idToDestroy: viewSortId,
@ -157,7 +157,7 @@ export const usePersistViewSortRecords = () => {
);
},
[
apolloClient,
apolloCoreClient,
destroyOneRecordMutation,
getRecordFromCache,
objectMetadataItem,

View File

@ -1,4 +1,3 @@
import { useApolloClient } from '@apollo/client';
import { isNonEmptyString, isObject } from '@sniptt/guards';
import qs from 'qs';
import { useMemo } from 'react';
@ -6,6 +5,7 @@ import { useParams, useSearchParams } from 'react-router-dom';
import { useRecoilCallback, useRecoilValue } from 'recoil';
import z from 'zod';
import { useApolloCoreClient } from '@/object-metadata/hooks/useApolloCoreClient';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { useObjectNameSingularFromPlural } from '@/object-metadata/hooks/useObjectNameSingularFromPlural';
import { objectMetadataItemFamilySelector } from '@/object-metadata/states/objectMetadataItemFamilySelector';
@ -34,7 +34,7 @@ const filterQueryParamsSchema = z.object({
export type FilterQueryParams = z.infer<typeof filterQueryParamsSchema>;
export const useViewFromQueryParams = () => {
const apolloClient = useApolloClient();
const apolloCoreClient = useApolloCoreClient();
const [searchParams] = useSearchParams();
const { objectNamePlural = '' } = useParams();
const { objectNameSingular } = useObjectNameSingularFromPlural({
@ -118,7 +118,7 @@ export const useViewFromQueryParams = () => {
(Array.isArray(filterValueFromURL) ||
satisfiesRelationFilterSchema)
) {
const queryResult = await apolloClient.query<
const queryResult = await apolloCoreClient.query<
Record<string, { edges: { node: ObjectRecord }[] }>
>({
query: generateFindManyRecordsQuery({
@ -180,7 +180,7 @@ export const useViewFromQueryParams = () => {
).filter(isDefined);
},
[
apolloClient,
apolloCoreClient,
filterQueryParams,
hasFiltersQueryParams,
objectMetadataItem.fields,

View File

@ -1,7 +1,7 @@
import { RecordBoardFieldDefinition } from '@/object-record/record-board/types/RecordBoardFieldDefinition';
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
import { mapBoardFieldDefinitionsToViewFields } from '@/views/utils/mapBoardFieldDefinitionsToViewFields';
import { FieldMetadataType } from '~/generated/graphql';
import { FieldMetadataType } from '~/generated-metadata/graphql';
describe('mapBoardFieldDefinitionsToViewFields', () => {
it('should map board field definitions to view fields', () => {

View File

@ -11,7 +11,7 @@ import { mapViewFieldsToColumnDefinitions } from '@/views/utils/mapViewFieldsToC
import { mapViewFiltersToFilters } from '@/views/utils/mapViewFiltersToFilters';
import { mapViewSortsToSorts } from '@/views/utils/mapViewSortsToSorts';
import { FieldMetadataType } from '~/generated/graphql';
import { FieldMetadataType } from '~/generated-metadata/graphql';
const baseFieldMetadataItem = {
id: '05731f68-6e7a-4903-8374-c0b6a9063482',