Use Error subclasses instead of throwing strings
parent
d0a881ec95
commit
2567bd1ee2
|
|
@ -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}`
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue