Files
portainer/app/react/common/stacks/EditGitSettings/useUpdateGitStack.ts
T
2026-04-14 17:49:56 +03:00

88 lines
3.2 KiB
TypeScript

import { useMutation, useQueryClient } from '@tanstack/react-query';
import { Stack } from '@/react/common/stacks/types';
import { updateGitStack } from '@/react/portainer/gitops/queries/useUpdateGitStack';
import { updateGitStackSettings } from '@/react/portainer/gitops/queries/useUpdateGitStackSettings';
import { queryKeys } from '@/react/common/stacks/queries/query-keys';
import { transformAutoUpdateViewModel } from '@/react/portainer/gitops/AutoUpdateFieldset/utils';
import { saveGitCredentialsIfNeeded } from '@/react/portainer/account/git-credentials/queries/useCreateGitCredentialsMutation';
import { useCurrentUser } from '@/react/hooks/useUser';
import { withGlobalError } from '@/react-tools/react-query';
import { FormValues } from './types';
interface MutationArgs {
values: FormValues;
repullImageAndRedeploy?: boolean;
webhookId: string;
}
export function useUpdateGitStack(stack: Stack) {
const queryClient = useQueryClient();
const { user } = useCurrentUser();
return useMutation({
mutationFn: async ({
values,
repullImageAndRedeploy,
webhookId,
}: MutationArgs) => {
const resolvedAuth = await saveGitCredentialsIfNeeded(
user.Id,
values.git
);
const autoUpdate = transformAutoUpdateViewModel(
values.git.AutoUpdate,
webhookId
);
await updateGitStackSettings(stack.Id, stack.EndpointId, {
RepositoryURL: values.git.RepositoryURL,
ConfigFilePath: values.git.ComposeFilePathInRepository,
RepositoryReferenceName: values.git.RepositoryReferenceName,
RepositoryAuthentication: resolvedAuth.RepositoryAuthentication,
RepositoryGitCredentialID: resolvedAuth.RepositoryGitCredentialID,
RepositoryUsername: resolvedAuth.RepositoryUsername,
RepositoryPassword: resolvedAuth.RepositoryPassword,
RepositoryAuthorizationType: resolvedAuth.RepositoryAuthorizationType,
TLSSkipVerify: values.git.TLSSkipVerify,
AutoUpdate: autoUpdate,
AdditionalFiles: values.git.AdditionalFiles,
env: values.env,
prune: values.prune,
});
if (repullImageAndRedeploy === undefined) {
return { redeployAttempted: false, redeployFailed: false };
}
try {
await updateGitStack(stack.Id, stack.EndpointId, {
Env: values.env,
Prune: values.prune,
StackName: values.kube.name,
RepositoryAuthentication: resolvedAuth.RepositoryAuthentication,
RepositoryGitCredentialID: resolvedAuth.RepositoryGitCredentialID,
RepositoryUsername: resolvedAuth.RepositoryUsername,
RepositoryPassword: resolvedAuth.RepositoryPassword,
RepositoryAuthorizationType: resolvedAuth.RepositoryAuthorizationType,
RepullImageAndRedeploy: repullImageAndRedeploy,
});
return { redeployAttempted: true, redeployFailed: false };
} catch (error) {
return {
redeployAttempted: true,
redeployFailed: true,
redeployError: error,
};
}
},
onSuccess: () => {
queryClient.invalidateQueries({
queryKey: queryKeys.stack(stack.Id),
});
},
...withGlobalError('Unable to save stack settings'),
});
}