diff --git a/gql-queries-generator/doc/queries.graphql b/gql-queries-generator/doc/queries.graphql index 8aed3b80d..a004d0da5 100644 --- a/gql-queries-generator/doc/queries.graphql +++ b/gql-queries-generator/doc/queries.graphql @@ -896,6 +896,10 @@ mutation consoleCloneEnvironment($projectName: String!, $sourceEnvName: String!, } } +query consoleRestartApp($projectName: String!, $envName: String!, $appName: String!) { + core_restartApp(projectName: $projectName, envName: $envName, appName: $appName) +} + mutation consoleCreateApp($projectName: String!, $envName: String!, $app: AppIn!) { core_createApp(projectName: $projectName, envName: $envName, app: $app) { id diff --git a/src/apps/console/routes/_main+/$account+/$project+/$environment+/apps/apps-resources.tsx b/src/apps/console/routes/_main+/$account+/$project+/$environment+/apps/apps-resources.tsx index 2a34133f3..80148c5ae 100644 --- a/src/apps/console/routes/_main+/$account+/$project+/$environment+/apps/apps-resources.tsx +++ b/src/apps/console/routes/_main+/$account+/$project+/$environment+/apps/apps-resources.tsx @@ -1,4 +1,9 @@ -import { GearSix, LinkBreak, Link as LinkIcon } from '@jengaicons/react'; +import { + GearSix, + LinkBreak, + Link as LinkIcon, + Repeat, +} from '@jengaicons/react'; import { Link, useOutletContext, useParams } from '@remix-run/react'; import { generateKey, titleCase } from '~/components/utils'; import { @@ -47,7 +52,7 @@ type OnAction = ({ action, item, }: { - action: 'delete' | 'edit' | 'intercept' | 'remove_intercept'; + action: 'delete' | 'edit' | 'intercept' | 'remove_intercept' | 'restart'; item: BaseType; }) => void; @@ -83,7 +88,7 @@ const ExtraButton = ({ onAction, item }: IExtraButton) => { options = [ { label: 'Intercept', - icon: , + icon: , type: 'item', onClick: () => onAction({ action: 'intercept', item }), key: 'intercept', @@ -91,6 +96,18 @@ const ExtraButton = ({ onAction, item }: IExtraButton) => { ...options, ]; } + + options = [ + { + label: 'Restart', + icon: , + type: 'item', + onClick: () => onAction({ action: 'restart', item }), + key: 'restart', + }, + ...options, + ]; + return ; }; @@ -240,6 +257,29 @@ const AppsResources = ({ items = [] }: Omit) => { } } }; + + const restartApp = async (item: BaseType) => { + if (!environment || !project) { + throw new Error('Environment is required!.'); + } + + try { + const { errors } = await api.restartApp({ + appName: parseName(item), + envName: environment, + projectName: project, + }); + + if (errors) { + throw errors[0]; + } + toast.success('App restarted successfully'); + reload(); + } catch (error) { + handleError(error); + } + }; + const props: IResource = { items, onAction: ({ action, item }) => { @@ -247,6 +287,9 @@ const AppsResources = ({ items = [] }: Omit) => { case 'intercept': interceptApp(item, true); break; + case 'restart': + restartApp(item); + break; case 'remove_intercept': interceptApp(item, false); break; diff --git a/src/apps/console/server/gql/queries/app-queries.ts b/src/apps/console/server/gql/queries/app-queries.ts index 3aed5a5d2..0bcc2c5c5 100644 --- a/src/apps/console/server/gql/queries/app-queries.ts +++ b/src/apps/console/server/gql/queries/app-queries.ts @@ -14,12 +14,29 @@ import { ConsoleUpdateAppMutationVariables, ConsoleInterceptAppMutation, ConsoleInterceptAppMutationVariables, + ConsoleRestartAppQuery, + ConsoleRestartAppQueryVariables, } from '~/root/src/generated/gql/server'; export type IApp = NN; export type IApps = NN; export const appQueries = (executor: IExecutor) => ({ + restartApp: executor( + gql` + query Query($projectName: String!, $envName: String!, $appName: String!) { + core_restartApp( + projectName: $projectName + envName: $envName + appName: $appName + ) + } + `, + { + transformer: (data: ConsoleRestartAppQuery) => data.core_restartApp, + vars: (_: ConsoleRestartAppQueryVariables) => {}, + } + ), createApp: executor( gql` mutation Core_createApp( @@ -38,7 +55,7 @@ export const appQueries = (executor: IExecutor) => ({ `, { transformer: (data: ConsoleCreateAppMutation) => data.core_createApp, - vars(_: ConsoleCreateAppMutationVariables) { }, + vars(_: ConsoleCreateAppMutationVariables) {}, } ), @@ -62,7 +79,7 @@ export const appQueries = (executor: IExecutor) => ({ transformer: (data: ConsoleUpdateAppMutation) => { return data.core_updateApp; }, - vars(_: ConsoleUpdateAppMutationVariables) { }, + vars(_: ConsoleUpdateAppMutationVariables) {}, } ), interceptApp: executor( @@ -86,7 +103,7 @@ export const appQueries = (executor: IExecutor) => ({ { transformer: (data: ConsoleInterceptAppMutation) => data.core_interceptApp, - vars(_: ConsoleInterceptAppMutationVariables) { }, + vars(_: ConsoleInterceptAppMutationVariables) {}, } ), deleteApp: executor( @@ -105,7 +122,7 @@ export const appQueries = (executor: IExecutor) => ({ `, { transformer: (data: ConsoleDeleteAppMutation) => data.core_deleteApp, - vars(_: ConsoleDeleteAppMutationVariables) { }, + vars(_: ConsoleDeleteAppMutationVariables) {}, } ), getApp: executor( @@ -252,7 +269,7 @@ export const appQueries = (executor: IExecutor) => ({ transformer(data: ConsoleGetAppQuery) { return data.core_getApp; }, - vars(_: ConsoleGetAppQueryVariables) { }, + vars(_: ConsoleGetAppQueryVariables) {}, } ), listApps: executor( @@ -397,7 +414,7 @@ export const appQueries = (executor: IExecutor) => ({ `, { transformer: (data: ConsoleListAppsQuery) => data.core_listApps, - vars(_: ConsoleListAppsQueryVariables) { }, + vars(_: ConsoleListAppsQueryVariables) {}, } ), }); diff --git a/src/generated/gql/server.ts b/src/generated/gql/server.ts index da413414b..c97ebaed4 100644 --- a/src/generated/gql/server.ts +++ b/src/generated/gql/server.ts @@ -2311,6 +2311,14 @@ export type ConsoleCloneEnvironmentMutation = { core_cloneEnvironment?: { id: string }; }; +export type ConsoleRestartAppQueryVariables = Exact<{ + projectName: Scalars['String']['input']; + envName: Scalars['String']['input']; + appName: Scalars['String']['input']; +}>; + +export type ConsoleRestartAppQuery = { core_restartApp: boolean }; + export type ConsoleCreateAppMutationVariables = Exact<{ projectName: Scalars['String']['input']; envName: Scalars['String']['input'];