import { ApiPayload, CompassExternalAliasInput, Component, ExternalAliasPayload, SdkError, } from '@atlassian/forge-graphql-types'; import { CompassRequests } from '../../../../compass-requests'; import { EXTERNAL_ALIAS_SOURCE_COMPONENT_NAME, EXTERNAL_ALIAS_SOURCE_COMPONENT_PATH_TO_FILE, } from '../createOrUpdateComponent/constants'; export const isManagedExternalAliasSource = ( externalAliasSource: string, ): boolean => [ EXTERNAL_ALIAS_SOURCE_COMPONENT_PATH_TO_FILE, EXTERNAL_ALIAS_SOURCE_COMPONENT_NAME, ].indexOf(externalAliasSource) !== -1; export const createExternalAliasesToBeDeleted = (input: { component: Component; otherExternalAliases?: CompassExternalAliasInput[]; }): CompassExternalAliasInput[] => { const { component, otherExternalAliases } = input; let aliasesToBeDeleted = otherExternalAliases ?? []; aliasesToBeDeleted = aliasesToBeDeleted.concat( component.externalAliases ?.filter((externalAlias) => isManagedExternalAliasSource(externalAlias.externalSource), ) .map( (externalAlias) => ({ externalId: externalAlias.externalAliasId, externalSource: externalAlias.externalSource, } as CompassExternalAliasInput), ), ); return aliasesToBeDeleted; }; /** * * @param requestApi - CompassApi * @param component - represents the component * @param removeExternalAliases - Optional array of additional external aliases that need to be deleted * @throws DeleteExternalAliasesError even if one of the aliases isn't deleted successfully. */ export async function deleteAliasesByCreateFromYaml( requestApi: CompassRequests, component: Component, removeExternalAliases: CompassExternalAliasInput[] = [], ): Promise<{ success: boolean; unDeletedAliasCount: number; totalAliasCount: number; errors: SdkError[]; }> { const deleteExternalAliases = createExternalAliasesToBeDeleted({ component, otherExternalAliases: removeExternalAliases, }); const deleteExternalAliasPromises: Promise< ApiPayload >[] = []; deleteExternalAliases.forEach((externalAlias) => { deleteExternalAliasPromises.push( requestApi.deleteExternalAlias({ componentId: component.id, externalAlias, }), ); }); const responses = await Promise.allSettled(deleteExternalAliasPromises); const removeExternalAliasErrors: SdkError[] = []; responses.forEach((response) => { if (response.status === 'fulfilled' && !response.value.success) { removeExternalAliasErrors.push(...(response.value.errors ?? [])); } else if (response.status === 'rejected') { removeExternalAliasErrors.push(response.reason.errors); } }); if (removeExternalAliasErrors.length) { console.warn( // eslint-disable-next-line max-len ` Failed to unlink #${removeExternalAliasErrors.length} out of ${deleteExternalAliases.length} for component ID ${component}`, ); } else { console.debug(`Aliases deleted for ${component}`); } return { success: removeExternalAliasErrors.length === 0, errors: removeExternalAliasErrors, totalAliasCount: deleteExternalAliases.length, unDeletedAliasCount: removeExternalAliasErrors.length, }; }