From ae8a5858c72192c033c3b72f088da97b409953ee Mon Sep 17 00:00:00 2001 From: Presley Date: Mon, 6 Jun 2022 20:21:47 +0000 Subject: [PATCH 1/3] Update validation error unpacking --- site/src/api/errors.test.ts | 2 +- site/src/api/errors.ts | 9 +++++---- .../UserSettingsPage/AccountPage/AccountPage.test.tsx | 2 +- .../UserSettingsPage/SecurityPage/SecurityPage.test.tsx | 4 ++-- .../UsersPage/CreateUserPage/CreateUserPage.test.tsx | 2 +- 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/site/src/api/errors.test.ts b/site/src/api/errors.test.ts index 4037f55dfeebc..6402ed5b7f677 100644 --- a/site/src/api/errors.test.ts +++ b/site/src/api/errors.test.ts @@ -29,7 +29,7 @@ describe("mapApiErrorToFieldErrors", () => { expect( mapApiErrorToFieldErrors({ message: "Invalid entry", - errors: [{ detail: "Username is already in use", field: "username" }], + validations: [{ detail: "Username is already in use", field: "username" }], }), ).toEqual({ username: "Username is already in use", diff --git a/site/src/api/errors.ts b/site/src/api/errors.ts index 052dd303f9e97..747a2459d52ba 100644 --- a/site/src/api/errors.ts +++ b/site/src/api/errors.ts @@ -15,7 +15,8 @@ export type FieldErrors = Record export interface ApiErrorResponse { message: string - errors?: FieldError[] + detail?: string + validations?: FieldError[] } export type ApiError = AxiosError & { response: AxiosResponse } @@ -39,13 +40,13 @@ export const isApiError = (err: any): err is ApiError => { * @param error ApiError * @returns true if the ApiError contains error messages for specific form fields. */ -export const hasApiFieldErrors = (error: ApiError): boolean => Array.isArray(error.response.data.errors) +export const hasApiFieldErrors = (error: ApiError): boolean => Array.isArray(error.response.data.validations) export const mapApiErrorToFieldErrors = (apiErrorResponse: ApiErrorResponse): FieldErrors => { const result: FieldErrors = {} - if (apiErrorResponse.errors) { - for (const error of apiErrorResponse.errors) { + if (apiErrorResponse.validations) { + for (const error of apiErrorResponse.validations) { result[error.field] = error.detail || Language.errorsByCode.defaultErrorCode } } diff --git a/site/src/pages/UserSettingsPage/AccountPage/AccountPage.test.tsx b/site/src/pages/UserSettingsPage/AccountPage/AccountPage.test.tsx index c727667abb8c8..1d4998d5ad445 100644 --- a/site/src/pages/UserSettingsPage/AccountPage/AccountPage.test.tsx +++ b/site/src/pages/UserSettingsPage/AccountPage/AccountPage.test.tsx @@ -54,7 +54,7 @@ describe("AccountPage", () => { jest.spyOn(API, "updateProfile").mockRejectedValueOnce({ isAxiosError: true, response: { - data: { message: "Invalid profile", errors: [{ detail: "Username is already in use", field: "username" }] }, + data: { message: "Invalid profile", validations: [{ detail: "Username is already in use", field: "username" }] }, }, }) diff --git a/site/src/pages/UserSettingsPage/SecurityPage/SecurityPage.test.tsx b/site/src/pages/UserSettingsPage/SecurityPage/SecurityPage.test.tsx index b6301fc0601c1..c47aa13670929 100644 --- a/site/src/pages/UserSettingsPage/SecurityPage/SecurityPage.test.tsx +++ b/site/src/pages/UserSettingsPage/SecurityPage/SecurityPage.test.tsx @@ -49,7 +49,7 @@ describe("SecurityPage", () => { jest.spyOn(API, "updateUserPassword").mockRejectedValueOnce({ isAxiosError: true, response: { - data: { message: "Incorrect password.", errors: [{ detail: "Incorrect password.", field: "old_password" }] }, + data: { message: "Incorrect password.", validations: [{ detail: "Incorrect password.", field: "old_password" }] }, }, }) @@ -68,7 +68,7 @@ describe("SecurityPage", () => { jest.spyOn(API, "updateUserPassword").mockRejectedValueOnce({ isAxiosError: true, response: { - data: { message: "Invalid password.", errors: [{ detail: "Invalid password.", field: "password" }] }, + data: { message: "Invalid password.", validations: [{ detail: "Invalid password.", field: "password" }] }, }, }) diff --git a/site/src/pages/UsersPage/CreateUserPage/CreateUserPage.test.tsx b/site/src/pages/UsersPage/CreateUserPage/CreateUserPage.test.tsx index 907807afe47c4..0be36c100bd2f 100644 --- a/site/src/pages/UsersPage/CreateUserPage/CreateUserPage.test.tsx +++ b/site/src/pages/UsersPage/CreateUserPage/CreateUserPage.test.tsx @@ -58,7 +58,7 @@ describe("Create User Page", () => { ctx.status(400), ctx.json({ message: "invalid field", - errors: [ + validations: [ { detail: fieldErrorMessage, field: "username", From aa33d2410507fd73a4fca30f998737f2f33bedaf Mon Sep 17 00:00:00 2001 From: Presley Date: Mon, 6 Jun 2022 22:48:09 +0000 Subject: [PATCH 2/3] Rename validations on backend --- coderd/httpapi/httpapi.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coderd/httpapi/httpapi.go b/coderd/httpapi/httpapi.go index db73b0251343e..1bc411285b161 100644 --- a/coderd/httpapi/httpapi.go +++ b/coderd/httpapi/httpapi.go @@ -67,7 +67,7 @@ type Response struct { // Validations are form field-specific friendly error messages. They will be // shown on a form field in the UI. These can also be used to add additional // context if there is a set of errors in the primary 'Message'. - Validations []Error `json:"errors,omitempty"` + Validations []Error `json:"validations,omitempty"` } // Error represents a scoped error to a user input. From 07f755e3c2dcc6d37eb8e730786a88147c086ab4 Mon Sep 17 00:00:00 2001 From: Presley Date: Mon, 6 Jun 2022 22:49:55 +0000 Subject: [PATCH 3/3] Format --- .../pages/UserSettingsPage/AccountPage/AccountPage.test.tsx | 5 ++++- .../UserSettingsPage/SecurityPage/SecurityPage.test.tsx | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/site/src/pages/UserSettingsPage/AccountPage/AccountPage.test.tsx b/site/src/pages/UserSettingsPage/AccountPage/AccountPage.test.tsx index 1d4998d5ad445..0d203dc005f5c 100644 --- a/site/src/pages/UserSettingsPage/AccountPage/AccountPage.test.tsx +++ b/site/src/pages/UserSettingsPage/AccountPage/AccountPage.test.tsx @@ -54,7 +54,10 @@ describe("AccountPage", () => { jest.spyOn(API, "updateProfile").mockRejectedValueOnce({ isAxiosError: true, response: { - data: { message: "Invalid profile", validations: [{ detail: "Username is already in use", field: "username" }] }, + data: { + message: "Invalid profile", + validations: [{ detail: "Username is already in use", field: "username" }], + }, }, }) diff --git a/site/src/pages/UserSettingsPage/SecurityPage/SecurityPage.test.tsx b/site/src/pages/UserSettingsPage/SecurityPage/SecurityPage.test.tsx index c47aa13670929..5ee505b901989 100644 --- a/site/src/pages/UserSettingsPage/SecurityPage/SecurityPage.test.tsx +++ b/site/src/pages/UserSettingsPage/SecurityPage/SecurityPage.test.tsx @@ -49,7 +49,10 @@ describe("SecurityPage", () => { jest.spyOn(API, "updateUserPassword").mockRejectedValueOnce({ isAxiosError: true, response: { - data: { message: "Incorrect password.", validations: [{ detail: "Incorrect password.", field: "old_password" }] }, + data: { + message: "Incorrect password.", + validations: [{ detail: "Incorrect password.", field: "old_password" }], + }, }, })