From 102b984b5f9bb0bd97a1202e2f319da596d98ef4 Mon Sep 17 00:00:00 2001 From: Jens Pelzetter Date: Tue, 4 Aug 2020 18:08:37 +0200 Subject: [PATCH] First part of API client for managing application instances --- .../typescript/clients/applications-api.ts | 132 ++++++++++++++++++ .../src/main/typescript/clients/sites-api.ts | 2 +- .../src/main/typescript/clients/users-api.ts | 4 +- .../entities/{web.ts => applications.ts} | 0 4 files changed, 135 insertions(+), 3 deletions(-) create mode 100644 ccm-core-apiclient/src/main/typescript/clients/applications-api.ts rename ccm-core-apiclient/src/main/typescript/entities/{web.ts => applications.ts} (100%) diff --git a/ccm-core-apiclient/src/main/typescript/clients/applications-api.ts b/ccm-core-apiclient/src/main/typescript/clients/applications-api.ts new file mode 100644 index 000000000..f35b5a613 --- /dev/null +++ b/ccm-core-apiclient/src/main/typescript/clients/applications-api.ts @@ -0,0 +1,132 @@ +import { + ApiResponse, + LibreCcmApiClient, + ListView, + ApiError, +} from "@libreccm/ccm-apiclient-commons"; + +import { buildIdentifierParam } from "@libreccm/ccm-apiclient-commons"; + +import * as Constants from "../constants"; + +import { + CcmApplication, + buildCcmApplicationFromRecord, +} from "../entities/applications"; + +/** + * Client for managing application instances using the RESTful API of LibreCCM + */ +export class WebApiClient { + #apiClient: LibreCcmApiClient; + + readonly #APPS_API_PREFIX = `${Constants.ADMIN_API_PREFIX}/applications`; + + constructor(apiClient: LibreCcmApiClient) { + this.#apiClient = apiClient; + } + + async getAllApplications( + limit: number, + offset: number + ): Promise> { + try { + const response: ApiResponse = await this.#apiClient.get( + `${this.#APPS_API_PREFIX}`, + { + limit: limit.toString(), + offset: offset.toString(), + } + ); + + if (response.ok) { + const result: Record< + string, + unknown + > = (await response.json()) as Record; + const list: Record[] = result.list as Record< + string, + unknown + >[]; + const apps: CcmApplication[] = list.map((record) => + buildCcmApplicationFromRecord(record) + ); + + return { + list: apps, + count: result.count as number, + limit: result.limit as number, + offset: result.offset as number, + }; + } else { + throw `Failed to get application instances: + ${response.status} ${response.statusText}`; + } + } catch (err) { + throw `Failed to get application instances: ${err}`; + } + } + + async getApplication( + appIdentifier: string | number + ): Promise { + try { + const response: ApiResponse = await this.#apiClient.get( + `${this.#APPS_API_PREFIX}/${buildIdentifierParam( + appIdentifier + )}` + ); + if (response.ok) { + return buildCcmApplicationFromRecord( + (await response.json()) as Record + ); + } else { + throw `Failed to get application instance ${appIdentifier}: + ${response.status} ${response.statusText}`; + } + } catch (err) { + throw `Failed to get application instance ${appIdentifier}: ${err}`; + } + } + + async createApplication(application: CcmApplication): Promise { + try { + const response: ApiResponse = await this.#apiClient.post( + `${this.#APPS_API_PREFIX}`, + JSON.stringify(application) + ); + + if (response.ok) { + return; + } else { + throw `Failed to create new application instance of + type ${application.applicationType}: + ${response.status} ${response.statusText}`; + } + } catch (err) { + throw `Failed to create new application instance of + type ${application.applicationType}: ${err}`; + } + } + + async updateApplication( + appIdentifier: string, + application: CcmApplication): Promise { + try { + const response: ApiResponse = await this.#apiClient.put( + `${this.#APPS_API_PREFIX}/${buildIdentifierParam(appIdentifier)}`, + JSON.stringify(application) + ); + + if (response.ok) { + return; + } else { + throw `Failed to update pplication instance ${appIdentifier}: + ${response.status} ${response.statusText}`; + } + } catch (err) { + throw `Failed to update pplication instance ${appIdentifier}: + ${application.applicationType}: ${err}`; + } + } +} diff --git a/ccm-core-apiclient/src/main/typescript/clients/sites-api.ts b/ccm-core-apiclient/src/main/typescript/clients/sites-api.ts index 1115df386..d19b801d4 100644 --- a/ccm-core-apiclient/src/main/typescript/clients/sites-api.ts +++ b/ccm-core-apiclient/src/main/typescript/clients/sites-api.ts @@ -12,7 +12,7 @@ import { Site, buildSiteFromRecord } from "../entities/site"; import { CcmApplicationId, buildCcmApplicationIdFromRecord, -} from "../entities/web"; +} from "../entities/applications"; /** * Client for managing sites using the RESTful API 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 54a1a1e11..4549de455 100644 --- a/ccm-core-apiclient/src/main/typescript/clients/users-api.ts +++ b/ccm-core-apiclient/src/main/typescript/clients/users-api.ts @@ -135,11 +135,11 @@ export class UsersApiClient { if (response.ok) { return; } else { - throw `Failed to delete user ${name}: + throw `Failed to delete user ${userIdentifier}: ${response.status} ${response.statusText}`; } } catch (err) { - throw `Failed to delete user ${name}: ${err}`; + throw `Failed to delete user ${userIdentifier}: ${err}`; } } diff --git a/ccm-core-apiclient/src/main/typescript/entities/web.ts b/ccm-core-apiclient/src/main/typescript/entities/applications.ts similarity index 100% rename from ccm-core-apiclient/src/main/typescript/entities/web.ts rename to ccm-core-apiclient/src/main/typescript/entities/applications.ts