From 035bfa37311f8b04633b92e87d03716d447af9ec Mon Sep 17 00:00:00 2001 From: Jens Pelzetter Date: Fri, 14 Aug 2020 18:47:21 +0200 Subject: [PATCH] Use Error subclasses instead of throwing strings Former-commit-id: 2567bd1ee2bc99607f153a392c901f69cc8ecb2f --- .../src/main/typescript/clients/users-api.ts | 305 ++++++++++++------ 1 file changed, 201 insertions(+), 104 deletions(-) diff --git a/ccm-core-apiclient/src/main/typescript/clients/users-api.ts b/ccm-core-apiclient/src/main/typescript/clients/users-api.ts index 4549de455..0baa7746b 100644 --- a/ccm-core-apiclient/src/main/typescript/clients/users-api.ts +++ b/ccm-core-apiclient/src/main/typescript/clients/users-api.ts @@ -1,4 +1,6 @@ import { + ApiClientError, + ApiError, ApiResponse, LibreCcmApiClient, ListView, @@ -32,14 +34,12 @@ export class UsersApiClient { } async getUsers(limit: number, offset: number): Promise> { + const url = `${this.#USERS_API_PREFIX}`; try { - const response: ApiResponse = await this.#apiClient.get( - `${this.#USERS_API_PREFIX}`, - { - limit: limit.toString(), - offset: offset.toString(), - } - ); + const response: ApiResponse = await this.#apiClient.get(url, { + limit: limit.toString(), + offset: offset.toString(), + }); if (response.ok) { const result: Record< string, @@ -60,86 +60,139 @@ export class UsersApiClient { offset: result.offset as number, }; } else { - throw `Failed to get users: - ${response.status} ${response.statusText}`; + throw new ApiError( + response.status, + response.statusText, + "get", + `Failed to get users`, + url + ); } } catch (err) { - throw `Failed to get users: ${err}`; + if (err instanceof ApiError) { + throw err; + } else { + throw new ApiClientError(`Failed to get users: ${err}`); + } } } async getUser(userIdentifier: string | number): Promise { + const url = `${this.#USERS_API_PREFIX}/${buildIdentifierParam( + userIdentifier + )}`; try { - const response: ApiResponse = await this.#apiClient.get( - `${this.#USERS_API_PREFIX}/${buildIdentifierParam( - userIdentifier - )}` - ); + const response: ApiResponse = await this.#apiClient.get(url); if (response.ok) { return buildUserFromRecord( (await response.json()) as Record ); } else { - throw `Failed to get user ${userIdentifier}: - ${response.status} ${response.statusText}`; + throw new ApiError( + response.status, + response.statusText, + "get", + `Failed to get user ${userIdentifier}`, + url + ); } } catch (err) { - throw `Failed to get user ${userIdentifier}: ${err}`; + if (err instanceof ApiError) { + throw err; + } else { + throw new ApiClientError( + `Failed to get user ${userIdentifier}: ${err}` + ); + } } } async addUser(user: User): Promise { + const url = `${this.#USERS_API_PREFIX}`; try { const response: ApiResponse = await this.#apiClient.post( - `${this.#USERS_API_PREFIX}`, + url, JSON.stringify(user) ); if (response.ok) { return user.name; } else { - throw `Failed to add user ${user.name}: - ${response.status} ${response.statusText}`; + throw new ApiError( + response.status, + response.statusText, + "post", + `Failed to add user ${user.name}`, + url + ); } } catch (err) { - throw `Failed to add user ${user.name}: ${err}`; + if (err instanceof ApiError) { + throw err; + } else { + throw new ApiClientError( + `Failed to add user ${user.name}: ${err}` + ); + } } } async updateUser(userIdentifier: string, user: User): Promise { + const url = `${this.#USERS_API_PREFIX}/${buildIdentifierParam( + userIdentifier + )}`; try { const response: ApiResponse = await this.#apiClient.put( - `${this.#USERS_API_PREFIX}/${buildIdentifierParam( - userIdentifier - )}`, + url, JSON.stringify(user) ); if (response.ok) { return; } else { - throw `Failed to update user ${userIdentifier}: - ${response.status} ${response.statusText}`; + throw new ApiError( + response.status, + response.statusText, + "put", + `Failed to update user ${userIdentifier}`, + url + ); } } catch (err) { - throw `Failed to update user ${userIdentifier}: ${err}`; + if (err instanceof ApiError) { + throw err; + } else { + throw new ApiClientError( + `Failed to update user ${userIdentifier}: ${err}` + ); + } } } async deleteUser(userIdentifier: string): Promise { + const url = `${this.#USERS_API_PREFIX}/${buildIdentifierParam( + userIdentifier + )}`; try { - const response: ApiResponse = await this.#apiClient.delete( - `${this.#USERS_API_PREFIX}/${buildIdentifierParam( - userIdentifier - )}` - ); + const response: ApiResponse = await this.#apiClient.delete(url); if (response.ok) { return; } else { - throw `Failed to delete user ${userIdentifier}: - ${response.status} ${response.statusText}`; + throw new ApiError( + response.status, + response.statusText, + "delete", + `Failed to delete user ${userIdentifier}`, + url + ); } } catch (err) { - throw `Failed to delete user ${userIdentifier}: ${err}`; + if (err instanceof ApiError) { + throw err; + } else { + throw new ApiClientError( + `Failed to delete user ${userIdentifier}: ${err}` + ); + } } } @@ -148,16 +201,13 @@ export class UsersApiClient { limit: number, offset: number ): Promise> { + const userParam = buildIdentifierParam(userIdentifier); + const url = `${this.#USERS_API_PREFIX}/${userParam}/groups`; try { - const userParam = buildIdentifierParam(userIdentifier); - - const response: ApiResponse = await this.#apiClient.get( - `${this.#USERS_API_PREFIX}/${userParam}/groups`, - { - limit: limit.toString(), - offset: offset.toString(), - } - ); + const response: ApiResponse = await this.#apiClient.get(url, { + limit: limit.toString(), + offset: offset.toString(), + }); if (response.ok) { const result: Record< string, @@ -178,13 +228,22 @@ export class UsersApiClient { offset: result.limit as number, }; } else { - throw `Failed to get group memberships of - user ${userIdentifier}: - ${response.status} ${response.statusText}`; + throw new ApiError( + response.status, + response.statusText, + "get", + `Failed to get group memberships of user ${userIdentifier}`, + url + ); } } catch (err) { - throw `Failed to get group memberships of user - ${userIdentifier}: ${err}`; + if (err instanceof ApiError) { + throw err; + } else { + throw new ApiClientError( + `Failed to get group memberships of user ${userIdentifier}: ${err}` + ); + } } } @@ -192,25 +251,32 @@ export class UsersApiClient { userIdentifier: string | number, groupIdentifier: string | number ): Promise { + const userParam = buildIdentifierParam(userIdentifier); + const groupParam = buildIdentifierParam(groupIdentifier); + const url = `${ + this.#USERS_API_PREFIX + }/${userParam}/groups/${groupParam}`; try { - const userParam = buildIdentifierParam(userIdentifier); - const groupParam = buildIdentifierParam(groupIdentifier); - - const response: ApiResponse = await this.#apiClient.put( - `${this.#USERS_API_PREFIX}/${userParam}/groups/${groupParam}` - ); + const response: ApiResponse = await this.#apiClient.put(url); if (response.ok) { return; } else { - throw `Failed to add group membership for group ${groupIdentifier} - to user - ${userIdentifier}: - ${response.status} ${response.statusText}`; + throw new ApiError( + response.status, + response.statusText, + "put", + `Failed to add group membership for group ${groupIdentifier} to user ${userIdentifier}`, + url + ); } } catch (err) { - throw `Failed to add group membership for group ${groupIdentifier} - to user - ${userIdentifier}: ${err}`; + if (err instanceof ApiError) { + throw err; + } else { + throw new ApiClientError( + `Failed to add group membership for group ${groupIdentifier} to user ${userIdentifier}: ${err}` + ); + } } } @@ -218,25 +284,32 @@ export class UsersApiClient { userIdentifier: string | number, groupIdentifier: string | number ): Promise { + const userParam = buildIdentifierParam(userIdentifier); + const groupParam = buildIdentifierParam(groupIdentifier); + const url = `${ + this.#USERS_API_PREFIX + }/${userParam}/groups/${groupParam}`; try { - const userParam = buildIdentifierParam(userIdentifier); - const groupParam = buildIdentifierParam(groupIdentifier); - - const response: ApiResponse = await this.#apiClient.delete( - `${this.#USERS_API_PREFIX}/${userParam}/groups/${groupParam}` - ); + const response: ApiResponse = await this.#apiClient.delete(url); if (response.ok) { return; } else { - throw `Failed to remote group membership for group ${groupIdentifier} - from user - ${userIdentifier}: - ${response.status} ${response.statusText}`; + throw new ApiError( + response.status, + response.statusText, + "delete", + `Failed to remote group membership for group ${groupIdentifier} from user ${userIdentifier}`, + url + ); } } catch (err) { - throw `Failed to remove group membership for group ${groupIdentifier} - from user - ${userIdentifier}: ${err}`; + if (err instanceof ApiError) { + throw err; + } else { + throw new ApiClientError( + `Failed to remove group membership for group ${groupIdentifier} from user ${userIdentifier}: ${err}` + ); + } } } @@ -244,11 +317,9 @@ export class UsersApiClient { userIdentifier: string ): Promise> { const userParam: string = buildIdentifierParam(userIdentifier); - + const url = `${this.#USERS_API_PREFIX}/${userParam}/roles`; try { - const response: ApiResponse = await this.#apiClient.get( - `${this.#USERS_API_PREFIX}/${userParam}/roles` - ); + const response: ApiResponse = await this.#apiClient.get(url); if (response.ok) { const result: Record< string, @@ -269,11 +340,22 @@ export class UsersApiClient { offset: result.offset as number, }; } else { - throw `Failed to get roles of user ${userIdentifier}: - ${response.status} ${response.statusText}`; + throw new ApiError( + response.status, + response.statusText, + "get", + `Failed to get roles of user ${userIdentifier}`, + url + ); } } catch (err) { - throw `Failed to get roles of user ${userIdentifier}: ${err}`; + if (err instanceof ApiError) { + throw err; + } else { + throw new ApiClientError( + `Failed to get roles of user ${userIdentifier}: ${err}` + ); + } } } @@ -281,22 +363,30 @@ export class UsersApiClient { userIdentifier: string | number, roleIdentifier: string | number ): Promise { + const userParam = buildIdentifierParam(userIdentifier); + const roleParam = buildIdentifierParam(roleIdentifier); + const url = `${this.#USERS_API_PREFIX}/${userParam}/roles/${roleParam}`; try { - const userParam = buildIdentifierParam(userIdentifier); - const roleParam = buildIdentifierParam(roleIdentifier); - const response: ApiResponse = await this.#apiClient.put( - `${this.#USERS_API_PREFIX}/${userParam}/roles/${roleParam}` - ); + const response: ApiResponse = await this.#apiClient.put(url); if (response.ok) { return; } else { - throw `Failed to add role ${roleIdentifier} to - user ${userIdentifier}: - ${response.status} ${response.statusText}`; + throw new ApiError( + response.status, + response.statusText, + "put", + `Failed to add role ${roleIdentifier} to user ${userIdentifier}`, + url + ); } } catch (err) { - throw `Failed to add role ${roleIdentifier} to - user ${userIdentifier}: ${err}`; + if (err instanceof ApiError) { + throw err; + } else { + throw new ApiClientError( + `Failed to add role ${roleIdentifier} to user ${userIdentifier}: ${err}` + ); + } } } @@ -304,23 +394,30 @@ export class UsersApiClient { userIdentifier: string | number, roleIdentifier: string | number ): Promise { + const userParam = buildIdentifierParam(userIdentifier); + const roleParam = buildIdentifierParam(roleIdentifier); + const url = `${this.#USERS_API_PREFIX}/${userParam}/roles/${roleParam}`; try { - const userParam = buildIdentifierParam(userIdentifier); - const roleParam = buildIdentifierParam(roleIdentifier); - const response: ApiResponse = await this.#apiClient.delete( - `${this.#USERS_API_PREFIX}/${userParam}/roles/${roleParam}` - ); + const response: ApiResponse = await this.#apiClient.delete(url); if (response.ok) { return; } else { - throw `Failed to remove role ${roleIdentifier} from - user ${userIdentifier}: - ${response.status} ${response.statusText}`; + throw new ApiError( + response.status, + response.statusText, + "delete", + `Failed to remove role ${roleIdentifier} from user ${userIdentifier}`, + url + ); } } catch (err) { - throw `Failed to remote role ${roleIdentifier} from - user ${userIdentifier}: ${err}`; + if (err instanceof ApiError) { + throw err; + } else { + throw new ApiClientError( + `Failed to remote role ${roleIdentifier} from user ${userIdentifier}: ${err}` + ); + } } } - }