@atlaskit/profilecard
Version:
A React component to display a card with user information.
83 lines (82 loc) • 2.93 kB
JavaScript
import { AGGError, AGGErrors, DirectoryGraphQLError, DirectoryGraphQLErrors } from '../util/errors';
const IGNORED_ERROR_REASONS_DIRECTORY = [
// Error categories from pf-directory
'NotPermitted', 'Gone', 'IdentityUserNotFoundError'];
const IGNORE_ERROR_TYPES_AGG = ['IdentityUserNotFoundError', 'TEAMS_FORBIDDEN', 'TEAMS_TEAM_DELETED'];
const IGNORE_ERROR_CLASSIFICATIONS_AGG = ['Gone'];
function isIgnoredError(error) {
if (!error) {
return false;
}
if (error instanceof DirectoryGraphQLError) {
return !!error && IGNORED_ERROR_REASONS_DIRECTORY.includes(error.type);
} else if (error instanceof AGGError) {
return !!error.errorType && IGNORE_ERROR_TYPES_AGG.includes(error.errorType) || !!error.classification && IGNORE_ERROR_CLASSIFICATIONS_AGG.includes(error.classification);
}
return false;
}
export const getErrorAttributes = error => {
if (error instanceof DirectoryGraphQLErrors) {
return {
errorMessage: error.message,
errorCount: error.errors.length,
errorDetails: error.errors.map(getErrorAttributes),
isSLOFailure: !error.errors.every(isIgnoredError),
traceId: error.traceId
};
} else if (error instanceof DirectoryGraphQLError) {
return {
errorMessage: error.message,
errorCategory: error.category,
errorType: error.type,
errorPath: error.path,
errorNumber: error.errorNumber,
isSLOFailure: !isIgnoredError(error)
};
} else if (error instanceof AGGErrors) {
return {
errorMessage: error.message,
errorCount: error.errors.length,
errorDetails: error.errors.map(getErrorAttributes),
isSLOFailure: !error.errors.every(isIgnoredError),
traceId: error.traceId
};
} else if (error instanceof AGGError) {
return {
errorMessage: error.message,
errorType: error.errorType,
errorStatusCode: error.statusCode,
isSLOFailure: !isIgnoredError(error),
errorCategory: error.classification
};
} else if (error instanceof Error) {
// Jira custom profile card client error, they wrap the error & put the underlying error in the cause property
if (error.message.startsWith('Unable to fetch user:')) {
if (error.hasOwnProperty('cause')) {
const causeError = error.cause;
if (causeError instanceof DirectoryGraphQLErrors || causeError instanceof AGGErrors) {
return getErrorAttributes(causeError);
}
}
return {
errorMessage: error.message,
isSLOFailure: false
};
}
return {
errorMessage: error.message,
isSLOFailure: true
};
}
// Unknown
return {
errorMessage: 'Unknown error',
isSLOFailure: true
};
};
export const handleDirectoryGraphQLErrors = (errors, traceId) => {
throw new DirectoryGraphQLErrors(errors, traceId);
};
export const handleAGGErrors = (errors, traceId) => {
throw new AGGErrors(errors, traceId);
};