///
import {
ApiPayload,
CompassSearchComponentNodeFragment,
SdkError,
SearchComponents,
SearchComponentsInput,
SearchComponentsPayload,
} from '@atlassian/forge-graphql-types';
import { CompassRequests } from '../../compass-requests';
import {
mapGqlErrors,
mapQueryErrors,
parsingResponseError,
transformGqlComponent,
} from '../../helpers';
import { SEARCH_COMPONENTS_RETRIEVAL_OPTIONS } from '../../helpers/constants';
declare module '../../compass-requests' {
interface CompassRequests {
/**
* Searches for Compass components.
* **Required Oauth Scopes:** `read:component:compass`
*/
searchComponents(
input: SearchComponentsInput,
): Promise>;
}
}
CompassRequests.prototype.searchComponents = async function (
this: CompassRequests,
{ cloudId, query, options },
) {
let components = null;
let pageInfo = null;
let errorsResp: SdkError[] = [];
try {
const resp = await this.api.requestGraph(
SearchComponents,
{ cloudId, query, ...SEARCH_COMPONENTS_RETRIEVAL_OPTIONS, ...options },
'searchComponents',
);
const { data, errors: gqlErrors } = await resp.json();
errorsResp = mapGqlErrors(gqlErrors);
errorsResp = errorsResp.concat(
mapQueryErrors(data.compass, [
'searchComponents',
'searchComponents.metricSources',
]),
);
if (
errorsResp.length === 0 &&
data.compass.searchComponents.nodes?.length > 0
) {
components = data.compass.searchComponents.nodes
.filter(
(node: CompassSearchComponentNodeFragment) => node.component !== null,
)
.map((node: CompassSearchComponentNodeFragment) =>
transformGqlComponent(node.component),
);
pageInfo = data.compass.searchComponents.pageInfo;
}
} catch (e) {
if (errorsResp.length === 0) {
errorsResp.push(parsingResponseError(e));
}
}
return {
errors: errorsResp,
success: errorsResp.length === 0,
data: { components, pageInfo },
};
};