Skip to content

Commit ee0405e

Browse files
committed
web: Tidy error checking behavior.
1 parent fc9a934 commit ee0405e

File tree

2 files changed

+32
-19
lines changed

2 files changed

+32
-19
lines changed

web/src/admin/applications/wizard/steps/ak-application-wizard-submit-step.ts

+30-14
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { EVENT_REFRESH } from "@goauthentik/common/constants";
44
import { parseAPIResponseError } from "@goauthentik/common/errors/network";
55
import { WizardNavigationEvent } from "@goauthentik/components/ak-wizard/events.js";
66
import { type WizardButton } from "@goauthentik/components/ak-wizard/types";
7+
import { showAPIErrorMessage } from "@goauthentik/elements/messages/MessageContainer";
78
import { CustomEmitterElement } from "@goauthentik/elements/utils/eventEmitter";
89
import { P, match } from "ts-pattern";
910

@@ -30,10 +31,15 @@ import {
3031
type TransactionApplicationRequest,
3132
type TransactionApplicationResponse,
3233
type TransactionPolicyBindingRequest,
34+
instanceOfValidationError,
3335
} from "@goauthentik/api";
3436

3537
import { ApplicationWizardStep } from "../ApplicationWizardStep.js";
36-
import { ApplicationTransactionValidationError, OneOfProvider } from "../types.js";
38+
import {
39+
ApplicationTransactionValidationError,
40+
OneOfProvider,
41+
isApplicationTransactionValidationError,
42+
} from "../types.js";
3743
import { providerRenderers } from "./SubmitStepOverviewRenderers.js";
3844

3945
const _submitStates = ["reviewing", "running", "submitted"] as const;
@@ -140,25 +146,35 @@ export class ApplicationWizardSubmitStep extends CustomEmitterElement(Applicatio
140146
this.state = "submitted";
141147
})
142148

143-
.catch(async (resolution) => {
144-
const errors =
145-
await parseAPIResponseError<ApplicationTransactionValidationError>(resolution);
149+
.catch(async (error) => {
150+
const parsedError = await parseAPIResponseError(error);
151+
152+
if (!instanceOfValidationError(parsedError)) {
153+
showAPIErrorMessage(parsedError);
154+
155+
return;
156+
}
157+
158+
if (isApplicationTransactionValidationError(parsedError)) {
159+
// THIS is a really gross special case; if the user is duplicating the name of an existing provider, the error appears on the `app` (!) error object.
160+
// We have to move that to the `provider.name` error field so it shows up in the right place.
161+
if (Array.isArray(parsedError.app?.provider)) {
162+
const providerError = parsedError.app.provider;
146163

147-
// THIS is a really gross special case; if the user is duplicating the name of an existing provider, the error appears on the `app` (!) error object.
148-
// We have to move that to the `provider.name` error field so it shows up in the right place.
149-
if (Array.isArray(errors?.app?.provider)) {
150-
const providerError = errors.app.provider;
151-
errors.provider = errors.provider ?? {};
152-
errors.provider.name = providerError;
164+
parsedError.provider = {
165+
...parsedError.provider,
166+
name: providerError,
167+
};
153168

154-
delete errors.app.provider;
169+
delete parsedError.app.provider;
155170

156-
if (Object.keys(errors.app).length === 0) {
157-
delete errors.app;
171+
if (Object.keys(parsedError.app).length === 0) {
172+
delete parsedError.app;
173+
}
158174
}
159175
}
160176

161-
this.handleUpdate({ errors });
177+
this.handleUpdate({ errors: parsedError });
162178
this.state = "reviewing";
163179
});
164180
}

web/src/admin/applications/wizard/types.ts

+2-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import { APIError } from "@goauthentik/common/errors/network";
2-
31
import {
42
type ApplicationRequest,
53
type LDAPProviderRequest,
@@ -36,15 +34,14 @@ export interface ApplicationTransactionValidationError extends ValidationError {
3634
app?: ValidationRecord;
3735
provider?: ValidationRecord;
3836
bindings?: ValidationRecord;
39-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
40-
detail?: any;
37+
detail?: unknown;
4138
}
4239

4340
/**
4441
* Type-guard to determine if an API response is shaped like an {@linkcode ApplicationTransactionValidationError}.
4542
*/
4643
export function isApplicationTransactionValidationError(
47-
error: APIError,
44+
error: ValidationError,
4845
): error is ApplicationTransactionValidationError {
4946
if ("app" in error) return true;
5047
if ("provider" in error) return true;

0 commit comments

Comments
 (0)