Remove dead code linked to quick actions (#6587)
Removing dead code, we'll take another approach to build this
This commit is contained in:
@ -1,16 +0,0 @@
|
|||||||
import { PERSON_FRAGMENT } from '@/object-record/hooks/__mocks__/personFragment';
|
|
||||||
import { gql } from '@apollo/client';
|
|
||||||
|
|
||||||
export { responseData } from './useUpdateOneRecord';
|
|
||||||
|
|
||||||
export const query = gql`
|
|
||||||
mutation ExecuteQuickActionOnOnePerson($idToExecuteQuickActionOn: ID!) {
|
|
||||||
executeQuickActionOnPerson(id: $idToExecuteQuickActionOn) {
|
|
||||||
${PERSON_FRAGMENT}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
export const variables = {
|
|
||||||
idToExecuteQuickActionOn: 'a7286b9a-c039-4a89-9567-2dfa7953cda9',
|
|
||||||
};
|
|
||||||
@ -1,62 +0,0 @@
|
|||||||
import { ReactNode } from 'react';
|
|
||||||
import { MockedProvider } from '@apollo/client/testing';
|
|
||||||
import { act, renderHook } from '@testing-library/react';
|
|
||||||
import { RecoilRoot } from 'recoil';
|
|
||||||
|
|
||||||
import {
|
|
||||||
query,
|
|
||||||
responseData,
|
|
||||||
variables,
|
|
||||||
} from '@/object-record/hooks/__mocks__/useExecuteQuickActionOnOneRecord';
|
|
||||||
import { useExecuteQuickActionOnOneRecord } from '@/object-record/hooks/useExecuteQuickActionOnOneRecord';
|
|
||||||
|
|
||||||
const idToExecuteQuickActionOn = 'a7286b9a-c039-4a89-9567-2dfa7953cda9';
|
|
||||||
|
|
||||||
const mocks = [
|
|
||||||
{
|
|
||||||
request: {
|
|
||||||
query,
|
|
||||||
variables,
|
|
||||||
},
|
|
||||||
result: jest.fn(() => ({
|
|
||||||
data: {
|
|
||||||
executeQuickActionOnPerson: {
|
|
||||||
...responseData,
|
|
||||||
id: idToExecuteQuickActionOn,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
})),
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
const Wrapper = ({ children }: { children: ReactNode }) => (
|
|
||||||
<RecoilRoot>
|
|
||||||
<MockedProvider mocks={mocks} addTypename={false}>
|
|
||||||
{children}
|
|
||||||
</MockedProvider>
|
|
||||||
</RecoilRoot>
|
|
||||||
);
|
|
||||||
|
|
||||||
describe('useExecuteQuickActionOnOneRecord', () => {
|
|
||||||
it('should work as expected', async () => {
|
|
||||||
const { result } = renderHook(
|
|
||||||
() =>
|
|
||||||
useExecuteQuickActionOnOneRecord({
|
|
||||||
objectNameSingular: 'person',
|
|
||||||
}),
|
|
||||||
{
|
|
||||||
wrapper: Wrapper,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
await act(async () => {
|
|
||||||
const res = await result.current.executeQuickActionOnOneRecord(
|
|
||||||
idToExecuteQuickActionOn,
|
|
||||||
);
|
|
||||||
|
|
||||||
expect(res).toHaveProperty('id', idToExecuteQuickActionOn);
|
|
||||||
});
|
|
||||||
|
|
||||||
expect(mocks[0].result).toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@ -1,40 +0,0 @@
|
|||||||
import { renderHook } from '@testing-library/react';
|
|
||||||
import { print } from 'graphql';
|
|
||||||
import { RecoilRoot } from 'recoil';
|
|
||||||
|
|
||||||
import { PERSON_FRAGMENT } from '@/object-record/hooks/__mocks__/personFragment';
|
|
||||||
import { useExecuteQuickActionOnOneRecordMutation } from '@/object-record/hooks/useExecuteQuickActionOnOneRecordMutation';
|
|
||||||
|
|
||||||
const expectedQueryTemplate = `
|
|
||||||
mutation ExecuteQuickActionOnOnePerson($idToExecuteQuickActionOn: ID!) {
|
|
||||||
executeQuickActionOnPerson(id: $idToExecuteQuickActionOn) {
|
|
||||||
${PERSON_FRAGMENT}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`.replace(/\s/g, '');
|
|
||||||
|
|
||||||
describe('useExecuteQuickActionOnOneRecordMutation', () => {
|
|
||||||
it('should return a valid executeQuickActionOnOneRecordMutation', () => {
|
|
||||||
const objectNameSingular = 'person';
|
|
||||||
|
|
||||||
const { result } = renderHook(
|
|
||||||
() =>
|
|
||||||
useExecuteQuickActionOnOneRecordMutation({
|
|
||||||
objectNameSingular,
|
|
||||||
}),
|
|
||||||
{
|
|
||||||
wrapper: RecoilRoot,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
const { executeQuickActionOnOneRecordMutation } = result.current;
|
|
||||||
|
|
||||||
expect(executeQuickActionOnOneRecordMutation).toBeDefined();
|
|
||||||
|
|
||||||
const printedReceivedQuery = print(
|
|
||||||
executeQuickActionOnOneRecordMutation,
|
|
||||||
).replace(/\s/g, '');
|
|
||||||
|
|
||||||
expect(printedReceivedQuery).toEqual(expectedQueryTemplate);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@ -1,57 +0,0 @@
|
|||||||
import { useCallback } from 'react';
|
|
||||||
import { useApolloClient } from '@apollo/client';
|
|
||||||
import { getOperationName } from '@apollo/client/utilities';
|
|
||||||
|
|
||||||
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
|
||||||
import { useExecuteQuickActionOnOneRecordMutation } from '@/object-record/hooks/useExecuteQuickActionOnOneRecordMutation';
|
|
||||||
import { useFindManyRecordsQuery } from '@/object-record/hooks/useFindManyRecordsQuery';
|
|
||||||
import { capitalize } from '~/utils/string/capitalize';
|
|
||||||
|
|
||||||
type useExecuteQuickActionOnOneRecordProps = {
|
|
||||||
objectNameSingular: string;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useExecuteQuickActionOnOneRecord = <T>({
|
|
||||||
objectNameSingular,
|
|
||||||
}: useExecuteQuickActionOnOneRecordProps) => {
|
|
||||||
const { objectMetadataItem } = useObjectMetadataItem({
|
|
||||||
objectNameSingular,
|
|
||||||
});
|
|
||||||
|
|
||||||
const { executeQuickActionOnOneRecordMutation } =
|
|
||||||
useExecuteQuickActionOnOneRecordMutation({
|
|
||||||
objectNameSingular,
|
|
||||||
});
|
|
||||||
|
|
||||||
const { findManyRecordsQuery } = useFindManyRecordsQuery({
|
|
||||||
objectNameSingular,
|
|
||||||
});
|
|
||||||
|
|
||||||
const apolloClient = useApolloClient();
|
|
||||||
|
|
||||||
const executeQuickActionOnOneRecord = useCallback(
|
|
||||||
async (idToExecuteQuickActionOn: string) => {
|
|
||||||
const executeQuickActionOnRecord = await apolloClient.mutate({
|
|
||||||
mutation: executeQuickActionOnOneRecordMutation,
|
|
||||||
variables: {
|
|
||||||
idToExecuteQuickActionOn,
|
|
||||||
},
|
|
||||||
refetchQueries: [getOperationName(findManyRecordsQuery) ?? ''],
|
|
||||||
});
|
|
||||||
|
|
||||||
return executeQuickActionOnRecord.data[
|
|
||||||
`executeQuickActionOn${capitalize(objectMetadataItem.nameSingular)}`
|
|
||||||
] as T;
|
|
||||||
},
|
|
||||||
[
|
|
||||||
objectMetadataItem.nameSingular,
|
|
||||||
apolloClient,
|
|
||||||
executeQuickActionOnOneRecordMutation,
|
|
||||||
findManyRecordsQuery,
|
|
||||||
],
|
|
||||||
);
|
|
||||||
|
|
||||||
return {
|
|
||||||
executeQuickActionOnOneRecord,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
@ -1,53 +0,0 @@
|
|||||||
import { gql } from '@apollo/client';
|
|
||||||
import { useRecoilValue } from 'recoil';
|
|
||||||
|
|
||||||
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
|
||||||
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
|
|
||||||
import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery';
|
|
||||||
import { EMPTY_MUTATION } from '@/object-record/constants/EmptyMutation';
|
|
||||||
import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull';
|
|
||||||
import { capitalize } from '~/utils/string/capitalize';
|
|
||||||
|
|
||||||
export const getExecuteQuickActionOnOneRecordMutationGraphQLField = ({
|
|
||||||
objectNameSingular,
|
|
||||||
}: {
|
|
||||||
objectNameSingular: string;
|
|
||||||
}) => {
|
|
||||||
return `executeQuickActionOn${capitalize(objectNameSingular)}`;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useExecuteQuickActionOnOneRecordMutation = ({
|
|
||||||
objectNameSingular,
|
|
||||||
}: {
|
|
||||||
objectNameSingular: string;
|
|
||||||
}) => {
|
|
||||||
const { objectMetadataItem } = useObjectMetadataItem({
|
|
||||||
objectNameSingular,
|
|
||||||
});
|
|
||||||
|
|
||||||
const objectMetadataItems = useRecoilValue(objectMetadataItemsState);
|
|
||||||
|
|
||||||
if (isUndefinedOrNull(objectMetadataItem)) {
|
|
||||||
return { executeQuickActionOnOneRecordMutation: EMPTY_MUTATION };
|
|
||||||
}
|
|
||||||
|
|
||||||
const capitalizedObjectName = capitalize(objectMetadataItem.nameSingular);
|
|
||||||
|
|
||||||
const graphQLFieldForExecuteQuickActionOnOneRecordMutation =
|
|
||||||
getExecuteQuickActionOnOneRecordMutationGraphQLField({
|
|
||||||
objectNameSingular: objectMetadataItem.nameSingular,
|
|
||||||
});
|
|
||||||
|
|
||||||
const executeQuickActionOnOneRecordMutation = gql`
|
|
||||||
mutation ExecuteQuickActionOnOne${capitalizedObjectName}($idToExecuteQuickActionOn: ID!) {
|
|
||||||
${graphQLFieldForExecuteQuickActionOnOneRecordMutation}(id: $idToExecuteQuickActionOn) ${mapObjectMetadataToGraphQLQuery(
|
|
||||||
{
|
|
||||||
objectMetadataItems,
|
|
||||||
objectMetadataItem,
|
|
||||||
},
|
|
||||||
)}
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
return { executeQuickActionOnOneRecordMutation };
|
|
||||||
};
|
|
||||||
@ -1,20 +1,11 @@
|
|||||||
import { isNonEmptyString } from '@sniptt/guards';
|
import { isNonEmptyString } from '@sniptt/guards';
|
||||||
import { useCallback, useMemo, useState } from 'react';
|
import { useCallback, useMemo, useState } from 'react';
|
||||||
import { useRecoilCallback, useSetRecoilState } from 'recoil';
|
import { useRecoilCallback, useSetRecoilState } from 'recoil';
|
||||||
import {
|
import { IconFileExport, IconHeart, IconHeartOff, IconTrash } from 'twenty-ui';
|
||||||
IconClick,
|
|
||||||
IconFileExport,
|
|
||||||
IconHeart,
|
|
||||||
IconHeartOff,
|
|
||||||
IconMail,
|
|
||||||
IconPuzzle,
|
|
||||||
IconTrash,
|
|
||||||
} from 'twenty-ui';
|
|
||||||
|
|
||||||
import { useFavorites } from '@/favorites/hooks/useFavorites';
|
import { useFavorites } from '@/favorites/hooks/useFavorites';
|
||||||
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
||||||
import { DELETE_MAX_COUNT } from '@/object-record/constants/DeleteMaxCount';
|
import { DELETE_MAX_COUNT } from '@/object-record/constants/DeleteMaxCount';
|
||||||
import { useExecuteQuickActionOnOneRecord } from '@/object-record/hooks/useExecuteQuickActionOnOneRecord';
|
|
||||||
import { useDeleteTableData } from '@/object-record/record-index/options/hooks/useDeleteTableData';
|
import { useDeleteTableData } from '@/object-record/record-index/options/hooks/useDeleteTableData';
|
||||||
import {
|
import {
|
||||||
displayedExportProgress,
|
displayedExportProgress,
|
||||||
@ -25,7 +16,6 @@ import { ConfirmationModal } from '@/ui/layout/modal/components/ConfirmationModa
|
|||||||
import { actionBarEntriesState } from '@/ui/navigation/action-bar/states/actionBarEntriesState';
|
import { actionBarEntriesState } from '@/ui/navigation/action-bar/states/actionBarEntriesState';
|
||||||
import { contextMenuEntriesState } from '@/ui/navigation/context-menu/states/contextMenuEntriesState';
|
import { contextMenuEntriesState } from '@/ui/navigation/context-menu/states/contextMenuEntriesState';
|
||||||
import { ContextMenuEntry } from '@/ui/navigation/context-menu/types/ContextMenuEntry';
|
import { ContextMenuEntry } from '@/ui/navigation/context-menu/types/ContextMenuEntry';
|
||||||
import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
|
|
||||||
import { isDefined } from '~/utils/isDefined';
|
import { isDefined } from '~/utils/isDefined';
|
||||||
|
|
||||||
type useRecordActionBarProps = {
|
type useRecordActionBarProps = {
|
||||||
@ -48,10 +38,6 @@ export const useRecordActionBar = ({
|
|||||||
|
|
||||||
const { createFavorite, favorites, deleteFavorite } = useFavorites();
|
const { createFavorite, favorites, deleteFavorite } = useFavorites();
|
||||||
|
|
||||||
const { executeQuickActionOnOneRecord } = useExecuteQuickActionOnOneRecord({
|
|
||||||
objectNameSingular: objectMetadataItem.nameSingular,
|
|
||||||
});
|
|
||||||
|
|
||||||
const handleFavoriteButtonClick = useRecoilCallback(
|
const handleFavoriteButtonClick = useRecoilCallback(
|
||||||
({ snapshot }) =>
|
({ snapshot }) =>
|
||||||
() => {
|
() => {
|
||||||
@ -99,15 +85,6 @@ export const useRecordActionBar = ({
|
|||||||
deleteTableData(selectedRecordIds);
|
deleteTableData(selectedRecordIds);
|
||||||
}, [deleteTableData, selectedRecordIds]);
|
}, [deleteTableData, selectedRecordIds]);
|
||||||
|
|
||||||
const handleExecuteQuickActionOnClick = useCallback(async () => {
|
|
||||||
callback?.();
|
|
||||||
await Promise.all(
|
|
||||||
selectedRecordIds.map(async (recordId) => {
|
|
||||||
await executeQuickActionOnOneRecord(recordId);
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}, [callback, executeQuickActionOnOneRecord, selectedRecordIds]);
|
|
||||||
|
|
||||||
const { progress, download } = useExportTableData({
|
const { progress, download } = useExportTableData({
|
||||||
...baseTableDataParams,
|
...baseTableDataParams,
|
||||||
filename: `${objectMetadataItem.nameSingular}.csv`,
|
filename: `${objectMetadataItem.nameSingular}.csv`,
|
||||||
@ -168,10 +145,6 @@ export const useRecordActionBar = ({
|
|||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
const dataExecuteQuickActionOnmentEnabled = useIsFeatureEnabled(
|
|
||||||
'IS_QUICK_ACTIONS_ENABLED',
|
|
||||||
);
|
|
||||||
|
|
||||||
const hasOnlyOneRecordSelected = selectedRecordIds.length === 1;
|
const hasOnlyOneRecordSelected = selectedRecordIds.length === 1;
|
||||||
|
|
||||||
const isFavorite =
|
const isFavorite =
|
||||||
@ -212,12 +185,13 @@ export const useRecordActionBar = ({
|
|||||||
|
|
||||||
setActionBarEntries: useCallback(() => {
|
setActionBarEntries: useCallback(() => {
|
||||||
setActionBarEntriesState([
|
setActionBarEntriesState([
|
||||||
...(dataExecuteQuickActionOnmentEnabled
|
/*
|
||||||
? [
|
|
||||||
{
|
{
|
||||||
label: 'Actions',
|
label: 'Actions',
|
||||||
Icon: IconClick,
|
Icon: IconClick,
|
||||||
subActions: [
|
subActions:
|
||||||
|
|
||||||
|
/* [
|
||||||
{
|
{
|
||||||
label: 'Enrich',
|
label: 'Enrich',
|
||||||
Icon: IconPuzzle,
|
Icon: IconPuzzle,
|
||||||
@ -228,16 +202,9 @@ export const useRecordActionBar = ({
|
|||||||
Icon: IconMail,
|
Icon: IconMail,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
*/
|
||||||
]
|
|
||||||
: []),
|
|
||||||
...menuActions,
|
...menuActions,
|
||||||
]);
|
]);
|
||||||
}, [
|
}, [menuActions, setActionBarEntriesState]),
|
||||||
menuActions,
|
|
||||||
dataExecuteQuickActionOnmentEnabled,
|
|
||||||
handleExecuteQuickActionOnClick,
|
|
||||||
setActionBarEntriesState,
|
|
||||||
]),
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
export type FeatureFlagKey =
|
export type FeatureFlagKey =
|
||||||
| 'IS_BLOCKLIST_ENABLED'
|
| 'IS_BLOCKLIST_ENABLED'
|
||||||
| 'IS_QUICK_ACTIONS_ENABLED'
|
|
||||||
| 'IS_EVENT_OBJECT_ENABLED'
|
| 'IS_EVENT_OBJECT_ENABLED'
|
||||||
| 'IS_AIRTABLE_INTEGRATION_ENABLED'
|
| 'IS_AIRTABLE_INTEGRATION_ENABLED'
|
||||||
| 'IS_POSTGRESQL_INTEGRATION_ENABLED'
|
| 'IS_POSTGRESQL_INTEGRATION_ENABLED'
|
||||||
|
|||||||
@ -1,80 +0,0 @@
|
|||||||
import { Injectable } from '@nestjs/common';
|
|
||||||
|
|
||||||
import { Record as IRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/record.interface';
|
|
||||||
import { WorkspaceQueryRunnerOptions } from 'src/engine/api/graphql/workspace-query-runner/interfaces/query-runner-option.interface';
|
|
||||||
import { WorkspaceResolverBuilderFactoryInterface } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolver-builder-factory.interface';
|
|
||||||
import {
|
|
||||||
DeleteOneResolverArgs,
|
|
||||||
ExecuteQuickActionOnOneResolverArgs,
|
|
||||||
FindOneResolverArgs,
|
|
||||||
Resolver,
|
|
||||||
} from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface';
|
|
||||||
import { WorkspaceSchemaBuilderContext } from 'src/engine/api/graphql/workspace-schema-builder/interfaces/workspace-schema-builder-context.interface';
|
|
||||||
|
|
||||||
import { workspaceQueryRunnerGraphqlApiExceptionHandler } from 'src/engine/api/graphql/workspace-query-runner/utils/workspace-query-runner-graphql-api-exception-handler.util';
|
|
||||||
import { WorkspaceQueryRunnerService } from 'src/engine/api/graphql/workspace-query-runner/workspace-query-runner.service';
|
|
||||||
import { QuickActionsService } from 'src/engine/core-modules/quick-actions/quick-actions.service';
|
|
||||||
|
|
||||||
@Injectable()
|
|
||||||
export class ExecuteQuickActionOnOneResolverFactory
|
|
||||||
implements WorkspaceResolverBuilderFactoryInterface
|
|
||||||
{
|
|
||||||
public static methodName = 'executeQuickActionOnOne' as const;
|
|
||||||
|
|
||||||
constructor(
|
|
||||||
private readonly workspaceQueryRunnerService: WorkspaceQueryRunnerService,
|
|
||||||
private readonly quickActionsService: QuickActionsService,
|
|
||||||
) {}
|
|
||||||
|
|
||||||
create(
|
|
||||||
context: WorkspaceSchemaBuilderContext,
|
|
||||||
): Resolver<ExecuteQuickActionOnOneResolverArgs> {
|
|
||||||
const internalContext = context;
|
|
||||||
|
|
||||||
return (_source, args, context, info) => {
|
|
||||||
try {
|
|
||||||
return this.executeQuickActionOnOne(args, {
|
|
||||||
authContext: internalContext.authContext,
|
|
||||||
objectMetadataItem: internalContext.objectMetadataItem,
|
|
||||||
info,
|
|
||||||
fieldMetadataCollection: internalContext.fieldMetadataCollection,
|
|
||||||
objectMetadataCollection: internalContext.objectMetadataCollection,
|
|
||||||
});
|
|
||||||
} catch (error) {
|
|
||||||
workspaceQueryRunnerGraphqlApiExceptionHandler(error);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private async executeQuickActionOnOne<Record extends IRecord = IRecord>(
|
|
||||||
args: DeleteOneResolverArgs,
|
|
||||||
options: WorkspaceQueryRunnerOptions,
|
|
||||||
): Promise<Record | undefined> {
|
|
||||||
switch (options.objectMetadataItem.nameSingular) {
|
|
||||||
case 'company': {
|
|
||||||
await this.quickActionsService.executeQuickActionOnCompany(
|
|
||||||
args.id,
|
|
||||||
options.authContext.workspace.id,
|
|
||||||
options.objectMetadataItem,
|
|
||||||
);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 'person': {
|
|
||||||
await this.quickActionsService.createCompanyFromPerson(
|
|
||||||
args.id,
|
|
||||||
options.authContext.workspace.id,
|
|
||||||
options.objectMetadataCollection,
|
|
||||||
);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
// TODO: different quick actions per object on frontend
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.workspaceQueryRunnerService.findOne(
|
|
||||||
{ filter: { id: { eq: args.id } } } as FindOneResolverArgs,
|
|
||||||
options,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,14 +1,13 @@
|
|||||||
import { UpdateManyResolverFactory } from 'src/engine/api/graphql/workspace-resolver-builder/factories/update-many-resolver.factory';
|
import { UpdateManyResolverFactory } from 'src/engine/api/graphql/workspace-resolver-builder/factories/update-many-resolver.factory';
|
||||||
|
|
||||||
|
import { CreateManyResolverFactory } from './create-many-resolver.factory';
|
||||||
|
import { CreateOneResolverFactory } from './create-one-resolver.factory';
|
||||||
|
import { DeleteManyResolverFactory } from './delete-many-resolver.factory';
|
||||||
|
import { DeleteOneResolverFactory } from './delete-one-resolver.factory';
|
||||||
import { FindDuplicatesResolverFactory } from './find-duplicates-resolver.factory';
|
import { FindDuplicatesResolverFactory } from './find-duplicates-resolver.factory';
|
||||||
import { FindManyResolverFactory } from './find-many-resolver.factory';
|
import { FindManyResolverFactory } from './find-many-resolver.factory';
|
||||||
import { FindOneResolverFactory } from './find-one-resolver.factory';
|
import { FindOneResolverFactory } from './find-one-resolver.factory';
|
||||||
import { CreateManyResolverFactory } from './create-many-resolver.factory';
|
|
||||||
import { CreateOneResolverFactory } from './create-one-resolver.factory';
|
|
||||||
import { UpdateOneResolverFactory } from './update-one-resolver.factory';
|
import { UpdateOneResolverFactory } from './update-one-resolver.factory';
|
||||||
import { DeleteOneResolverFactory } from './delete-one-resolver.factory';
|
|
||||||
import { DeleteManyResolverFactory } from './delete-many-resolver.factory';
|
|
||||||
import { ExecuteQuickActionOnOneResolverFactory } from './execute-quick-action-on-one-resolver.factory';
|
|
||||||
|
|
||||||
export const workspaceResolverBuilderFactories = [
|
export const workspaceResolverBuilderFactories = [
|
||||||
FindManyResolverFactory,
|
FindManyResolverFactory,
|
||||||
@ -18,7 +17,6 @@ export const workspaceResolverBuilderFactories = [
|
|||||||
CreateOneResolverFactory,
|
CreateOneResolverFactory,
|
||||||
UpdateOneResolverFactory,
|
UpdateOneResolverFactory,
|
||||||
DeleteOneResolverFactory,
|
DeleteOneResolverFactory,
|
||||||
ExecuteQuickActionOnOneResolverFactory,
|
|
||||||
UpdateManyResolverFactory,
|
UpdateManyResolverFactory,
|
||||||
DeleteManyResolverFactory,
|
DeleteManyResolverFactory,
|
||||||
];
|
];
|
||||||
@ -34,7 +32,6 @@ export const workspaceResolverBuilderMethodNames = {
|
|||||||
CreateOneResolverFactory.methodName,
|
CreateOneResolverFactory.methodName,
|
||||||
UpdateOneResolverFactory.methodName,
|
UpdateOneResolverFactory.methodName,
|
||||||
DeleteOneResolverFactory.methodName,
|
DeleteOneResolverFactory.methodName,
|
||||||
ExecuteQuickActionOnOneResolverFactory.methodName,
|
|
||||||
UpdateManyResolverFactory.methodName,
|
UpdateManyResolverFactory.methodName,
|
||||||
DeleteManyResolverFactory.methodName,
|
DeleteManyResolverFactory.methodName,
|
||||||
],
|
],
|
||||||
|
|||||||
@ -20,7 +20,6 @@ export enum ResolverArgsType {
|
|||||||
UpdateMany = 'UpdateMany',
|
UpdateMany = 'UpdateMany',
|
||||||
DeleteOne = 'DeleteOne',
|
DeleteOne = 'DeleteOne',
|
||||||
DeleteMany = 'DeleteMany',
|
DeleteMany = 'DeleteMany',
|
||||||
ExecuteQuickActionOnOne = 'ExecuteQuickActionOnOne',
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface FindManyResolverArgs<
|
export interface FindManyResolverArgs<
|
||||||
@ -79,10 +78,6 @@ export interface DeleteOneResolverArgs {
|
|||||||
id: string;
|
id: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ExecuteQuickActionOnOneResolverArgs {
|
|
||||||
id: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface DeleteManyResolverArgs<Filter = any> {
|
export interface DeleteManyResolverArgs<Filter = any> {
|
||||||
filter: Filter;
|
filter: Filter;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,14 +1,13 @@
|
|||||||
import { Module } from '@nestjs/common';
|
import { Module } from '@nestjs/common';
|
||||||
|
|
||||||
import { WorkspaceQueryRunnerModule } from 'src/engine/api/graphql/workspace-query-runner/workspace-query-runner.module';
|
import { WorkspaceQueryRunnerModule } from 'src/engine/api/graphql/workspace-query-runner/workspace-query-runner.module';
|
||||||
import { QuickActionsModule } from 'src/engine/core-modules/quick-actions/quick-actions.module';
|
|
||||||
|
|
||||||
import { WorkspaceResolverFactory } from './workspace-resolver.factory';
|
import { WorkspaceResolverFactory } from './workspace-resolver.factory';
|
||||||
|
|
||||||
import { workspaceResolverBuilderFactories } from './factories/factories';
|
import { workspaceResolverBuilderFactories } from './factories/factories';
|
||||||
|
|
||||||
@Module({
|
@Module({
|
||||||
imports: [WorkspaceQueryRunnerModule, QuickActionsModule],
|
imports: [WorkspaceQueryRunnerModule],
|
||||||
providers: [...workspaceResolverBuilderFactories, WorkspaceResolverFactory],
|
providers: [...workspaceResolverBuilderFactories, WorkspaceResolverFactory],
|
||||||
exports: [WorkspaceResolverFactory],
|
exports: [WorkspaceResolverFactory],
|
||||||
})
|
})
|
||||||
|
|||||||
@ -4,24 +4,23 @@ import { IResolvers } from '@graphql-tools/utils';
|
|||||||
|
|
||||||
import { ObjectMetadataInterface } from 'src/engine/metadata-modules/field-metadata/interfaces/object-metadata.interface';
|
import { ObjectMetadataInterface } from 'src/engine/metadata-modules/field-metadata/interfaces/object-metadata.interface';
|
||||||
|
|
||||||
import { getResolverName } from 'src/engine/utils/get-resolver-name.util';
|
|
||||||
import { UpdateManyResolverFactory } from 'src/engine/api/graphql/workspace-resolver-builder/factories/update-many-resolver.factory';
|
|
||||||
import { DeleteManyResolverFactory } from 'src/engine/api/graphql/workspace-resolver-builder/factories/delete-many-resolver.factory';
|
import { DeleteManyResolverFactory } from 'src/engine/api/graphql/workspace-resolver-builder/factories/delete-many-resolver.factory';
|
||||||
import { ExecuteQuickActionOnOneResolverFactory } from 'src/engine/api/graphql/workspace-resolver-builder/factories/execute-quick-action-on-one-resolver.factory';
|
import { UpdateManyResolverFactory } from 'src/engine/api/graphql/workspace-resolver-builder/factories/update-many-resolver.factory';
|
||||||
import { AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type';
|
import { AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type';
|
||||||
|
import { getResolverName } from 'src/engine/utils/get-resolver-name.util';
|
||||||
|
|
||||||
|
import { CreateManyResolverFactory } from './factories/create-many-resolver.factory';
|
||||||
|
import { CreateOneResolverFactory } from './factories/create-one-resolver.factory';
|
||||||
|
import { DeleteOneResolverFactory } from './factories/delete-one-resolver.factory';
|
||||||
import { FindDuplicatesResolverFactory } from './factories/find-duplicates-resolver.factory';
|
import { FindDuplicatesResolverFactory } from './factories/find-duplicates-resolver.factory';
|
||||||
import { FindManyResolverFactory } from './factories/find-many-resolver.factory';
|
import { FindManyResolverFactory } from './factories/find-many-resolver.factory';
|
||||||
import { FindOneResolverFactory } from './factories/find-one-resolver.factory';
|
import { FindOneResolverFactory } from './factories/find-one-resolver.factory';
|
||||||
import { CreateManyResolverFactory } from './factories/create-many-resolver.factory';
|
|
||||||
import { CreateOneResolverFactory } from './factories/create-one-resolver.factory';
|
|
||||||
import { UpdateOneResolverFactory } from './factories/update-one-resolver.factory';
|
import { UpdateOneResolverFactory } from './factories/update-one-resolver.factory';
|
||||||
import { DeleteOneResolverFactory } from './factories/delete-one-resolver.factory';
|
import { WorkspaceResolverBuilderFactoryInterface } from './interfaces/workspace-resolver-builder-factory.interface';
|
||||||
import {
|
import {
|
||||||
WorkspaceResolverBuilderMethodNames,
|
WorkspaceResolverBuilderMethodNames,
|
||||||
WorkspaceResolverBuilderMethods,
|
WorkspaceResolverBuilderMethods,
|
||||||
} from './interfaces/workspace-resolvers-builder.interface';
|
} from './interfaces/workspace-resolvers-builder.interface';
|
||||||
import { WorkspaceResolverBuilderFactoryInterface } from './interfaces/workspace-resolver-builder-factory.interface';
|
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class WorkspaceResolverFactory {
|
export class WorkspaceResolverFactory {
|
||||||
@ -35,7 +34,6 @@ export class WorkspaceResolverFactory {
|
|||||||
private readonly createOneResolverFactory: CreateOneResolverFactory,
|
private readonly createOneResolverFactory: CreateOneResolverFactory,
|
||||||
private readonly updateOneResolverFactory: UpdateOneResolverFactory,
|
private readonly updateOneResolverFactory: UpdateOneResolverFactory,
|
||||||
private readonly deleteOneResolverFactory: DeleteOneResolverFactory,
|
private readonly deleteOneResolverFactory: DeleteOneResolverFactory,
|
||||||
private readonly executeQuickActionOnOneResolverFactory: ExecuteQuickActionOnOneResolverFactory,
|
|
||||||
private readonly updateManyResolverFactory: UpdateManyResolverFactory,
|
private readonly updateManyResolverFactory: UpdateManyResolverFactory,
|
||||||
private readonly deleteManyResolverFactory: DeleteManyResolverFactory,
|
private readonly deleteManyResolverFactory: DeleteManyResolverFactory,
|
||||||
) {}
|
) {}
|
||||||
@ -56,7 +54,6 @@ export class WorkspaceResolverFactory {
|
|||||||
['createOne', this.createOneResolverFactory],
|
['createOne', this.createOneResolverFactory],
|
||||||
['updateOne', this.updateOneResolverFactory],
|
['updateOne', this.updateOneResolverFactory],
|
||||||
['deleteOne', this.deleteOneResolverFactory],
|
['deleteOne', this.deleteOneResolverFactory],
|
||||||
['executeQuickActionOnOne', this.executeQuickActionOnOneResolverFactory],
|
|
||||||
['updateMany', this.updateManyResolverFactory],
|
['updateMany', this.updateManyResolverFactory],
|
||||||
['deleteMany', this.deleteManyResolverFactory],
|
['deleteMany', this.deleteManyResolverFactory],
|
||||||
]);
|
]);
|
||||||
|
|||||||
@ -50,9 +50,6 @@ describe('getResolverArgs', () => {
|
|||||||
deleteOne: {
|
deleteOne: {
|
||||||
id: { type: GraphQLID, isNullable: false },
|
id: { type: GraphQLID, isNullable: false },
|
||||||
},
|
},
|
||||||
executeQuickActionOnOne: {
|
|
||||||
id: { type: GraphQLID, isNullable: false },
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Test each resolver type
|
// Test each resolver type
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { GraphQLString, GraphQLInt, GraphQLID, GraphQLBoolean } from 'graphql';
|
import { GraphQLBoolean, GraphQLID, GraphQLInt, GraphQLString } from 'graphql';
|
||||||
|
|
||||||
import { WorkspaceResolverBuilderMethodNames } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface';
|
import { WorkspaceResolverBuilderMethodNames } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface';
|
||||||
import { ArgMetadata } from 'src/engine/api/graphql/workspace-schema-builder/interfaces/param-metadata.interface';
|
import { ArgMetadata } from 'src/engine/api/graphql/workspace-schema-builder/interfaces/param-metadata.interface';
|
||||||
@ -105,13 +105,6 @@ export const getResolverArgs = (
|
|||||||
isNullable: false,
|
isNullable: false,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
case 'executeQuickActionOnOne':
|
|
||||||
return {
|
|
||||||
id: {
|
|
||||||
type: GraphQLID,
|
|
||||||
isNullable: false,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
case 'updateMany':
|
case 'updateMany':
|
||||||
return {
|
return {
|
||||||
data: {
|
data: {
|
||||||
|
|||||||
@ -1,55 +0,0 @@
|
|||||||
import { HttpService } from '@nestjs/axios';
|
|
||||||
import { Injectable } from '@nestjs/common';
|
|
||||||
|
|
||||||
import { CompanyInteface } from 'src/engine/core-modules/quick-actions/interfaces/company.interface';
|
|
||||||
|
|
||||||
import { EnvironmentService } from 'src/engine/integrations/environment/environment.service';
|
|
||||||
|
|
||||||
@Injectable()
|
|
||||||
export class IntelligenceService {
|
|
||||||
constructor(
|
|
||||||
private readonly environmentService: EnvironmentService,
|
|
||||||
private readonly httpService: HttpService,
|
|
||||||
) {}
|
|
||||||
|
|
||||||
async enrichCompany(domainName: string): Promise<CompanyInteface> {
|
|
||||||
const enrichedCompany = await this.httpService.axiosRef.get(
|
|
||||||
`https://companies.twenty.com/${domainName}`,
|
|
||||||
{
|
|
||||||
validateStatus: function () {
|
|
||||||
// This ensures the promise is always resolved, preventing axios from throwing an error
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
if (enrichedCompany.status !== 200) {
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
linkedinLinkPrimaryLinkUrl:
|
|
||||||
`https://linkedin.com/` + enrichedCompany.data.handle,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
async completeWithAi(content: string) {
|
|
||||||
return this.httpService.axiosRef.post(
|
|
||||||
'https://openrouter.ai/api/v1/chat/completions',
|
|
||||||
{
|
|
||||||
headers: {
|
|
||||||
Authorization: `Bearer ${this.environmentService.get(
|
|
||||||
'OPENROUTER_API_KEY',
|
|
||||||
)}`,
|
|
||||||
'HTTP-Referer': `https://twenty.com`,
|
|
||||||
'X-Title': `Twenty CRM`,
|
|
||||||
'Content-Type': 'application/json',
|
|
||||||
},
|
|
||||||
body: JSON.stringify({
|
|
||||||
model: 'mistralai/mixtral-8x7b-instruct',
|
|
||||||
messages: [{ role: 'user', content: content }],
|
|
||||||
}),
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
export interface CompanyInteface {
|
|
||||||
linkedinLinkPrimaryLinkUrl?: string;
|
|
||||||
}
|
|
||||||
@ -1,14 +0,0 @@
|
|||||||
import { Module } from '@nestjs/common';
|
|
||||||
import { HttpModule } from '@nestjs/axios';
|
|
||||||
|
|
||||||
import { IntelligenceService } from 'src/engine/core-modules/quick-actions/intelligence.service';
|
|
||||||
import { QuickActionsService } from 'src/engine/core-modules/quick-actions/quick-actions.service';
|
|
||||||
import { WorkspaceQueryRunnerModule } from 'src/engine/api/graphql/workspace-query-runner/workspace-query-runner.module';
|
|
||||||
|
|
||||||
@Module({
|
|
||||||
imports: [WorkspaceQueryRunnerModule, HttpModule],
|
|
||||||
controllers: [],
|
|
||||||
providers: [QuickActionsService, IntelligenceService],
|
|
||||||
exports: [QuickActionsService, IntelligenceService],
|
|
||||||
})
|
|
||||||
export class QuickActionsModule {}
|
|
||||||
@ -1,181 +0,0 @@
|
|||||||
import { Injectable } from '@nestjs/common';
|
|
||||||
|
|
||||||
import { v4 as uuidv4 } from 'uuid';
|
|
||||||
|
|
||||||
import { Record as IRecord } from 'src/engine/api/graphql/workspace-query-builder/interfaces/record.interface';
|
|
||||||
import { ObjectMetadataInterface } from 'src/engine/metadata-modules/field-metadata/interfaces/object-metadata.interface';
|
|
||||||
|
|
||||||
import { stringifyWithoutKeyQuote } from 'src/engine/api/graphql/workspace-query-builder/utils/stringify-without-key-quote.util';
|
|
||||||
import { WorkspaceQueryRunnerService } from 'src/engine/api/graphql/workspace-query-runner/workspace-query-runner.service';
|
|
||||||
import { IntelligenceService } from 'src/engine/core-modules/quick-actions/intelligence.service';
|
|
||||||
import { getCompanyNameFromDomainName } from 'src/modules/contact-creation-manager/utils/get-company-name-from-domain-name.util';
|
|
||||||
import { capitalize } from 'src/utils/capitalize';
|
|
||||||
import { getCompanyDomainName } from 'src/utils/getCompanyDomainName';
|
|
||||||
import { isWorkEmail } from 'src/utils/is-work-email';
|
|
||||||
|
|
||||||
@Injectable()
|
|
||||||
export class QuickActionsService {
|
|
||||||
constructor(
|
|
||||||
private readonly workspaceQueryRunnunerService: WorkspaceQueryRunnerService,
|
|
||||||
private readonly intelligenceService: IntelligenceService,
|
|
||||||
) {}
|
|
||||||
|
|
||||||
async createCompanyFromPerson(
|
|
||||||
id: string,
|
|
||||||
workspaceId: string,
|
|
||||||
objectMetadataItemCollection: ObjectMetadataInterface[],
|
|
||||||
) {
|
|
||||||
const personObjectMetadata = objectMetadataItemCollection.find(
|
|
||||||
(item) => item.nameSingular === 'person',
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!personObjectMetadata) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const personRequest =
|
|
||||||
await this.workspaceQueryRunnunerService.executeAndParse<IRecord>(
|
|
||||||
`query {
|
|
||||||
personCollection(filter: {id: {eq: "${id}"}}) {
|
|
||||||
edges {
|
|
||||||
node {
|
|
||||||
id
|
|
||||||
email
|
|
||||||
companyId
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
personObjectMetadata,
|
|
||||||
'',
|
|
||||||
workspaceId,
|
|
||||||
);
|
|
||||||
const person = personRequest.edges?.[0]?.node;
|
|
||||||
|
|
||||||
if (!person) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!person.companyId && person.email && isWorkEmail(person.email)) {
|
|
||||||
const companyDomainName = person.email.split('@')?.[1].toLowerCase();
|
|
||||||
const companyName = capitalize(companyDomainName.split('.')[0]);
|
|
||||||
let relatedCompanyId = uuidv4();
|
|
||||||
|
|
||||||
const companyObjectMetadata = objectMetadataItemCollection.find(
|
|
||||||
(item) => item.nameSingular === 'company',
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!companyObjectMetadata) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const existingCompany =
|
|
||||||
await this.workspaceQueryRunnunerService.executeAndParse<IRecord>(
|
|
||||||
`query {companyCollection(filter: {domainName: {eq: "${companyDomainName}"}}) {
|
|
||||||
edges {
|
|
||||||
node {
|
|
||||||
id
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
companyObjectMetadata,
|
|
||||||
'',
|
|
||||||
workspaceId,
|
|
||||||
);
|
|
||||||
|
|
||||||
if (existingCompany.edges?.length) {
|
|
||||||
relatedCompanyId = existingCompany.edges[0].node.id;
|
|
||||||
}
|
|
||||||
|
|
||||||
await this.workspaceQueryRunnunerService.execute(
|
|
||||||
`mutation {
|
|
||||||
insertIntocompanyCollection(objects: ${stringifyWithoutKeyQuote([
|
|
||||||
{
|
|
||||||
id: relatedCompanyId,
|
|
||||||
name: companyName,
|
|
||||||
domainName: companyDomainName,
|
|
||||||
createdAt: new Date().toISOString(),
|
|
||||||
updatedAt: new Date().toISOString(),
|
|
||||||
},
|
|
||||||
])}) {
|
|
||||||
affectedCount
|
|
||||||
records {
|
|
||||||
id
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
workspaceId,
|
|
||||||
);
|
|
||||||
|
|
||||||
await this.workspaceQueryRunnunerService.execute(
|
|
||||||
`mutation {
|
|
||||||
updatepersonCollection(set: ${stringifyWithoutKeyQuote({
|
|
||||||
companyId: relatedCompanyId,
|
|
||||||
})}, filter: { id: { eq: "${person.id}" } }) {
|
|
||||||
affectedCount
|
|
||||||
records {
|
|
||||||
id
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
workspaceId,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async executeQuickActionOnCompany(
|
|
||||||
id: string,
|
|
||||||
workspaceId: string,
|
|
||||||
objectMetadataItem: ObjectMetadataInterface,
|
|
||||||
) {
|
|
||||||
const companyQuery = `query {
|
|
||||||
companyCollection(filter: {id: {eq: "${id}"}}) {
|
|
||||||
edges {
|
|
||||||
node {
|
|
||||||
id
|
|
||||||
domainName
|
|
||||||
createdAt
|
|
||||||
linkedinLinkPrimaryLinkUrl
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
const companyRequest =
|
|
||||||
await this.workspaceQueryRunnunerService.executeAndParse<IRecord>(
|
|
||||||
companyQuery,
|
|
||||||
objectMetadataItem,
|
|
||||||
'',
|
|
||||||
workspaceId,
|
|
||||||
);
|
|
||||||
const company = companyRequest.edges?.[0]?.node;
|
|
||||||
|
|
||||||
if (!company) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const enrichedData = await this.intelligenceService.enrichCompany(
|
|
||||||
getCompanyNameFromDomainName(getCompanyDomainName(company)),
|
|
||||||
);
|
|
||||||
|
|
||||||
await this.workspaceQueryRunnunerService.execute(
|
|
||||||
`mutation {
|
|
||||||
updatecompanyCollection(set: ${stringifyWithoutKeyQuote(
|
|
||||||
enrichedData,
|
|
||||||
)}, filter: { id: { eq: "${id}" } }) {
|
|
||||||
affectedCount
|
|
||||||
records {
|
|
||||||
id
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}`,
|
|
||||||
workspaceId,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -2,17 +2,17 @@ import { LogLevel } from '@nestjs/common';
|
|||||||
|
|
||||||
import { plainToClass } from 'class-transformer';
|
import { plainToClass } from 'class-transformer';
|
||||||
import {
|
import {
|
||||||
|
IsBoolean,
|
||||||
|
IsDefined,
|
||||||
IsEnum,
|
IsEnum,
|
||||||
|
IsNumber,
|
||||||
IsOptional,
|
IsOptional,
|
||||||
IsString,
|
IsString,
|
||||||
IsUrl,
|
IsUrl,
|
||||||
|
Max,
|
||||||
|
Min,
|
||||||
ValidateIf,
|
ValidateIf,
|
||||||
validateSync,
|
validateSync,
|
||||||
IsBoolean,
|
|
||||||
IsNumber,
|
|
||||||
IsDefined,
|
|
||||||
Min,
|
|
||||||
Max,
|
|
||||||
} from 'class-validator';
|
} from 'class-validator';
|
||||||
|
|
||||||
import { EmailDriver } from 'src/engine/integrations/email/interfaces/email.interface';
|
import { EmailDriver } from 'src/engine/integrations/email/interfaces/email.interface';
|
||||||
@ -20,24 +20,24 @@ import { NodeEnvironment } from 'src/engine/integrations/environment/interfaces/
|
|||||||
import { LLMChatModelDriver } from 'src/engine/integrations/llm-chat-model/interfaces/llm-chat-model.interface';
|
import { LLMChatModelDriver } from 'src/engine/integrations/llm-chat-model/interfaces/llm-chat-model.interface';
|
||||||
import { LLMTracingDriver } from 'src/engine/integrations/llm-tracing/interfaces/llm-tracing.interface';
|
import { LLMTracingDriver } from 'src/engine/integrations/llm-tracing/interfaces/llm-tracing.interface';
|
||||||
|
|
||||||
import { ServerlessDriverType } from 'src/engine/integrations/serverless/serverless.interface';
|
import { CacheStorageType } from 'src/engine/integrations/cache-storage/types/cache-storage-type.enum';
|
||||||
import { assert } from 'src/utils/assert';
|
import { CaptchaDriverType } from 'src/engine/integrations/captcha/interfaces';
|
||||||
import { CastToStringArray } from 'src/engine/integrations/environment/decorators/cast-to-string-array.decorator';
|
import { CastToStringArray } from 'src/engine/integrations/environment/decorators/cast-to-string-array.decorator';
|
||||||
|
import { IsStrictlyLowerThan } from 'src/engine/integrations/environment/decorators/is-strictly-lower-than.decorator';
|
||||||
import { ExceptionHandlerDriver } from 'src/engine/integrations/exception-handler/interfaces';
|
import { ExceptionHandlerDriver } from 'src/engine/integrations/exception-handler/interfaces';
|
||||||
import { StorageDriverType } from 'src/engine/integrations/file-storage/interfaces';
|
import { StorageDriverType } from 'src/engine/integrations/file-storage/interfaces';
|
||||||
import { LoggerDriverType } from 'src/engine/integrations/logger/interfaces';
|
import { LoggerDriverType } from 'src/engine/integrations/logger/interfaces';
|
||||||
import { IsStrictlyLowerThan } from 'src/engine/integrations/environment/decorators/is-strictly-lower-than.decorator';
|
|
||||||
import { CaptchaDriverType } from 'src/engine/integrations/captcha/interfaces';
|
|
||||||
import { MessageQueueDriverType } from 'src/engine/integrations/message-queue/interfaces';
|
import { MessageQueueDriverType } from 'src/engine/integrations/message-queue/interfaces';
|
||||||
import { CacheStorageType } from 'src/engine/integrations/cache-storage/types/cache-storage-type.enum';
|
import { ServerlessDriverType } from 'src/engine/integrations/serverless/serverless.interface';
|
||||||
|
import { assert } from 'src/utils/assert';
|
||||||
|
|
||||||
|
import { CastToBoolean } from './decorators/cast-to-boolean.decorator';
|
||||||
|
import { CastToLogLevelArray } from './decorators/cast-to-log-level-array.decorator';
|
||||||
|
import { CastToPositiveNumber } from './decorators/cast-to-positive-number.decorator';
|
||||||
|
import { IsAWSRegion } from './decorators/is-aws-region.decorator';
|
||||||
import { IsDuration } from './decorators/is-duration.decorator';
|
import { IsDuration } from './decorators/is-duration.decorator';
|
||||||
import { AwsRegion } from './interfaces/aws-region.interface';
|
import { AwsRegion } from './interfaces/aws-region.interface';
|
||||||
import { IsAWSRegion } from './decorators/is-aws-region.decorator';
|
|
||||||
import { CastToBoolean } from './decorators/cast-to-boolean.decorator';
|
|
||||||
import { SupportDriver } from './interfaces/support.interface';
|
import { SupportDriver } from './interfaces/support.interface';
|
||||||
import { CastToPositiveNumber } from './decorators/cast-to-positive-number.decorator';
|
|
||||||
import { CastToLogLevelArray } from './decorators/cast-to-log-level-array.decorator';
|
|
||||||
|
|
||||||
export class EnvironmentVariables {
|
export class EnvironmentVariables {
|
||||||
// Misc
|
// Misc
|
||||||
@ -394,8 +394,6 @@ export class EnvironmentVariables {
|
|||||||
|
|
||||||
EMAIL_SMTP_PASSWORD: string;
|
EMAIL_SMTP_PASSWORD: string;
|
||||||
|
|
||||||
OPENROUTER_API_KEY: string;
|
|
||||||
|
|
||||||
LLM_CHAT_MODEL_DRIVER: LLMChatModelDriver;
|
LLM_CHAT_MODEL_DRIVER: LLMChatModelDriver;
|
||||||
|
|
||||||
OPENAI_API_KEY: string;
|
OPENAI_API_KEY: string;
|
||||||
|
|||||||
@ -15,7 +15,6 @@ describe('getResolverName', () => {
|
|||||||
['createOne', 'createEntity'],
|
['createOne', 'createEntity'],
|
||||||
['updateOne', 'updateEntity'],
|
['updateOne', 'updateEntity'],
|
||||||
['deleteOne', 'deleteEntity'],
|
['deleteOne', 'deleteEntity'],
|
||||||
['executeQuickActionOnOne', 'executeQuickActionOnEntity'],
|
|
||||||
])('should return correct name for %s resolver', (type, expectedResult) => {
|
])('should return correct name for %s resolver', (type, expectedResult) => {
|
||||||
expect(
|
expect(
|
||||||
getResolverName(metadata, type as WorkspaceResolverBuilderMethodNames),
|
getResolverName(metadata, type as WorkspaceResolverBuilderMethodNames),
|
||||||
|
|||||||
@ -23,8 +23,6 @@ export const getResolverName = (
|
|||||||
return `update${pascalCase(objectMetadata.nameSingular)}`;
|
return `update${pascalCase(objectMetadata.nameSingular)}`;
|
||||||
case 'deleteOne':
|
case 'deleteOne':
|
||||||
return `delete${pascalCase(objectMetadata.nameSingular)}`;
|
return `delete${pascalCase(objectMetadata.nameSingular)}`;
|
||||||
case 'executeQuickActionOnOne':
|
|
||||||
return `executeQuickActionOn${pascalCase(objectMetadata.nameSingular)}`;
|
|
||||||
case 'updateMany':
|
case 'updateMany':
|
||||||
return `update${pascalCase(objectMetadata.namePlural)}`;
|
return `update${pascalCase(objectMetadata.namePlural)}`;
|
||||||
case 'deleteMany':
|
case 'deleteMany':
|
||||||
|
|||||||
Reference in New Issue
Block a user