88 lines
3.2 KiB
TypeScript
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'),
|
|
});
|
|
}
|