@eclipse-scout/core
Version:
Eclipse Scout runtime
140 lines (126 loc) • 4.42 kB
text/typescript
/*
* Copyright (c) 2010, 2025 BSI Business Systems Integration AG
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*/
import {InitModelOf, ObjectModel, ObjectWithType, scout} from '../scout';
import {SomeRequired} from '../types';
import {strings} from '../util/strings';
/**
* Represents a REST backend system.
*/
export class System implements SystemModel, ObjectWithType {
declare model: SystemModel;
declare initModel: SomeRequired<this['model'], 'name'>;
declare self: System;
objectType: string;
name: string;
baseUrl: string;
hasUiBackend: boolean;
protected _endpointUrls: Map<string, string>;
/**
* The default system name. It is configured to have a UI backend (see {@link setHasUiBackend}).
*/
static MAIN_SYSTEM = 'main';
constructor() {
this.name = null;
this.baseUrl = 'api';
this.hasUiBackend = false;
this._endpointUrls = new Map();
}
init(model: InitModelOf<this>) {
scout.assertParameter('name', model.name);
this.name = model.name;
this.hasUiBackend = scout.nvl(model.hasUiBackend, model.name === System.MAIN_SYSTEM);
this.baseUrl = scout.nvl(model.baseUrl, this.baseUrl);
if (model.endpointUrls) {
for (const [key, value] of Object.entries(model.endpointUrls)) {
if (value) {
this._endpointUrls.set(key, value);
}
}
}
}
/**
* Sets a new base URL. This is the (typically relative) URL under which all REST endpoints of this system are available.
* @param baseUrl The new base URL.
*/
setBaseUrl(baseUrl: string) {
this.baseUrl = baseUrl;
}
/**
* Specifies if this system has a Scout UI backend.
*/
setHasUiBackend(hasUiBackend: boolean) {
this.hasUiBackend = hasUiBackend;
}
/**
* Sets the URL relative to the base URL of this system for a named endpoint.
* @param endpointName The endpoint identifier for which the relative URL should be updated.
* @param endpointUrl The new endpoint url relative to the {@link baseUrl} of this system.
*/
setEndpointUrl(endpointName: string, endpointUrl: string) {
if (!endpointName) {
return;
}
if (endpointUrl) {
this._endpointUrls.set(endpointName, endpointUrl);
} else {
this._endpointUrls.delete(endpointName);
}
}
/**
* @returns the endpoints to load config properties.
*/
getConfigEndpointUrls(): string[] {
let urls = [];
let defaultBackendUrl = 'config-properties';
if (this.hasUiBackend) {
urls.push('res/config-properties.json');
defaultBackendUrl = null; // by default only fetch from UI server. Only use both if explicitly requested
}
let backendConfigResource = this.getEndpointUrl('config-properties', defaultBackendUrl);
if (backendConfigResource) {
urls.push(backendConfigResource);
}
return urls;
}
/**
* @returns The full URL including the {@link baseUrl} to the endpoint with given name. The result is always without trailing slash.
*/
getEndpointUrl(endpointName: string, defaultEndpoint?: string): string {
let customizedEndpointUrl = this._endpointUrls.get(endpointName);
let relEndpointUrl = customizedEndpointUrl || defaultEndpoint;
if (!relEndpointUrl) {
return null;
}
return this._concatPath(this.baseUrl, relEndpointUrl);
}
protected _concatPath(a: string, b: string): string {
a = strings.removeSuffix(a, '/');
b = strings.removeSuffix(strings.removePrefix(b, '/'), '/');
return strings.join('/', a, b);
}
}
export interface SystemModel extends ObjectModel<System> {
/**
* The name of the system. Default is {@link System.MAIN_SYSTEM}.
*/
name?: string;
/**
* The base URL of the system. This is the (typically relative) URL under which all REST endpoints of this system are available.
*/
baseUrl?: string;
/**
* Specifies if the system has a Scout UI server running. If {@code true} the {@link System.getConfigEndpointUrls} returns the path to the UI instead (config properties are loaded from the UI).
*/
hasUiBackend?: boolean;
/**
* A map with initial endpoint URLs. The key is the endpoint name, the value the system relative URL.
*/
endpointUrls?: Record<string, string>;
}