Started implementation of API client for ccm-core

Jens Pelzetter 2020-07-10 20:48:01 +02:00
parent 097412293f
commit 01444aa09e
18 changed files with 3718 additions and 0 deletions

View File

@ -0,0 +1,11 @@
module.exports = {
root: true,
parser: '@typescript-eslint/parser',
plugins: [
'@typescript-eslint',
],
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
],
};

View File

@ -0,0 +1,3 @@
dist
node_modules

View File

@ -0,0 +1,5 @@
LibreCCM API Client Commons
===========================
This module provides basic classes for building clients for the RESTful APIs
provided by modules of LibreCCM. Details can be found in the documentation.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,32 @@
{
"name": "@libreccm/ccm-apiclient-commons",
"version": "7.0.0",
"main": "target/dist/ccm-apiclient-commons.js",
"types": "dist/ccm-apiclient-commons.d.ts",
"description": "Client for the RESTful API provided by ccm-core.",
"repository": {
"type": "git",
"url": "https://github.com/libreccm/libreccm/ccm-apiclient-commons"
},
"author": "Jens Pelzetter",
"license": "GPL-3.0",
"scripts": {
"build": "tsc",
"check": "eslint",
"doc": "typedoc --out target/docs src/main/typescript"
},
"dependencies": {},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^3.6.0",
"@typescript-eslint/parser": "^3.6.0",
"eslint": "^7.4.0",
"typedoc": "^0.17.8",
"typescript": "^3.9.6"
},
"prettier": {
"trailingComma": "es5",
"tabWidth": 4,
"semi": true,
"singleQuote": false
}
}

View File

@ -0,0 +1,105 @@
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.libreccm</groupId>
<artifactId>libreccm-parent</artifactId>
<version>7.0.0-SNAPSHOT</version>
</parent>
<groupId>org.libreccm</groupId>
<artifactId>ccm-apiclient-commons</artifactId>
<version>7.0.0-SNAPSHOT</version>
<name>LibreCCM API Client Commons</name>
<description>Provides basic classes and common datatypes for RESTful API clients</description>
<url>https://www.libreccm.org/ccm-apiclient-commons</url>
<licenses>
<license>
<name>Lesser GPL 2.1</name>
<url>http://www.gnu.org/licenses/old-licenses/lgpl-2.1</url>
</license>
</licenses>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<finalName>ccm-apiclient-commons</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/typescript</directory>
</resource>
<resource>
<directory>${project.build.directory}/generated-resources</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>com.github.eirslett</groupId>
<artifactId>frontend-maven-plugin</artifactId>
<configuration>
<installDirectory>../node</installDirectory>
</configuration>
<executions>
<execution>
<id>Install node.js and NPM</id>
<goals>
<goal>install-node-and-npm</goal>
</goals>
<configuration>
<nodeVersion>v12.18.2</nodeVersion>
</configuration>
</execution>
<execution>
<id>npm install</id>
<goals>
<goal>npm</goal>
</goals>
<configuration>
<arguments>install</arguments>
</configuration>
</execution>
<execution>
<id>build</id>
<goals>
<goal>npm</goal>
</goals>
<configuration>
<arguments>run build</arguments>
</configuration>
</execution>
<execution>
<id>npm publish</id>
<goals>
<goal>npm</goal>
</goals>
<phase>deploy</phase>
<configuration>
<arguments>publish --userconfig ../libreccm.npmrc</arguments>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
</dependencies>
</project>

View File

@ -0,0 +1,28 @@
export interface RequestInitProvider {
buildRequestInit(): RequestInit;
}
export class EmbeddedRequestInitProvider implements RequestInitProvider {
buildRequestInit(): RequestInit {
return {
credentials: "include",
};
}
}
export class RemoteRequestInitProvider implements RequestInitProvider {
#jwt: string;
constructor(jwt: string) {
this.#jwt = jwt;
}
buildRequestInit(): RequestInit {
return {
credentials: "omit",
headers: {
authorization: this.#jwt,
},
};
}
}

View File

@ -0,0 +1,2 @@
export * from "./entities";
export * from "./RequestInitProvider";

View File

@ -0,0 +1,3 @@
export interface LocalizedString {
[language: string]: string;
}

View File

@ -0,0 +1,14 @@
{
"compilerOptions": {
"module": "es6",
"moduleResolution": "node",
"outDir": "dist",
"declaration": true,
"sourceMap": true,
"strict": true,
"target": "es6"
},
"include": [
"src/main/typescript/**/*"
]
}

View File

@ -0,0 +1,11 @@
module.exports = {
root: true,
parser: '@typescript-eslint/parser',
plugins: [
'@typescript-eslint',
],
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
],
};

4
ccm-core-apiclient/.gitignore vendored 100644
View File

@ -0,0 +1,4 @@
dist
node_modules
target

2136
ccm-core-apiclient/package-lock.json generated 100644

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,33 @@
{
"name": "@libreccm/ccm-core-apiclient",
"version": "7.0.0",
"main": "target/dist/ccm-core-apiclient.js",
"types": "target/dist/ccm-core-apiclient.d.ts",
"description": "Client for the RESTful API provided by ccm-core.",
"repository": {
"type": "git",
"url": "https://github.com/libreccm/libreccm"
},
"author": "Jens Pelzetter",
"license": "GPL-3.0",
"scripts": {
"build": "tsc",
"doc": "typedoc --out target/docs src/main/typescript"
},
"dependencies": {
"@libreccm/ccm-apiclient-commons": "file:../ccm-apiclient-commons"
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^3.6.0",
"@typescript-eslint/parser": "^3.6.0",
"eslint": "^7.4.0",
"typedoc": "^0.17.8",
"typescript": "^3.9.6"
},
"prettier": {
"trailingComma": "es5",
"tabWidth": 4,
"semi": true,
"singleQuote": false
}
}

View File

@ -0,0 +1,113 @@
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.libreccm</groupId>
<artifactId>libreccm-parent</artifactId>
<version>7.0.0-SNAPSHOT</version>
</parent>
<groupId>org.libreccm</groupId>
<artifactId>ccm-core-apiclient</artifactId>
<version>7.0.0-SNAPSHOT</version>
<name>LibreCCM RESTful Admin API Clients</name>
<url>https://www.libreccm.org/ccm-core/api</url>
<licenses>
<license>
<name>Lesser GPL 2.1</name>
<url>http://www.gnu.org/licenses/old-licenses/lgpl-2.1</url>
</license>
</licenses>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<finalName>ccm-core-apiclient</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/typescript</directory>
</resource>
<resource>
<directory>${project.build.directory}/generated-resources</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>com.github.eirslett</groupId>
<artifactId>frontend-maven-plugin</artifactId>
<configuration>
<installDirectory>../node</installDirectory>
</configuration>
<executions>
<execution>
<id>Install node.js and NPM</id>
<goals>
<goal>install-node-and-npm</goal>
</goals>
<configuration>
<nodeVersion>v12.18.2</nodeVersion>
</configuration>
</execution>
<execution>
<id>npm install ../ccm-apiclient-commons</id>
<goals>
<goal>npm</goal>
</goals>
<configuration>
<arguments>install ../ccm-apiclient-commons</arguments>
</configuration>
</execution>
<execution>
<id>npm install</id>
<goals>
<goal>npm</goal>
</goals>
<configuration>
<arguments>install</arguments>
</configuration>
</execution>
<execution>
<id>build</id>
<goals>
<goal>npm</goal>
</goals>
<configuration>
<arguments>run build</arguments>
</configuration>
</execution>
<execution>
<id>npm publish</id>
<goals>
<goal>npm</goal>
</goals>
<phase>deploy</phase>
<configuration>
<arguments>publish --userconfig ../libreccm.npmrc</arguments>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
</dependencies>
</project>

View File

@ -0,0 +1,46 @@
import { RequestInitProvider} from "@libreccm/ccm-apiclient-commons";
import { Category } from "./entities/categorization";
// interface RequestInitProvider {
// buildRequestInit(): RequestInit;
// }
// export class CcmCoreAdminApiClient {
// libreCcmHost: string;
// jwt: string;
// constructor(libreCcmHost: string, jwt: string) {
// this.libreCcmHost = libreCcmHost;
// this.jwt = jwt;
// }
// jwtRequired(): boolean {
// const documentUrl = new URL(document.documentURI);
// return documentUrl.host != this.libreCcmHost;
// }
// }
export class CategorizationApiClient {
#requestInitProvider: RequestInitProvider;
constructor(requestInitProvider: RequestInitProvider) {
this.#requestInitProvider = requestInitProvider;
}
async getCategory(domain: string, path: string): Promise<Category> {
const fetchInit = this.#requestInitProvider.buildRequestInit();
fetchInit.method = "GET";
try {
const result = await fetch("localhost:8080", fetchInit);
if (result.ok) {
const category: Category = await result.json();
return category;
} else {
throw new Error(`Failed to get category ${path} of domain ${domain}: ${result.status} ${result.statusText}`);
}
} catch(err) {
throw new Error(`Failed to get category ${path} of domain ${domain}: ${err}`);
}
}
}

View File

@ -0,0 +1,20 @@
import { LocalizedString } from "@libreccm/ccm-apiclient-commons";
export interface AssociatedCategory {
name: string;
title: LocalizedString;
description: LocalizedString;
}
export interface Category {
categoryId: number;
uuid: string;
uniqueId: string;
name: string;
title: LocalizedString;
description: LocalizedString;
enabled: boolean;
abstractCategory: boolean;
parentCategory: AssociatedCategory;
categoryOrder: number;
}

View File

@ -0,0 +1,14 @@
{
"compilerOptions": {
"module": "es6",
"moduleResolution": "node",
"outDir": "target/dist",
"declaration": true,
"sourceMap": true,
"strict": true,
"target": "es6"
},
"include": [
"src/main/typescript/**/*"
]
}