From 1b8f00175c0f80a3b7eae3854f113bdcd253e2c3 Mon Sep 17 00:00:00 2001 From: Jens Pelzetter Date: Wed, 29 Jul 2020 18:12:56 +0200 Subject: [PATCH] Client for RESTful for Im/Export --- .../src/main/typescript/ApiClient.ts | 6 +- .../typescript/clients/configuration-api.ts | 2 - .../main/typescript/clients/imexport-api.ts | 85 +++++++++++++++++++ .../src/main/typescript/entities/imexport.ts | 19 +++++ 4 files changed, 107 insertions(+), 5 deletions(-) create mode 100644 ccm-core-apiclient/src/main/typescript/clients/imexport-api.ts create mode 100644 ccm-core-apiclient/src/main/typescript/entities/imexport.ts diff --git a/ccm-apiclient-commons/src/main/typescript/ApiClient.ts b/ccm-apiclient-commons/src/main/typescript/ApiClient.ts index 6055c99d1..b99830807 100644 --- a/ccm-apiclient-commons/src/main/typescript/ApiClient.ts +++ b/ccm-apiclient-commons/src/main/typescript/ApiClient.ts @@ -27,7 +27,7 @@ export interface LibreCcmApiClient { */ post( endpoint: string, - body: RequestBody, + body?: RequestBody, searchParams?: Record ): Promise; /** @@ -277,7 +277,7 @@ export class ApiClientFetchImpl implements LibreCcmApiClient { async post( endpoint: string, - body: RequestBody, + body?: RequestBody, searchParams?: Record ): Promise { const url = buildUrl(this.#baseUrl, endpoint, searchParams); @@ -562,7 +562,7 @@ export class ApiClientNodeImpl implements LibreCcmApiClient { post( endpoint: string, - body: ArrayBuffer, + body?: ArrayBuffer, searchParams?: Record ): Promise { return new Promise((resolve, reject) => { diff --git a/ccm-core-apiclient/src/main/typescript/clients/configuration-api.ts b/ccm-core-apiclient/src/main/typescript/clients/configuration-api.ts index 7e6a314e7..dec23b6dd 100644 --- a/ccm-core-apiclient/src/main/typescript/clients/configuration-api.ts +++ b/ccm-core-apiclient/src/main/typescript/clients/configuration-api.ts @@ -1,12 +1,10 @@ import { ApiResponse, LibreCcmApiClient, - ListView, } from "@libreccm/ccm-apiclient-commons"; import { ConfigurationInfo, - SettingInfo, buildConfigurationInfoFromRecord, } from "../entities/configuration"; diff --git a/ccm-core-apiclient/src/main/typescript/clients/imexport-api.ts b/ccm-core-apiclient/src/main/typescript/clients/imexport-api.ts new file mode 100644 index 000000000..4b6df6647 --- /dev/null +++ b/ccm-core-apiclient/src/main/typescript/clients/imexport-api.ts @@ -0,0 +1,85 @@ +import { + ApiResponse, + LibreCcmApiClient, +} from "@libreccm/ccm-apiclient-commons"; + +import { + ImportManifest, + buildImportManifestFromRecord, +} from "../entities/imexport"; + +import * as Constants from "../constants"; + +export class ImExportClient { + #apiClient: LibreCcmApiClient; + + readonly #IMEXPORT_API_PREFIX = `${Constants.ADMIN_API_PREFIX}/imexport`; + + constructor(apiClient: LibreCcmApiClient) { + this.#apiClient = apiClient; + } + + async listImports(): Promise { + try { + const response: ApiResponse = await this.#apiClient.get( + `${this.#IMEXPORT_API_PREFIX}/imports` + ); + + if (response.ok) { + const records: Record< + string, + unknown + >[] = (await response.json()) as Record[]; + + return records.map((record) => + buildImportManifestFromRecord(record) + ); + } else { + throw `Failed to list available import archives: + ${response.status} ${response.statusText}`; + } + } catch (err) { + throw `Failed to list available import archives: ${err}`; + } + } + + async importArchive(importName: string): Promise { + try { + const response: ApiResponse = await this.#apiClient.post( + `${this.#IMEXPORT_API_PREFIX}/imports/${importName}` + ); + + if (response.ok) { + return; + } else { + throw `Failed to import archive ${importName}: + ${response.status} ${response.statusText}`; + } + } catch (err) { + throw `Failed to import archive ${importName}: ${err}`; + } + } + + async exportEntities( + exportName: string, + entityIds: string[] + ): Promise { + try { + const response: ApiResponse = await this.#apiClient.post( + `${this.#IMEXPORT_API_PREFIX}/exports/${exportName}`, + JSON.stringify(entityIds) + ); + + if (response.ok) { + return; + } else { + throw `Failed to export entities + ${entityIds.join(", ")} as ${exportName}: + ${response.status} ${response.statusText}`; + } + } catch (err) { + throw `Failed to export entities + ${entityIds.join(", ")} as ${exportName}: ${err}`; + } + } +} diff --git a/ccm-core-apiclient/src/main/typescript/entities/imexport.ts b/ccm-core-apiclient/src/main/typescript/entities/imexport.ts new file mode 100644 index 000000000..03fe0f675 --- /dev/null +++ b/ccm-core-apiclient/src/main/typescript/entities/imexport.ts @@ -0,0 +1,19 @@ +import { assertProperties } from "@libreccm/ccm-apiclient-commons"; + +export interface ImportManifest { + created: Date; + onServer: string; + types: string[]; +} + +export function buildImportManifestFromRecord( + record: Record +): ImportManifest { + assertProperties(record, ["created", "onServer", "types"]); + + return { + created: new Date(record.created as string), + onServer: record.onServer as string, + types: record.types as string[] + } +}