fix: propogate github radar connection errors properly

This commit is contained in:
sidwebworks
2025-07-18 04:32:36 +05:30
parent c5c2e2619e
commit d0e7af721e
2 changed files with 22 additions and 24 deletions
@@ -9,6 +9,7 @@ import { getAppConnectionMethodName } from "@app/services/app-connection/app-con
import { IntegrationUrls } from "@app/services/integration-auth/integration-list"; import { IntegrationUrls } from "@app/services/integration-auth/integration-list";
import { AppConnection } from "../app-connection-enums"; import { AppConnection } from "../app-connection-enums";
import { GithubTokenRespData, isGithubErrorResponse } from "../github/github-connection-fns";
import { GitHubRadarConnectionMethod } from "./github-radar-connection-enums"; import { GitHubRadarConnectionMethod } from "./github-radar-connection-enums";
import { import {
TGitHubRadarConnection, TGitHubRadarConnection,
@@ -71,13 +72,6 @@ export const listGitHubRadarRepositories = async (appConnection: TGitHubRadarCon
return repositories; return repositories;
}; };
type TokenRespData = {
access_token: string;
scope: string;
token_type: string;
error?: string;
};
export const validateGitHubRadarConnectionCredentials = async (config: TGitHubRadarConnectionConfig) => { export const validateGitHubRadarConnectionCredentials = async (config: TGitHubRadarConnectionConfig) => {
const { credentials, method } = config; const { credentials, method } = config;
@@ -93,10 +87,10 @@ export const validateGitHubRadarConnectionCredentials = async (config: TGitHubRa
}); });
} }
let tokenResp: AxiosResponse<TokenRespData>; let tokenResp: AxiosResponse<GithubTokenRespData>;
try { try {
tokenResp = await request.get<TokenRespData>("https://github.com/login/oauth/access_token", { tokenResp = await request.get<GithubTokenRespData>("https://github.com/login/oauth/access_token", {
params: { params: {
client_id: INF_APP_CONNECTION_GITHUB_RADAR_APP_CLIENT_ID, client_id: INF_APP_CONNECTION_GITHUB_RADAR_APP_CLIENT_ID,
client_secret: INF_APP_CONNECTION_GITHUB_RADAR_APP_CLIENT_SECRET, client_secret: INF_APP_CONNECTION_GITHUB_RADAR_APP_CLIENT_SECRET,
@@ -108,19 +102,27 @@ export const validateGitHubRadarConnectionCredentials = async (config: TGitHubRa
"Accept-Encoding": "application/json" "Accept-Encoding": "application/json"
} }
}); });
if (isGithubErrorResponse(tokenResp?.data)) {
throw new BadRequestError({
message: `Unable to validate credentials: GitHub responded with an error: ${tokenResp.data.error} - ${tokenResp.data.error_description}`
});
}
} catch (e: unknown) { } catch (e: unknown) {
if (e instanceof BadRequestError) {
throw e;
}
throw new BadRequestError({ throw new BadRequestError({
message: `Unable to validate connection: verify credentials` message: `Unable to validate connection: verify credentials`
}); });
} }
if (tokenResp.status !== 200) { if (method === GitHubRadarConnectionMethod.App) {
throw new BadRequestError({ if (!tokenResp.data.access_token) {
message: `Unable to validate credentials: GitHub responded with a status code of ${tokenResp.status} (${tokenResp.statusText}). Verify credentials and try again.` throw new InternalServerError({ message: `Missing access token: ${tokenResp.data.error}` });
});
} }
if (method === GitHubRadarConnectionMethod.App) {
const installationsResp = await request.get<{ const installationsResp = await request.get<{
installations: { installations: {
id: number; id: number;
@@ -149,10 +151,6 @@ export const validateGitHubRadarConnectionCredentials = async (config: TGitHubRa
} }
} }
if (!tokenResp.data.access_token) {
throw new InternalServerError({ message: `Missing access token: ${tokenResp.data.error}` });
}
switch (method) { switch (method) {
case GitHubRadarConnectionMethod.App: case GitHubRadarConnectionMethod.App:
return { return {
@@ -144,14 +144,14 @@ export const getGitHubEnvironments = async (appConnection: TGitHubConnection, ow
} }
}; };
type TokenRespData = { export type GithubTokenRespData = {
access_token?: string; access_token?: string;
scope: string; scope: string;
token_type: string; token_type: string;
error?: string; error?: string;
}; };
function isErrorResponse(data: TokenRespData): data is TokenRespData & { export function isGithubErrorResponse(data: GithubTokenRespData): data is GithubTokenRespData & {
error: string; error: string;
error_description: string; error_description: string;
error_uri: string; error_uri: string;
@@ -191,10 +191,10 @@ export const validateGitHubConnectionCredentials = async (config: TGitHubConnect
}); });
} }
let tokenResp: AxiosResponse<TokenRespData>; let tokenResp: AxiosResponse<GithubTokenRespData>;
try { try {
tokenResp = await request.get<TokenRespData>("https://github.com/login/oauth/access_token", { tokenResp = await request.get<GithubTokenRespData>("https://github.com/login/oauth/access_token", {
params: { params: {
client_id: clientId, client_id: clientId,
client_secret: clientSecret, client_secret: clientSecret,
@@ -207,7 +207,7 @@ export const validateGitHubConnectionCredentials = async (config: TGitHubConnect
} }
}); });
if (isErrorResponse(tokenResp?.data)) { if (isGithubErrorResponse(tokenResp?.data)) {
throw new BadRequestError({ throw new BadRequestError({
message: `Unable to validate credentials: GitHub responded with an error: ${tokenResp.data.error} - ${tokenResp.data.error_description}` message: `Unable to validate credentials: GitHub responded with an error: ${tokenResp.data.error} - ${tokenResp.data.error_description}`
}); });