diff --git a/packages/twenty-client-sdk/src/metadata/generated/schema.graphql b/packages/twenty-client-sdk/src/metadata/generated/schema.graphql index a9ddbe9515..3d241cac5a 100644 --- a/packages/twenty-client-sdk/src/metadata/generated/schema.graphql +++ b/packages/twenty-client-sdk/src/metadata/generated/schema.graphql @@ -3363,6 +3363,7 @@ type Query { workspaceLookupAdminPanel(workspaceId: UUID!): UserLookup! getAdminWorkspaceChatThreads(workspaceId: UUID!): [AdminWorkspaceChatThread!]! getAdminChatThreadMessages(threadId: UUID!): AdminChatThreadMessages! + findOneAdminApplicationRegistration(id: String!): ApplicationRegistration! getUsageAnalytics(input: UsageAnalyticsInput): UsageAnalytics! getPostgresCredentials: PostgresCredentials findManyPublicDomains: [PublicDomain!]! diff --git a/packages/twenty-client-sdk/src/metadata/generated/schema.ts b/packages/twenty-client-sdk/src/metadata/generated/schema.ts index 5606ecec7e..6174bfc6fb 100644 --- a/packages/twenty-client-sdk/src/metadata/generated/schema.ts +++ b/packages/twenty-client-sdk/src/metadata/generated/schema.ts @@ -2928,6 +2928,7 @@ export interface Query { workspaceLookupAdminPanel: UserLookup getAdminWorkspaceChatThreads: AdminWorkspaceChatThread[] getAdminChatThreadMessages: AdminChatThreadMessages + findOneAdminApplicationRegistration: ApplicationRegistration getUsageAnalytics: UsageAnalytics getPostgresCredentials?: PostgresCredentials findManyPublicDomains: PublicDomain[] @@ -6294,6 +6295,7 @@ export interface QueryGenqlSelection{ workspaceLookupAdminPanel?: (UserLookupGenqlSelection & { __args: {workspaceId: Scalars['UUID']} }) getAdminWorkspaceChatThreads?: (AdminWorkspaceChatThreadGenqlSelection & { __args: {workspaceId: Scalars['UUID']} }) getAdminChatThreadMessages?: (AdminChatThreadMessagesGenqlSelection & { __args: {threadId: Scalars['UUID']} }) + findOneAdminApplicationRegistration?: (ApplicationRegistrationGenqlSelection & { __args: {id: Scalars['String']} }) getUsageAnalytics?: (UsageAnalyticsGenqlSelection & { __args?: {input?: (UsageAnalyticsInput | null)} }) getPostgresCredentials?: PostgresCredentialsGenqlSelection findManyPublicDomains?: PublicDomainGenqlSelection diff --git a/packages/twenty-client-sdk/src/metadata/generated/types.ts b/packages/twenty-client-sdk/src/metadata/generated/types.ts index 12fdbd8235..7aff92da38 100644 --- a/packages/twenty-client-sdk/src/metadata/generated/types.ts +++ b/packages/twenty-client-sdk/src/metadata/generated/types.ts @@ -7163,6 +7163,15 @@ export default { ] } ], + "findOneAdminApplicationRegistration": [ + 7, + { + "id": [ + 1, + "String!" + ] + } + ], "getUsageAnalytics": [ 283, { diff --git a/packages/twenty-front/src/generated-metadata/graphql.ts b/packages/twenty-front/src/generated-metadata/graphql.ts index 32a0e75db8..a552c1e934 100644 --- a/packages/twenty-front/src/generated-metadata/graphql.ts +++ b/packages/twenty-front/src/generated-metadata/graphql.ts @@ -4412,6 +4412,7 @@ export type Query = { findManyMarketplaceApps: Array; findManyPublicDomains: Array; findMarketplaceAppDetail: MarketplaceAppDetail; + findOneAdminApplicationRegistration: ApplicationRegistration; findOneAgent: Agent; findOneApplication: Application; findOneApplicationRegistration: ApplicationRegistration; @@ -4625,6 +4626,11 @@ export type QueryFindMarketplaceAppDetailArgs = { }; +export type QueryFindOneAdminApplicationRegistrationArgs = { + id: Scalars['String']; +}; + + export type QueryFindOneAgentArgs = { input: AgentIdInput; }; @@ -7499,6 +7505,13 @@ export type AdminPanelTopWorkspacesQueryVariables = Exact<{ export type AdminPanelTopWorkspacesQuery = { __typename?: 'Query', adminPanelTopWorkspaces: Array<{ __typename?: 'AdminPanelTopWorkspace', id: string, name: string, totalUsers: number, subdomain: string }> }; +export type FindOneAdminApplicationRegistrationQueryVariables = Exact<{ + id: Scalars['String']; +}>; + + +export type FindOneAdminApplicationRegistrationQuery = { __typename?: 'Query', findOneAdminApplicationRegistration: { __typename?: 'ApplicationRegistration', id: string, universalIdentifier: string, name: string, oAuthClientId: string, oAuthRedirectUris: Array, oAuthScopes: Array, sourceType: ApplicationRegistrationSourceType, sourcePackage?: string | null, latestAvailableVersion?: string | null, isListed: boolean, isFeatured: boolean, ownerWorkspaceId?: string | null, createdAt: string, updatedAt: string } }; + export type GetAdminChatThreadMessagesQueryVariables = Exact<{ threadId: Scalars['UUID']; }>; @@ -8710,6 +8723,7 @@ export const GetDatabaseConfigVariableDocument = {"kind":"Document","definitions export const UpdateWorkspaceFeatureFlagDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateWorkspaceFeatureFlag"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"workspaceId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UUID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"featureFlag"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"value"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Boolean"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateWorkspaceFeatureFlag"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"workspaceId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"workspaceId"}}},{"kind":"Argument","name":{"kind":"Name","value":"featureFlag"},"value":{"kind":"Variable","name":{"kind":"Name","value":"featureFlag"}}},{"kind":"Argument","name":{"kind":"Name","value":"value"},"value":{"kind":"Variable","name":{"kind":"Name","value":"value"}}}]}]}}]} as unknown as DocumentNode; export const AdminPanelRecentUsersDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"AdminPanelRecentUsers"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"searchTerm"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"adminPanelRecentUsers"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"searchTerm"},"value":{"kind":"Variable","name":{"kind":"Name","value":"searchTerm"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"email"}},{"kind":"Field","name":{"kind":"Name","value":"firstName"}},{"kind":"Field","name":{"kind":"Name","value":"lastName"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"workspaceName"}},{"kind":"Field","name":{"kind":"Name","value":"workspaceId"}}]}}]}}]} as unknown as DocumentNode; export const AdminPanelTopWorkspacesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"AdminPanelTopWorkspaces"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"searchTerm"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"adminPanelTopWorkspaces"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"searchTerm"},"value":{"kind":"Variable","name":{"kind":"Name","value":"searchTerm"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"totalUsers"}},{"kind":"Field","name":{"kind":"Name","value":"subdomain"}}]}}]}}]} as unknown as DocumentNode; +export const FindOneAdminApplicationRegistrationDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"FindOneAdminApplicationRegistration"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"findOneAdminApplicationRegistration"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ApplicationRegistrationFragment"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ApplicationRegistrationFragment"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ApplicationRegistration"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"universalIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthClientId"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthRedirectUris"}},{"kind":"Field","name":{"kind":"Name","value":"oAuthScopes"}},{"kind":"Field","name":{"kind":"Name","value":"sourceType"}},{"kind":"Field","name":{"kind":"Name","value":"sourcePackage"}},{"kind":"Field","name":{"kind":"Name","value":"latestAvailableVersion"}},{"kind":"Field","name":{"kind":"Name","value":"isListed"}},{"kind":"Field","name":{"kind":"Name","value":"isFeatured"}},{"kind":"Field","name":{"kind":"Name","value":"ownerWorkspaceId"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]} as unknown as DocumentNode; export const GetAdminChatThreadMessagesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetAdminChatThreadMessages"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"threadId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UUID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getAdminChatThreadMessages"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"threadId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"threadId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"thread"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"totalInputTokens"}},{"kind":"Field","name":{"kind":"Name","value":"totalOutputTokens"}},{"kind":"Field","name":{"kind":"Name","value":"conversationSize"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}},{"kind":"Field","name":{"kind":"Name","value":"messages"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"parts"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"textContent"}},{"kind":"Field","name":{"kind":"Name","value":"toolName"}}]}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}}]}}]}}]}}]} as unknown as DocumentNode; export const GetAdminWorkspaceChatThreadsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetAdminWorkspaceChatThreads"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"workspaceId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UUID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getAdminWorkspaceChatThreads"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"workspaceId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"workspaceId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"totalInputTokens"}},{"kind":"Field","name":{"kind":"Name","value":"totalOutputTokens"}},{"kind":"Field","name":{"kind":"Name","value":"conversationSize"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]}}]} as unknown as DocumentNode; export const GetVersionInfoDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetVersionInfo"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"versionInfo"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"currentVersion"}},{"kind":"Field","name":{"kind":"Name","value":"latestVersion"}}]}}]}}]} as unknown as DocumentNode; diff --git a/packages/twenty-front/src/modules/app/components/SettingsRoutes.tsx b/packages/twenty-front/src/modules/app/components/SettingsRoutes.tsx index d780ace58c..7f1e58d523 100644 --- a/packages/twenty-front/src/modules/app/components/SettingsRoutes.tsx +++ b/packages/twenty-front/src/modules/app/components/SettingsRoutes.tsx @@ -180,6 +180,14 @@ const SettingsApplicationDetails = lazy(() => ), ); +const SettingsAdminApplicationRegistrationDetail = lazy(() => + import( + '~/pages/settings/admin-panel/SettingsAdminApplicationRegistrationDetail' + ).then((module) => ({ + default: module.SettingsAdminApplicationRegistrationDetail, + })), +); + const SettingsAvailableApplicationDetails = lazy(() => import( '~/pages/settings/applications/SettingsAvailableApplicationDetails' @@ -802,6 +810,10 @@ export const SettingsRoutes = ({ isAdminPageEnabled }: SettingsRoutesProps) => ( path={SettingsPath.AdminPanelWorkspaceDetail} element={} /> + } + /> } diff --git a/packages/twenty-front/src/modules/settings/admin-panel/apps/components/SettingsAdminApps.tsx b/packages/twenty-front/src/modules/settings/admin-panel/apps/components/SettingsAdminApps.tsx index f1c89a7daa..ad8efaea2b 100644 --- a/packages/twenty-front/src/modules/settings/admin-panel/apps/components/SettingsAdminApps.tsx +++ b/packages/twenty-front/src/modules/settings/admin-panel/apps/components/SettingsAdminApps.tsx @@ -80,7 +80,7 @@ export const SettingsAdminApps = () => { { + const { t } = useLingui(); + + const { applicationRegistrationId = '' } = useParams<{ + applicationRegistrationId: string; + }>(); + + const { data, loading } = useQuery( + FindOneAdminApplicationRegistrationDocument, + { + variables: { id: applicationRegistrationId }, + skip: !applicationRegistrationId, + }, + ); + + const registration = data?.findOneAdminApplicationRegistration as + | ApplicationRegistrationData + | undefined; + + if (loading || !isDefined(registration)) { + return null; + } + + return ( + + + + ); +}; diff --git a/packages/twenty-front/src/pages/settings/applications/SettingsApplicationRegistrationDetails.tsx b/packages/twenty-front/src/pages/settings/applications/SettingsApplicationRegistrationDetails.tsx index 394bcc00ae..7a6202eb43 100644 --- a/packages/twenty-front/src/pages/settings/applications/SettingsApplicationRegistrationDetails.tsx +++ b/packages/twenty-front/src/pages/settings/applications/SettingsApplicationRegistrationDetails.tsx @@ -1,37 +1,23 @@ -import { SettingsPageContainer } from '@/settings/components/SettingsPageContainer'; -import { TabList } from '@/ui/layout/tab-list/components/TabList'; -import { activeTabIdComponentState } from '@/ui/layout/tab-list/states/activeTabIdComponentState'; import { SubMenuTopBarContainer } from '@/ui/layout/page/components/SubMenuTopBarContainer'; -import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue'; import { useQuery } from '@apollo/client/react'; -import { useLingui } from '@lingui/react/macro'; import { useParams } from 'react-router-dom'; import { SettingsPath } from 'twenty-shared/types'; import { getSettingsPath, isDefined } from 'twenty-shared/utils'; -import { IconInfoCircle, IconKey, IconWorld } from 'twenty-ui/display'; import { FindApplicationRegistrationStatsDocument, FindOneApplicationRegistrationDocument, } from '~/generated-metadata/graphql'; import { type ApplicationRegistrationData } from '~/pages/settings/applications/tabs/types/ApplicationRegistrationData'; -import { SettingsApplicationRegistrationGeneralTab } from '~/pages/settings/applications/tabs/SettingsApplicationRegistrationGeneralTab'; -import { SettingsApplicationRegistrationOAuthTab } from '~/pages/settings/applications/tabs/SettingsApplicationRegistrationOAuthTab'; -import { SettingsApplicationRegistrationDistributionTab } from '~/pages/settings/applications/tabs/SettingsApplicationRegistrationDistributionTab'; - -const REGISTRATION_DETAIL_TAB_LIST_ID = - 'application-registration-detail-tab-list'; +import { SettingsApplicationRegistrationContent } from '~/pages/settings/applications/components/SettingsApplicationRegistrationContent'; +import { useLingui } from '@lingui/react/macro'; export const SettingsApplicationRegistrationDetails = () => { const { t } = useLingui(); + const { applicationRegistrationId = '' } = useParams<{ applicationRegistrationId: string; }>(); - const activeTabId = useAtomComponentStateValue( - activeTabIdComponentState, - REGISTRATION_DETAIL_TAB_LIST_ID, - ); - const { data, loading } = useQuery(FindOneApplicationRegistrationDocument, { variables: { id: applicationRegistrationId }, skip: !applicationRegistrationId, @@ -48,44 +34,15 @@ export const SettingsApplicationRegistrationDetails = () => { const registration = data?.findOneApplicationRegistration as | ApplicationRegistrationData | undefined; + const stats = statsData?.findApplicationRegistrationStats; + const hasActiveInstalls = (stats?.activeInstalls ?? 0) > 0; if (loading || !isDefined(registration)) { return null; } - const tabs = [ - { id: 'general', title: t`General`, Icon: IconInfoCircle }, - { id: 'oauth', title: t`OAuth`, Icon: IconKey }, - { id: 'distribution', title: t`Distribution`, Icon: IconWorld }, - ]; - - const renderActiveTabContent = () => { - switch (activeTabId) { - case 'oauth': - return ( - - ); - case 'distribution': - return ( - - ); - case 'general': - default: - return ( - - ); - } - }; - return ( { { children: registration.name }, ]} > - - - {renderActiveTabContent()} - + ); }; diff --git a/packages/twenty-front/src/pages/settings/applications/components/SettingsApplicationRegistrationContent.tsx b/packages/twenty-front/src/pages/settings/applications/components/SettingsApplicationRegistrationContent.tsx new file mode 100644 index 0000000000..05831b7226 --- /dev/null +++ b/packages/twenty-front/src/pages/settings/applications/components/SettingsApplicationRegistrationContent.tsx @@ -0,0 +1,71 @@ +import { SettingsPageContainer } from '@/settings/components/SettingsPageContainer'; +import { TabList } from '@/ui/layout/tab-list/components/TabList'; +import { activeTabIdComponentState } from '@/ui/layout/tab-list/states/activeTabIdComponentState'; +import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue'; +import { useLingui } from '@lingui/react/macro'; +import { IconInfoCircle, IconKey, IconWorld } from 'twenty-ui/display'; +import { type ApplicationRegistrationData } from '~/pages/settings/applications/tabs/types/ApplicationRegistrationData'; +import { SettingsApplicationRegistrationGeneralTab } from '~/pages/settings/applications/tabs/SettingsApplicationRegistrationGeneralTab'; +import { SettingsApplicationRegistrationOAuthTab } from '~/pages/settings/applications/tabs/SettingsApplicationRegistrationOAuthTab'; +import { SettingsApplicationRegistrationDistributionTab } from '~/pages/settings/applications/tabs/SettingsApplicationRegistrationDistributionTab'; + +const REGISTRATION_DETAIL_TAB_LIST_ID = + 'application-registration-detail-tab-list'; + +type SettingsApplicationRegistrationContentProps = { + registration: ApplicationRegistrationData; + hasActiveInstalls: boolean; +}; + +export const SettingsApplicationRegistrationContent = ({ + registration, + hasActiveInstalls, +}: SettingsApplicationRegistrationContentProps) => { + const { t } = useLingui(); + + const activeTabId = useAtomComponentStateValue( + activeTabIdComponentState, + REGISTRATION_DETAIL_TAB_LIST_ID, + ); + + const tabs = [ + { id: 'general', title: t`General`, Icon: IconInfoCircle }, + { id: 'oauth', title: t`OAuth`, Icon: IconKey }, + { id: 'distribution', title: t`Distribution`, Icon: IconWorld }, + ]; + + const renderActiveTabContent = () => { + switch (activeTabId) { + case 'oauth': + return ( + + ); + case 'distribution': + return ( + + ); + case 'general': + default: + return ( + + ); + } + }; + + return ( + + + {renderActiveTabContent()} + + ); +}; diff --git a/packages/twenty-server/src/engine/core-modules/admin-panel/admin-panel.resolver.ts b/packages/twenty-server/src/engine/core-modules/admin-panel/admin-panel.resolver.ts index 894d8ab2f5..86bdc25c5b 100644 --- a/packages/twenty-server/src/engine/core-modules/admin-panel/admin-panel.resolver.ts +++ b/packages/twenty-server/src/engine/core-modules/admin-panel/admin-panel.resolver.ts @@ -71,6 +71,7 @@ import { ModelsDevModelSuggestionDTO } from './dtos/models-dev-model-suggestion. import { ModelsDevProviderSuggestionDTO } from './dtos/models-dev-provider-suggestion.dto'; import { QueueMetricsDataDTO } from './dtos/queue-metrics-data.dto'; import { SetMaintenanceModeInput } from './dtos/set-maintenance-mode.input'; +import { AuthWorkspace } from 'src/engine/decorators/auth/auth-workspace.decorator'; @UsePipes(ResolverValidationPipe) @MetadataResolver() @@ -680,4 +681,12 @@ export class AdminPanelResolver { ): Promise { return this.adminChatService.getChatThreadMessages(threadId); } + + @UseGuards(AdminPanelGuard) + @Query(() => ApplicationRegistrationEntity) + async findOneAdminApplicationRegistration( + @Args('id') id: string, + ): Promise { + return this.applicationRegistrationService.findOneByIdGlobal(id); + } } diff --git a/packages/twenty-shared/src/types/SettingsPath.ts b/packages/twenty-shared/src/types/SettingsPath.ts index f17ef41ccc..a11a29e7b6 100644 --- a/packages/twenty-shared/src/types/SettingsPath.ts +++ b/packages/twenty-shared/src/types/SettingsPath.ts @@ -71,6 +71,7 @@ export enum SettingsPath { AdminPanelNewAiModel = 'admin-panel/ai/providers/:providerName/new-model', AdminPanelUserDetail = 'admin-panel/users/:userId', AdminPanelWorkspaceDetail = 'admin-panel/workspaces/:workspaceId', + AdminPanelApplicationRegistrationDetail = 'admin-panel/applications/registrations/:applicationRegistrationId', AdminPanelWorkspaceChatThread = 'admin-panel/workspaces/:workspaceId/threads/:threadId', Roles = 'roles',