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" }], + }, }, }) pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy