sourcebot/src/lib/serviceError.ts

62 lines
1.9 KiB
TypeScript
Raw Normal View History

2024-08-26 04:30:09 +00:00
import { StatusCodes } from "http-status-codes";
import { ErrorCode } from "./errorCodes";
import { ZodError } from "zod";
2024-08-26 04:30:09 +00:00
export interface ServiceError {
2024-08-26 04:30:09 +00:00
statusCode: StatusCodes;
errorCode: ErrorCode;
message: string;
}
export const serviceErrorResponse = ({ statusCode, errorCode, message }: ServiceError) => {
2024-08-26 04:30:09 +00:00
return Response.json({
statusCode,
errorCode,
message,
}, {
status: statusCode,
});
}
export const missingQueryParam = (name: string): ServiceError => {
return {
2024-08-26 04:30:09 +00:00
statusCode: StatusCodes.BAD_REQUEST,
errorCode: ErrorCode.MISSING_REQUIRED_QUERY_PARAMETER,
message: `Missing required query parameter: ${name}`,
};
}
export const schemaValidationError = (error: ZodError): ServiceError => {
return {
statusCode: StatusCodes.BAD_REQUEST,
errorCode: ErrorCode.INVALID_REQUEST_BODY,
message: `Schema validation failed with: ${error.message}`,
};
}
export const invalidZoektResponse = async (zoektResponse: Response): Promise<ServiceError> => {
const zoektMessage = await (async () => {
try {
const zoektResponseBody = await zoektResponse.json();
if (zoektResponseBody.Error) {
return zoektResponseBody.Error;
}
} catch (_e) {
return "Unknown error";
}
})();
return {
statusCode: StatusCodes.INTERNAL_SERVER_ERROR,
errorCode: ErrorCode.INVALID_REQUEST_BODY,
message: `Zoekt request failed with status code ${zoektResponse.status} and message: "${zoektMessage}"`,
};
}
export const fileNotFound = async (fileName: string, repository: string): Promise<ServiceError> => {
return {
statusCode: StatusCodes.NOT_FOUND,
errorCode: ErrorCode.FILE_NOT_FOUND,
message: `File "${fileName}" not found in repository "${repository}"`,
};
2024-08-26 04:30:09 +00:00
}