From 9424f35c2d91dc6a5cc4c5c8460b3cf733ed3eb5 Mon Sep 17 00:00:00 2001 From: Jens Pelzetter Date: Mon, 27 Jul 2020 21:05:38 +0200 Subject: [PATCH] Configuration API, some general improvments for API client Former-commit-id: 0b621bf7b4701cf496f30ac60ffb2e28407598ef --- .../src/main/typescript/ApiClient.ts | 6 +- .../typescript/clients/categorization-api.ts | 43 ++++++++-- .../typescript/clients/configuration-api.ts | 47 +++++++++++ .../main/typescript/entities/configuration.ts | 82 ++++++++++++++++--- 4 files changed, 154 insertions(+), 24 deletions(-) create mode 100644 ccm-core-apiclient/src/main/typescript/clients/configuration-api.ts diff --git a/ccm-apiclient-commons/src/main/typescript/ApiClient.ts b/ccm-apiclient-commons/src/main/typescript/ApiClient.ts index aced00593..6055c99d1 100644 --- a/ccm-apiclient-commons/src/main/typescript/ApiClient.ts +++ b/ccm-apiclient-commons/src/main/typescript/ApiClient.ts @@ -99,7 +99,7 @@ export interface ApiResponse { /** * Gets the Response Body as JSON. */ - json(): Promise>; + json(): Promise; /** * Gets the Response Body as ArrayBuffer. */ @@ -194,7 +194,7 @@ class FetchResponse implements ApiResponse { this.#response = response; } - json(): Promise> { + json(): Promise { return this.#response.json(); } @@ -449,7 +449,7 @@ class NodeResponse implements ApiResponse { this.#data = data; } - json(): Promise> { + json(): Promise { return new Promise((resolve, reject) => { try { if (this.#data) { diff --git a/ccm-core-apiclient/src/main/typescript/clients/categorization-api.ts b/ccm-core-apiclient/src/main/typescript/clients/categorization-api.ts index dcd561934..c7ed2e4a7 100644 --- a/ccm-core-apiclient/src/main/typescript/clients/categorization-api.ts +++ b/ccm-core-apiclient/src/main/typescript/clients/categorization-api.ts @@ -10,6 +10,7 @@ import { buildCategoryFromRecord, buildCategorizationFromRecord, } from "../entities/categorization"; + import * as Constants from "../constants"; export class CategorizationApiClient { @@ -31,7 +32,9 @@ export class CategorizationApiClient { ); if (response.ok) { - return buildCategoryFromRecord(await response.json()); + return buildCategoryFromRecord( + (await response.json()) as Record + ); } else { throw `Failed to get category ${path} of domain ${domain}: ${response.status} ${response.statusText}`; @@ -48,7 +51,9 @@ export class CategorizationApiClient { ); if (response.ok) { - return buildCategoryFromRecord(await response.json()); + return buildCategoryFromRecord( + (await response.json()) as Record + ); } else { throw `Failed to get category with ID ${categoryId}: ${response.status} ${response.statusText}`; @@ -65,7 +70,9 @@ export class CategorizationApiClient { ); if (response.ok) { - return buildCategoryFromRecord(await response.json()); + return buildCategoryFromRecord( + (await response.json()) as Record + ); } else { throw `Failed to get category with UUID ${uuid}: ${response.status} ${response.statusText}`; @@ -204,7 +211,10 @@ export class CategorizationApiClient { ); if (response.ok) { - const result: Record = await response.json(); + const result: Record< + string, + unknown + > = (await response.json()) as Record; const list: Record[] = result.list as Record< string, unknown @@ -242,7 +252,10 @@ export class CategorizationApiClient { ); if (response.ok) { - const result: Record = await response.json(); + const result: Record< + string, + unknown + > = (await response.json()) as Record; const list: Record[] = result.list as Record< string, unknown @@ -280,7 +293,10 @@ export class CategorizationApiClient { ); if (response.ok) { - const result: Record = await response.json(); + const result: Record< + string, + unknown + > = (await response.json()) as Record; const list: Record[] = result.list as Record< string, unknown @@ -399,7 +415,10 @@ export class CategorizationApiClient { ); if (response.ok) { - const result: Record = await response.json(); + const result: Record< + string, + unknown + > = (await response.json()) as Record; const list: Record[] = result.list as Record< string, unknown @@ -437,7 +456,10 @@ export class CategorizationApiClient { ); if (response.ok) { - const result: Record = await response.json(); + const result: Record< + string, + unknown + > = (await response.json()) as Record; const list: Record[] = result.list as Record< string, unknown @@ -475,7 +497,10 @@ export class CategorizationApiClient { ); if (response.ok) { - const result: Record = await response.json(); + const result: Record< + string, + unknown + > = (await response.json()) as Record; const list: Record[] = result.list as Record< string, unknown diff --git a/ccm-core-apiclient/src/main/typescript/clients/configuration-api.ts b/ccm-core-apiclient/src/main/typescript/clients/configuration-api.ts new file mode 100644 index 000000000..4c3268ecd --- /dev/null +++ b/ccm-core-apiclient/src/main/typescript/clients/configuration-api.ts @@ -0,0 +1,47 @@ +import { + ApiResponse, + LibreCcmApiClient, + ListView, +} from "@libreccm/ccm-apiclient-commons"; + +import { + ConfigurationInfo, + SettingInfo, + buildConfigurationInfoFromRecord, +} from "../entities/configuration"; + +import * as Constants from "../constants"; + +export class ConfigurationApiClient { + #apiClient: LibreCcmApiClient; + + readonly #CONFIGURATION_API_PREFIX = `${Constants.ADMIN_API_PREFIX}/configurations`; + + constructor(apiClient: LibreCcmApiClient) { + this.#apiClient = apiClient; + } + + async getConfigurations(): Promise { + try { + const response: ApiResponse = await this.#apiClient.get( + `${this.#CONFIGURATION_API_PREFIX}/` + ); + + if (response.ok) { + const result: Record< + string, + unknown + >[] = (await response.json()) as Record[]; + + return result.map((record) => + buildConfigurationInfoFromRecord(record) + ); + } else { + throw `Failed to retrieve configuration info: + ${response.status} ${response.statusText}`; + } + } catch (err) { + throw `Failed to retrieve configuration info: ${err}`; + } + } +} diff --git a/ccm-core-apiclient/src/main/typescript/entities/configuration.ts b/ccm-core-apiclient/src/main/typescript/entities/configuration.ts index f01dbafab..d9c97ab65 100644 --- a/ccm-core-apiclient/src/main/typescript/entities/configuration.ts +++ b/ccm-core-apiclient/src/main/typescript/entities/configuration.ts @@ -1,16 +1,74 @@ +import { assertProperties } from "@libreccm/ccm-apiclient-commons"; + export interface ConfigurationInfo { - name: string, - descBundle: string, - titleKey: string, - settings: Record + name: string; + descBundle: string; + titleKey: string; + descKey: string; + settings: Record; } export interface SettingInfo { - name: string, - valueType: string, - defaultValue: string, - confClass: string, - descBundle: string, - labelKey: string, - descKey: string -} \ No newline at end of file + name: string; + valueType: string; + defaultValue: string; + confClass: string; + descBundle: string; + labelKey: string; + descKey: string; +} + +export function buildConfigurationInfoFromRecord( + record: Record +): ConfigurationInfo { + assertProperties(record, [ + "name", + "descBundle", + "titleKey", + "descKey", + "settings", + ]); + + const settingRecords: Record< + string, + Record + >[] = record.settings as Record>[]; + + const settings: Record = {}; + + for (const key in settingRecords) { + settings[key] = buildSettingInfoFromRecord(settingRecords[key]); + } + + return { + name: record.name as string, + descBundle: record.descBundle as string, + titleKey: record.titleKey as string, + descKey: record.descKey as string, + settings, + }; +} + +export function buildSettingInfoFromRecord( + record: Record +): SettingInfo { + assertProperties(record, [ + "name", + "valueType", + "defaultValue", + "confClass", + "descBundle", + "labelKey", + "descKey", + ]); + + return { + name: record.name as string, + valueType: record.valueType as string, + defaultValue: record.defaultValue as string, + confClass: record.confClass as string, + descBundle: record.descBundle as string, + labelKey: record.labelKey as string, + descKey: record.descKey as string, + }; +}