Use Error subclasses instead of throwing strings

Jens Pelzetter 2020-08-14 18:47:21 +02:00
parent d0a881ec95
commit 2567bd1ee2
1 changed files with 201 additions and 104 deletions

View File

@ -1,4 +1,6 @@
import { import {
ApiClientError,
ApiError,
ApiResponse, ApiResponse,
LibreCcmApiClient, LibreCcmApiClient,
ListView, ListView,
@ -32,14 +34,12 @@ export class UsersApiClient {
} }
async getUsers(limit: number, offset: number): Promise<ListView<User>> { async getUsers(limit: number, offset: number): Promise<ListView<User>> {
const url = `${this.#USERS_API_PREFIX}`;
try { try {
const response: ApiResponse = await this.#apiClient.get( const response: ApiResponse = await this.#apiClient.get(url, {
`${this.#USERS_API_PREFIX}`, limit: limit.toString(),
{ offset: offset.toString(),
limit: limit.toString(), });
offset: offset.toString(),
}
);
if (response.ok) { if (response.ok) {
const result: Record< const result: Record<
string, string,
@ -60,86 +60,139 @@ export class UsersApiClient {
offset: result.offset as number, offset: result.offset as number,
}; };
} else { } else {
throw `Failed to get users: throw new ApiError(
${response.status} ${response.statusText}`; response.status,
response.statusText,
"get",
`Failed to get users`,
url
);
} }
} catch (err) { } 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<User> { async getUser(userIdentifier: string | number): Promise<User> {
const url = `${this.#USERS_API_PREFIX}/${buildIdentifierParam(
userIdentifier
)}`;
try { try {
const response: ApiResponse = await this.#apiClient.get( const response: ApiResponse = await this.#apiClient.get(url);
`${this.#USERS_API_PREFIX}/${buildIdentifierParam(
userIdentifier
)}`
);
if (response.ok) { if (response.ok) {
return buildUserFromRecord( return buildUserFromRecord(
(await response.json()) as Record<string, unknown> (await response.json()) as Record<string, unknown>
); );
} else { } else {
throw `Failed to get user ${userIdentifier}: throw new ApiError(
${response.status} ${response.statusText}`; response.status,
response.statusText,
"get",
`Failed to get user ${userIdentifier}`,
url
);
} }
} catch (err) { } 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<string> { async addUser(user: User): Promise<string> {
const url = `${this.#USERS_API_PREFIX}`;
try { try {
const response: ApiResponse = await this.#apiClient.post( const response: ApiResponse = await this.#apiClient.post(
`${this.#USERS_API_PREFIX}`, url,
JSON.stringify(user) JSON.stringify(user)
); );
if (response.ok) { if (response.ok) {
return user.name; return user.name;
} else { } else {
throw `Failed to add user ${user.name}: throw new ApiError(
${response.status} ${response.statusText}`; response.status,
response.statusText,
"post",
`Failed to add user ${user.name}`,
url
);
} }
} catch (err) { } 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<void> { async updateUser(userIdentifier: string, user: User): Promise<void> {
const url = `${this.#USERS_API_PREFIX}/${buildIdentifierParam(
userIdentifier
)}`;
try { try {
const response: ApiResponse = await this.#apiClient.put( const response: ApiResponse = await this.#apiClient.put(
`${this.#USERS_API_PREFIX}/${buildIdentifierParam( url,
userIdentifier
)}`,
JSON.stringify(user) JSON.stringify(user)
); );
if (response.ok) { if (response.ok) {
return; return;
} else { } else {
throw `Failed to update user ${userIdentifier}: throw new ApiError(
${response.status} ${response.statusText}`; response.status,
response.statusText,
"put",
`Failed to update user ${userIdentifier}`,
url
);
} }
} catch (err) { } 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<void> { async deleteUser(userIdentifier: string): Promise<void> {
const url = `${this.#USERS_API_PREFIX}/${buildIdentifierParam(
userIdentifier
)}`;
try { try {
const response: ApiResponse = await this.#apiClient.delete( const response: ApiResponse = await this.#apiClient.delete(url);
`${this.#USERS_API_PREFIX}/${buildIdentifierParam(
userIdentifier
)}`
);
if (response.ok) { if (response.ok) {
return; return;
} else { } else {
throw `Failed to delete user ${userIdentifier}: throw new ApiError(
${response.status} ${response.statusText}`; response.status,
response.statusText,
"delete",
`Failed to delete user ${userIdentifier}`,
url
);
} }
} catch (err) { } 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, limit: number,
offset: number offset: number
): Promise<ListView<UserGroupMembership>> { ): Promise<ListView<UserGroupMembership>> {
const userParam = buildIdentifierParam(userIdentifier);
const url = `${this.#USERS_API_PREFIX}/${userParam}/groups`;
try { try {
const userParam = buildIdentifierParam(userIdentifier); const response: ApiResponse = await this.#apiClient.get(url, {
limit: limit.toString(),
const response: ApiResponse = await this.#apiClient.get( offset: offset.toString(),
`${this.#USERS_API_PREFIX}/${userParam}/groups`, });
{
limit: limit.toString(),
offset: offset.toString(),
}
);
if (response.ok) { if (response.ok) {
const result: Record< const result: Record<
string, string,
@ -178,13 +228,22 @@ export class UsersApiClient {
offset: result.limit as number, offset: result.limit as number,
}; };
} else { } else {
throw `Failed to get group memberships of throw new ApiError(
user ${userIdentifier}: response.status,
${response.status} ${response.statusText}`; response.statusText,
"get",
`Failed to get group memberships of user ${userIdentifier}`,
url
);
} }
} catch (err) { } catch (err) {
throw `Failed to get group memberships of user if (err instanceof ApiError) {
${userIdentifier}: ${err}`; 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, userIdentifier: string | number,
groupIdentifier: string | number groupIdentifier: string | number
): Promise<void> { ): Promise<void> {
const userParam = buildIdentifierParam(userIdentifier);
const groupParam = buildIdentifierParam(groupIdentifier);
const url = `${
this.#USERS_API_PREFIX
}/${userParam}/groups/${groupParam}`;
try { try {
const userParam = buildIdentifierParam(userIdentifier); const response: ApiResponse = await this.#apiClient.put(url);
const groupParam = buildIdentifierParam(groupIdentifier);
const response: ApiResponse = await this.#apiClient.put(
`${this.#USERS_API_PREFIX}/${userParam}/groups/${groupParam}`
);
if (response.ok) { if (response.ok) {
return; return;
} else { } else {
throw `Failed to add group membership for group ${groupIdentifier} throw new ApiError(
to user response.status,
${userIdentifier}: response.statusText,
${response.status} ${response.statusText}`; "put",
`Failed to add group membership for group ${groupIdentifier} to user ${userIdentifier}`,
url
);
} }
} catch (err) { } catch (err) {
throw `Failed to add group membership for group ${groupIdentifier} if (err instanceof ApiError) {
to user throw err;
${userIdentifier}: ${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, userIdentifier: string | number,
groupIdentifier: string | number groupIdentifier: string | number
): Promise<void> { ): Promise<void> {
const userParam = buildIdentifierParam(userIdentifier);
const groupParam = buildIdentifierParam(groupIdentifier);
const url = `${
this.#USERS_API_PREFIX
}/${userParam}/groups/${groupParam}`;
try { try {
const userParam = buildIdentifierParam(userIdentifier); const response: ApiResponse = await this.#apiClient.delete(url);
const groupParam = buildIdentifierParam(groupIdentifier);
const response: ApiResponse = await this.#apiClient.delete(
`${this.#USERS_API_PREFIX}/${userParam}/groups/${groupParam}`
);
if (response.ok) { if (response.ok) {
return; return;
} else { } else {
throw `Failed to remote group membership for group ${groupIdentifier} throw new ApiError(
from user response.status,
${userIdentifier}: response.statusText,
${response.status} ${response.statusText}`; "delete",
`Failed to remote group membership for group ${groupIdentifier} from user ${userIdentifier}`,
url
);
} }
} catch (err) { } catch (err) {
throw `Failed to remove group membership for group ${groupIdentifier} if (err instanceof ApiError) {
from user throw err;
${userIdentifier}: ${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 userIdentifier: string
): Promise<ListView<PartyRoleMembership>> { ): Promise<ListView<PartyRoleMembership>> {
const userParam: string = buildIdentifierParam(userIdentifier); const userParam: string = buildIdentifierParam(userIdentifier);
const url = `${this.#USERS_API_PREFIX}/${userParam}/roles`;
try { try {
const response: ApiResponse = await this.#apiClient.get( const response: ApiResponse = await this.#apiClient.get(url);
`${this.#USERS_API_PREFIX}/${userParam}/roles`
);
if (response.ok) { if (response.ok) {
const result: Record< const result: Record<
string, string,
@ -269,11 +340,22 @@ export class UsersApiClient {
offset: result.offset as number, offset: result.offset as number,
}; };
} else { } else {
throw `Failed to get roles of user ${userIdentifier}: throw new ApiError(
${response.status} ${response.statusText}`; response.status,
response.statusText,
"get",
`Failed to get roles of user ${userIdentifier}`,
url
);
} }
} catch (err) { } 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, userIdentifier: string | number,
roleIdentifier: string | number roleIdentifier: string | number
): Promise<void> { ): Promise<void> {
const userParam = buildIdentifierParam(userIdentifier);
const roleParam = buildIdentifierParam(roleIdentifier);
const url = `${this.#USERS_API_PREFIX}/${userParam}/roles/${roleParam}`;
try { try {
const userParam = buildIdentifierParam(userIdentifier); const response: ApiResponse = await this.#apiClient.put(url);
const roleParam = buildIdentifierParam(roleIdentifier);
const response: ApiResponse = await this.#apiClient.put(
`${this.#USERS_API_PREFIX}/${userParam}/roles/${roleParam}`
);
if (response.ok) { if (response.ok) {
return; return;
} else { } else {
throw `Failed to add role ${roleIdentifier} to throw new ApiError(
user ${userIdentifier}: response.status,
${response.status} ${response.statusText}`; response.statusText,
"put",
`Failed to add role ${roleIdentifier} to user ${userIdentifier}`,
url
);
} }
} catch (err) { } catch (err) {
throw `Failed to add role ${roleIdentifier} to if (err instanceof ApiError) {
user ${userIdentifier}: ${err}`; 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, userIdentifier: string | number,
roleIdentifier: string | number roleIdentifier: string | number
): Promise<void> { ): Promise<void> {
const userParam = buildIdentifierParam(userIdentifier);
const roleParam = buildIdentifierParam(roleIdentifier);
const url = `${this.#USERS_API_PREFIX}/${userParam}/roles/${roleParam}`;
try { try {
const userParam = buildIdentifierParam(userIdentifier); const response: ApiResponse = await this.#apiClient.delete(url);
const roleParam = buildIdentifierParam(roleIdentifier);
const response: ApiResponse = await this.#apiClient.delete(
`${this.#USERS_API_PREFIX}/${userParam}/roles/${roleParam}`
);
if (response.ok) { if (response.ok) {
return; return;
} else { } else {
throw `Failed to remove role ${roleIdentifier} from throw new ApiError(
user ${userIdentifier}: response.status,
${response.status} ${response.statusText}`; response.statusText,
"delete",
`Failed to remove role ${roleIdentifier} from user ${userIdentifier}`,
url
);
} }
} catch (err) { } catch (err) {
throw `Failed to remote role ${roleIdentifier} from if (err instanceof ApiError) {
user ${userIdentifier}: ${err}`; throw err;
} else {
throw new ApiClientError(
`Failed to remote role ${roleIdentifier} from user ${userIdentifier}: ${err}`
);
}
} }
} }
} }