+ If you see this text, then you have not configured welcome-page for the base URL of your portal
+
+
Portal: {{(portal$ | async )?.portalName}} base url: {{(portal$ | async)?.baseUrl}}
\ No newline at end of file
diff --git a/src/app/shared/components/home/home.component.spec.ts b/src/app/shared/components/home/home.component.spec.ts
new file mode 100644
index 0000000..695c7f9
--- /dev/null
+++ b/src/app/shared/components/home/home.component.spec.ts
@@ -0,0 +1,34 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { ConfigurationService } from '@onecx/portal-integration-angular';
+import { HomeComponent } from './home.component';
+
+describe('HomeComponent', () => {
+ let component: HomeComponent;
+ let fixture: ComponentFixture;
+ const mockConfigurationService = {
+ getPortal: jest.fn(() => {
+ return { id: 'id1', portalName: 'PortalName' };
+ }),
+ };
+ beforeEach(async () => {
+ TestBed.configureTestingModule({
+ declarations: [HomeComponent],
+ providers: [
+ {
+ provide: ConfigurationService,
+ useValue: mockConfigurationService,
+ },
+ ],
+ }).compileComponents();
+ });
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(HomeComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/shared/components/home/home.component.ts b/src/app/shared/components/home/home.component.ts
new file mode 100644
index 0000000..7857b1e
--- /dev/null
+++ b/src/app/shared/components/home/home.component.ts
@@ -0,0 +1,16 @@
+import { Component } from '@angular/core';
+import { AppStateService, Portal } from '@onecx/portal-integration-angular';
+import { map, Observable } from 'rxjs';
+@Component({
+ selector: 'onecx-home',
+ templateUrl: './home.component.html',
+})
+export class HomeComponent {
+ portal$: Observable;
+
+ constructor(private appStateService: AppStateService) {
+ this.portal$ = this.appStateService.currentPortal$.pipe(
+ map((currentPortal) => currentPortal)
+ );
+ }
+}
diff --git a/src/app/shared/generated/.gitignore b/src/app/shared/generated/.gitignore
new file mode 100644
index 0000000..149b576
--- /dev/null
+++ b/src/app/shared/generated/.gitignore
@@ -0,0 +1,4 @@
+wwwroot/*.js
+node_modules
+typings
+dist
diff --git a/src/app/shared/generated/.openapi-generator-ignore b/src/app/shared/generated/.openapi-generator-ignore
new file mode 100644
index 0000000..7484ee5
--- /dev/null
+++ b/src/app/shared/generated/.openapi-generator-ignore
@@ -0,0 +1,23 @@
+# OpenAPI Generator Ignore
+# Generated by openapi-generator https://github.com/openapitools/openapi-generator
+
+# Use this file to prevent files from being overwritten by the generator.
+# The patterns follow closely to .gitignore or .dockerignore.
+
+# As an example, the C# client generator defines ApiClient.cs.
+# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line:
+#ApiClient.cs
+
+# You can match any string of characters against a directory, file or extension with a single asterisk (*):
+#foo/*/qux
+# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux
+
+# You can recursively match patterns against a directory, file or extension with a double asterisk (**):
+#foo/**/qux
+# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux
+
+# You can also negate patterns with an exclamation (!).
+# For example, you can ignore all files in a docs folder with the file extension .md:
+#docs/*.md
+# Then explicitly reverse the ignore rule for a single file:
+#!docs/README.md
diff --git a/src/app/shared/generated/.openapi-generator/FILES b/src/app/shared/generated/.openapi-generator/FILES
new file mode 100644
index 0000000..9276d0b
--- /dev/null
+++ b/src/app/shared/generated/.openapi-generator/FILES
@@ -0,0 +1,39 @@
+.gitignore
+README.md
+api.module.ts
+api/api.ts
+api/permission.service.ts
+api/userProfile.service.ts
+api/workspaceConfig.service.ts
+configuration.ts
+encoder.ts
+git_push.sh
+index.ts
+model/accountSettings.ts
+model/colorScheme.ts
+model/getPermissionsRequest.ts
+model/getPermissionsResponse.ts
+model/getUserProfileResponse.ts
+model/getWorkspaceConfigRequest.ts
+model/getWorkspaceConfigResponse.ts
+model/layoutAndThemeSettings.ts
+model/localeAndTimeSettings.ts
+model/menuMode.ts
+model/models.ts
+model/pathMatch.ts
+model/phoneType.ts
+model/problemDetailInvalidParam.ts
+model/problemDetailParam.ts
+model/problemDetailResponse.ts
+model/remoteComponent.ts
+model/remoteComponentMapping.ts
+model/route.ts
+model/technologies.ts
+model/theme.ts
+model/userPerson.ts
+model/userPersonAddress.ts
+model/userPersonPhone.ts
+model/userProfile.ts
+model/workspace.ts
+param.ts
+variables.ts
diff --git a/src/app/shared/generated/.openapi-generator/VERSION b/src/app/shared/generated/.openapi-generator/VERSION
new file mode 100644
index 0000000..4b49d9b
--- /dev/null
+++ b/src/app/shared/generated/.openapi-generator/VERSION
@@ -0,0 +1 @@
+7.2.0
\ No newline at end of file
diff --git a/src/app/shared/generated/README.md b/src/app/shared/generated/README.md
new file mode 100644
index 0000000..de16f95
--- /dev/null
+++ b/src/app/shared/generated/README.md
@@ -0,0 +1,226 @@
+## @
+
+### Building
+
+To install the required dependencies and to build the typescript sources run:
+```
+npm install
+npm run build
+```
+
+### publishing
+
+First build the package then run ```npm publish dist``` (don't forget to specify the `dist` folder!)
+
+### consuming
+
+Navigate to the folder of your consuming project and run one of next commands.
+
+_published:_
+
+```
+npm install @ --save
+```
+
+_without publishing (not recommended):_
+
+```
+npm install PATH_TO_GENERATED_PACKAGE/dist.tgz --save
+```
+
+_It's important to take the tgz file, otherwise you'll get trouble with links on windows_
+
+_using `npm link`:_
+
+In PATH_TO_GENERATED_PACKAGE/dist:
+```
+npm link
+```
+
+In your project:
+```
+npm link
+```
+
+__Note for Windows users:__ The Angular CLI has troubles to use linked npm packages.
+Please refer to this issue https://github.com/angular/angular-cli/issues/8284 for a solution / workaround.
+Published packages are not effected by this issue.
+
+
+#### General usage
+
+In your Angular project:
+
+
+```
+// without configuring providers
+import { ApiModule } from '';
+import { HttpClientModule } from '@angular/common/http';
+
+@NgModule({
+ imports: [
+ ApiModule,
+ // make sure to import the HttpClientModule in the AppModule only,
+ // see https://github.com/angular/angular/issues/20575
+ HttpClientModule
+ ],
+ declarations: [ AppComponent ],
+ providers: [],
+ bootstrap: [ AppComponent ]
+})
+export class AppModule {}
+```
+
+```
+// configuring providers
+import { ApiModule, Configuration, ConfigurationParameters } from '';
+
+export function apiConfigFactory (): Configuration {
+ const params: ConfigurationParameters = {
+ // set configuration parameters here.
+ }
+ return new Configuration(params);
+}
+
+@NgModule({
+ imports: [ ApiModule.forRoot(apiConfigFactory) ],
+ declarations: [ AppComponent ],
+ providers: [],
+ bootstrap: [ AppComponent ]
+})
+export class AppModule {}
+```
+
+```
+// configuring providers with an authentication service that manages your access tokens
+import { ApiModule, Configuration } from '';
+
+@NgModule({
+ imports: [ ApiModule ],
+ declarations: [ AppComponent ],
+ providers: [
+ {
+ provide: Configuration,
+ useFactory: (authService: AuthService) => new Configuration(
+ {
+ basePath: environment.apiUrl,
+ accessToken: authService.getAccessToken.bind(authService)
+ }
+ ),
+ deps: [AuthService],
+ multi: false
+ }
+ ],
+ bootstrap: [ AppComponent ]
+})
+export class AppModule {}
+```
+
+```
+import { DefaultApi } from '';
+
+export class AppComponent {
+ constructor(private apiGateway: DefaultApi) { }
+}
+```
+
+Note: The ApiModule is restricted to being instantiated once app wide.
+This is to ensure that all services are treated as singletons.
+
+#### Using multiple OpenAPI files / APIs / ApiModules
+In order to use multiple `ApiModules` generated from different OpenAPI files,
+you can create an alias name when importing the modules
+in order to avoid naming conflicts:
+```
+import { ApiModule } from 'my-api-path';
+import { ApiModule as OtherApiModule } from 'my-other-api-path';
+import { HttpClientModule } from '@angular/common/http';
+
+@NgModule({
+ imports: [
+ ApiModule,
+ OtherApiModule,
+ // make sure to import the HttpClientModule in the AppModule only,
+ // see https://github.com/angular/angular/issues/20575
+ HttpClientModule
+ ]
+})
+export class AppModule {
+
+}
+```
+
+
+### Set service base path
+If different than the generated base path, during app bootstrap, you can provide the base path to your service.
+
+```
+import { BASE_PATH } from '';
+
+bootstrap(AppComponent, [
+ { provide: BASE_PATH, useValue: 'https://your-web-service.com' },
+]);
+```
+or
+
+```
+import { BASE_PATH } from '';
+
+@NgModule({
+ imports: [],
+ declarations: [ AppComponent ],
+ providers: [ provide: BASE_PATH, useValue: 'https://your-web-service.com' ],
+ bootstrap: [ AppComponent ]
+})
+export class AppModule {}
+```
+
+
+#### Using @angular/cli
+First extend your `src/environments/*.ts` files by adding the corresponding base path:
+
+```
+export const environment = {
+ production: false,
+ API_BASE_PATH: 'http://127.0.0.1:8080'
+};
+```
+
+In the src/app/app.module.ts:
+```
+import { BASE_PATH } from '';
+import { environment } from '../environments/environment';
+
+@NgModule({
+ declarations: [
+ AppComponent
+ ],
+ imports: [ ],
+ providers: [{ provide: BASE_PATH, useValue: environment.API_BASE_PATH }],
+ bootstrap: [ AppComponent ]
+})
+export class AppModule { }
+```
+
+### Customizing path parameter encoding
+
+Without further customization, only [path-parameters][parameter-locations-url] of [style][style-values-url] 'simple'
+and Dates for format 'date-time' are encoded correctly.
+
+Other styles (e.g. "matrix") are not that easy to encode
+and thus are best delegated to other libraries (e.g.: [@honoluluhenk/http-param-expander]).
+
+To implement your own parameter encoding (or call another library),
+pass an arrow-function or method-reference to the `encodeParam` property of the Configuration-object
+(see [General Usage](#general-usage) above).
+
+Example value for use in your Configuration-Provider:
+```typescript
+new Configuration({
+ encodeParam: (param: Param) => myFancyParamEncoder(param),
+})
+```
+
+[parameter-locations-url]: https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#parameter-locations
+[style-values-url]: https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#style-values
+[@honoluluhenk/http-param-expander]: https://www.npmjs.com/package/@honoluluhenk/http-param-expander
diff --git a/src/app/shared/generated/api.module.ts b/src/app/shared/generated/api.module.ts
new file mode 100644
index 0000000..58d341f
--- /dev/null
+++ b/src/app/shared/generated/api.module.ts
@@ -0,0 +1,30 @@
+import { NgModule, ModuleWithProviders, SkipSelf, Optional } from '@angular/core';
+import { Configuration } from './configuration';
+import { HttpClient } from '@angular/common/http';
+
+
+@NgModule({
+ imports: [],
+ declarations: [],
+ exports: [],
+ providers: []
+})
+export class ApiModule {
+ public static forRoot(configurationFactory: () => Configuration): ModuleWithProviders {
+ return {
+ ngModule: ApiModule,
+ providers: [ { provide: Configuration, useFactory: configurationFactory } ]
+ };
+ }
+
+ constructor( @Optional() @SkipSelf() parentModule: ApiModule,
+ @Optional() http: HttpClient) {
+ if (parentModule) {
+ throw new Error('ApiModule is already loaded. Import in your base AppModule only.');
+ }
+ if (!http) {
+ throw new Error('You need to import the HttpClientModule in your AppModule! \n' +
+ 'See also https://github.com/angular/angular/issues/20575');
+ }
+ }
+}
diff --git a/src/app/shared/generated/api/api.ts b/src/app/shared/generated/api/api.ts
new file mode 100644
index 0000000..5624a5d
--- /dev/null
+++ b/src/app/shared/generated/api/api.ts
@@ -0,0 +1,7 @@
+export * from './permission.service';
+import { PermissionBffService } from './permission.service';
+export * from './userProfile.service';
+import { UserProfileBffService } from './userProfile.service';
+export * from './workspaceConfig.service';
+import { WorkspaceConfigBffService } from './workspaceConfig.service';
+export const APIS = [PermissionBffService, UserProfileBffService, WorkspaceConfigBffService];
diff --git a/src/app/shared/generated/api/components.service.ts b/src/app/shared/generated/api/components.service.ts
new file mode 100644
index 0000000..b50c20a
--- /dev/null
+++ b/src/app/shared/generated/api/components.service.ts
@@ -0,0 +1,158 @@
+/**
+ * Generated API
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+/* tslint:disable:no-unused-variable member-ordering */
+
+import { Inject, Injectable, Optional } from '@angular/core';
+import { HttpClient, HttpHeaders, HttpParams,
+ HttpResponse, HttpEvent, HttpParameterCodec, HttpContext
+ } from '@angular/common/http';
+import { CustomHttpParameterCodec } from '../encoder';
+import { Observable } from 'rxjs';
+
+// @ts-ignore
+import { GetComponentsByUrlResponse } from '../model/getComponentsByUrlResponse';
+
+// @ts-ignore
+import { BASE_PATH, COLLECTION_FORMATS } from '../variables';
+import { Configuration } from '../configuration';
+
+
+
+@Injectable({
+ providedIn: 'any'
+})
+export class ComponentsBffService {
+
+ protected basePath = 'http://localhost';
+ public defaultHeaders = new HttpHeaders();
+ public configuration = new Configuration();
+ public encoder: HttpParameterCodec;
+
+ constructor(protected httpClient: HttpClient, @Optional()@Inject(BASE_PATH) basePath: string|string[], @Optional() configuration: Configuration) {
+ if (configuration) {
+ this.configuration = configuration;
+ }
+ if (typeof this.configuration.basePath !== 'string') {
+ if (Array.isArray(basePath) && basePath.length > 0) {
+ basePath = basePath[0];
+ }
+
+ if (typeof basePath !== 'string') {
+ basePath = this.basePath;
+ }
+ this.configuration.basePath = basePath;
+ }
+ this.encoder = this.configuration.encoder || new CustomHttpParameterCodec();
+ }
+
+
+ // @ts-ignore
+ private addToHttpParams(httpParams: HttpParams, value: any, key?: string): HttpParams {
+ if (typeof value === "object" && value instanceof Date === false) {
+ httpParams = this.addToHttpParamsRecursive(httpParams, value);
+ } else {
+ httpParams = this.addToHttpParamsRecursive(httpParams, value, key);
+ }
+ return httpParams;
+ }
+
+ private addToHttpParamsRecursive(httpParams: HttpParams, value?: any, key?: string): HttpParams {
+ if (value == null) {
+ return httpParams;
+ }
+
+ if (typeof value === "object") {
+ if (Array.isArray(value)) {
+ (value as any[]).forEach( elem => httpParams = this.addToHttpParamsRecursive(httpParams, elem, key));
+ } else if (value instanceof Date) {
+ if (key != null) {
+ httpParams = httpParams.append(key, (value as Date).toISOString().substring(0, 10));
+ } else {
+ throw Error("key may not be null if value is Date");
+ }
+ } else {
+ Object.keys(value).forEach( k => httpParams = this.addToHttpParamsRecursive(
+ httpParams, value[k], key != null ? `${key}.${k}` : k));
+ }
+ } else if (key != null) {
+ httpParams = httpParams.append(key, value);
+ } else {
+ throw Error("key may not be null if value is not object or array");
+ }
+ return httpParams;
+ }
+
+ /**
+ * @param url
+ * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+ * @param reportProgress flag to report request and response progress.
+ */
+ public getComponentsByUrl(url: string, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable;
+ public getComponentsByUrl(url: string, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>;
+ public getComponentsByUrl(url: string, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>;
+ public getComponentsByUrl(url: string, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable {
+ if (url === null || url === undefined) {
+ throw new Error('Required parameter url was null or undefined when calling getComponentsByUrl.');
+ }
+
+ let localVarQueryParameters = new HttpParams({encoder: this.encoder});
+ if (url !== undefined && url !== null) {
+ localVarQueryParameters = this.addToHttpParams(localVarQueryParameters,
+ url, 'url');
+ }
+
+ let localVarHeaders = this.defaultHeaders;
+
+ let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept;
+ if (localVarHttpHeaderAcceptSelected === undefined) {
+ // to determine the Accept header
+ const httpHeaderAccepts: string[] = [
+ 'application/json'
+ ];
+ localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+ }
+ if (localVarHttpHeaderAcceptSelected !== undefined) {
+ localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
+ }
+
+ let localVarHttpContext: HttpContext | undefined = options && options.context;
+ if (localVarHttpContext === undefined) {
+ localVarHttpContext = new HttpContext();
+ }
+
+
+ let responseType_: 'text' | 'json' | 'blob' = 'json';
+ if (localVarHttpHeaderAcceptSelected) {
+ if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
+ responseType_ = 'text';
+ } else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
+ responseType_ = 'json';
+ } else {
+ responseType_ = 'blob';
+ }
+ }
+
+ let localVarPath = `/components`;
+ return this.httpClient.request('get', `${this.configuration.basePath}${localVarPath}`,
+ {
+ context: localVarHttpContext,
+ params: localVarQueryParameters,
+ responseType: responseType_,
+ withCredentials: this.configuration.withCredentials,
+ headers: localVarHeaders,
+ observe: observe,
+ reportProgress: reportProgress
+ }
+ );
+ }
+
+}
diff --git a/src/app/shared/generated/api/permission.service.ts b/src/app/shared/generated/api/permission.service.ts
new file mode 100644
index 0000000..0d7079e
--- /dev/null
+++ b/src/app/shared/generated/api/permission.service.ts
@@ -0,0 +1,165 @@
+/**
+ * onecx-shell-bff
+ * OneCx shell Bff
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+/* tslint:disable:no-unused-variable member-ordering */
+
+import { Inject, Injectable, Optional } from '@angular/core';
+import { HttpClient, HttpHeaders, HttpParams,
+ HttpResponse, HttpEvent, HttpParameterCodec, HttpContext
+ } from '@angular/common/http';
+import { CustomHttpParameterCodec } from '../encoder';
+import { Observable } from 'rxjs';
+
+// @ts-ignore
+import { GetPermissionsRequest } from '../model/getPermissionsRequest';
+// @ts-ignore
+import { GetPermissionsResponse } from '../model/getPermissionsResponse';
+// @ts-ignore
+import { ProblemDetailResponse } from '../model/problemDetailResponse';
+
+// @ts-ignore
+import { BASE_PATH, COLLECTION_FORMATS } from '../variables';
+import { Configuration } from '../configuration';
+
+
+
+@Injectable({
+ providedIn: 'any'
+})
+export class PermissionBffService {
+
+ protected basePath = 'http://onecx-shell-bff:8080';
+ public defaultHeaders = new HttpHeaders();
+ public configuration = new Configuration();
+ public encoder: HttpParameterCodec;
+
+ constructor(protected httpClient: HttpClient, @Optional()@Inject(BASE_PATH) basePath: string|string[], @Optional() configuration: Configuration) {
+ if (configuration) {
+ this.configuration = configuration;
+ }
+ if (typeof this.configuration.basePath !== 'string') {
+ if (Array.isArray(basePath) && basePath.length > 0) {
+ basePath = basePath[0];
+ }
+
+ if (typeof basePath !== 'string') {
+ basePath = this.basePath;
+ }
+ this.configuration.basePath = basePath;
+ }
+ this.encoder = this.configuration.encoder || new CustomHttpParameterCodec();
+ }
+
+
+ // @ts-ignore
+ private addToHttpParams(httpParams: HttpParams, value: any, key?: string): HttpParams {
+ if (typeof value === "object" && value instanceof Date === false) {
+ httpParams = this.addToHttpParamsRecursive(httpParams, value);
+ } else {
+ httpParams = this.addToHttpParamsRecursive(httpParams, value, key);
+ }
+ return httpParams;
+ }
+
+ private addToHttpParamsRecursive(httpParams: HttpParams, value?: any, key?: string): HttpParams {
+ if (value == null) {
+ return httpParams;
+ }
+
+ if (typeof value === "object") {
+ if (Array.isArray(value)) {
+ (value as any[]).forEach( elem => httpParams = this.addToHttpParamsRecursive(httpParams, elem, key));
+ } else if (value instanceof Date) {
+ if (key != null) {
+ httpParams = httpParams.append(key, (value as Date).toISOString().substring(0, 10));
+ } else {
+ throw Error("key may not be null if value is Date");
+ }
+ } else {
+ Object.keys(value).forEach( k => httpParams = this.addToHttpParamsRecursive(
+ httpParams, value[k], key != null ? `${key}.${k}` : k));
+ }
+ } else if (key != null) {
+ httpParams = httpParams.append(key, value);
+ } else {
+ throw Error("key may not be null if value is not object or array");
+ }
+ return httpParams;
+ }
+
+ /**
+ * @param getPermissionsRequest
+ * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+ * @param reportProgress flag to report request and response progress.
+ */
+ public getPermissions(getPermissionsRequest: GetPermissionsRequest, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable;
+ public getPermissions(getPermissionsRequest: GetPermissionsRequest, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>;
+ public getPermissions(getPermissionsRequest: GetPermissionsRequest, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>;
+ public getPermissions(getPermissionsRequest: GetPermissionsRequest, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable {
+ if (getPermissionsRequest === null || getPermissionsRequest === undefined) {
+ throw new Error('Required parameter getPermissionsRequest was null or undefined when calling getPermissions.');
+ }
+
+ let localVarHeaders = this.defaultHeaders;
+
+ let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept;
+ if (localVarHttpHeaderAcceptSelected === undefined) {
+ // to determine the Accept header
+ const httpHeaderAccepts: string[] = [
+ 'application/json'
+ ];
+ localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+ }
+ if (localVarHttpHeaderAcceptSelected !== undefined) {
+ localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
+ }
+
+ let localVarHttpContext: HttpContext | undefined = options && options.context;
+ if (localVarHttpContext === undefined) {
+ localVarHttpContext = new HttpContext();
+ }
+
+
+ // to determine the Content-Type header
+ const consumes: string[] = [
+ 'application/json'
+ ];
+ const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes);
+ if (httpContentTypeSelected !== undefined) {
+ localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
+ }
+
+ let responseType_: 'text' | 'json' | 'blob' = 'json';
+ if (localVarHttpHeaderAcceptSelected) {
+ if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
+ responseType_ = 'text';
+ } else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
+ responseType_ = 'json';
+ } else {
+ responseType_ = 'blob';
+ }
+ }
+
+ let localVarPath = `/permissions`;
+ return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`,
+ {
+ context: localVarHttpContext,
+ body: getPermissionsRequest,
+ responseType: responseType_,
+ withCredentials: this.configuration.withCredentials,
+ headers: localVarHeaders,
+ observe: observe,
+ reportProgress: reportProgress
+ }
+ );
+ }
+
+}
diff --git a/src/app/shared/generated/api/routes.service.ts b/src/app/shared/generated/api/routes.service.ts
new file mode 100644
index 0000000..6185337
--- /dev/null
+++ b/src/app/shared/generated/api/routes.service.ts
@@ -0,0 +1,158 @@
+/**
+ * Generated API
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+/* tslint:disable:no-unused-variable member-ordering */
+
+import { Inject, Injectable, Optional } from '@angular/core';
+import { HttpClient, HttpHeaders, HttpParams,
+ HttpResponse, HttpEvent, HttpParameterCodec, HttpContext
+ } from '@angular/common/http';
+import { CustomHttpParameterCodec } from '../encoder';
+import { Observable } from 'rxjs';
+
+// @ts-ignore
+import { GetRoutesByUrlResponse } from '../model/getRoutesByUrlResponse';
+
+// @ts-ignore
+import { BASE_PATH, COLLECTION_FORMATS } from '../variables';
+import { Configuration } from '../configuration';
+
+
+
+@Injectable({
+ providedIn: 'any'
+})
+export class RoutesBffService {
+
+ protected basePath = 'http://localhost:4300';
+ public defaultHeaders = new HttpHeaders();
+ public configuration = new Configuration();
+ public encoder: HttpParameterCodec;
+
+ constructor(protected httpClient: HttpClient, @Optional()@Inject(BASE_PATH) basePath: string|string[], @Optional() configuration: Configuration) {
+ if (configuration) {
+ this.configuration = configuration;
+ }
+ if (typeof this.configuration.basePath !== 'string') {
+ if (Array.isArray(basePath) && basePath.length > 0) {
+ basePath = basePath[0];
+ }
+
+ if (typeof basePath !== 'string') {
+ basePath = this.basePath;
+ }
+ this.configuration.basePath = basePath;
+ }
+ this.encoder = this.configuration.encoder || new CustomHttpParameterCodec();
+ }
+
+
+ // @ts-ignore
+ private addToHttpParams(httpParams: HttpParams, value: any, key?: string): HttpParams {
+ if (typeof value === "object" && value instanceof Date === false) {
+ httpParams = this.addToHttpParamsRecursive(httpParams, value);
+ } else {
+ httpParams = this.addToHttpParamsRecursive(httpParams, value, key);
+ }
+ return httpParams;
+ }
+
+ private addToHttpParamsRecursive(httpParams: HttpParams, value?: any, key?: string): HttpParams {
+ if (value == null) {
+ return httpParams;
+ }
+
+ if (typeof value === "object") {
+ if (Array.isArray(value)) {
+ (value as any[]).forEach( elem => httpParams = this.addToHttpParamsRecursive(httpParams, elem, key));
+ } else if (value instanceof Date) {
+ if (key != null) {
+ httpParams = httpParams.append(key, (value as Date).toISOString().substring(0, 10));
+ } else {
+ throw Error("key may not be null if value is Date");
+ }
+ } else {
+ Object.keys(value).forEach( k => httpParams = this.addToHttpParamsRecursive(
+ httpParams, value[k], key != null ? `${key}.${k}` : k));
+ }
+ } else if (key != null) {
+ httpParams = httpParams.append(key, value);
+ } else {
+ throw Error("key may not be null if value is not object or array");
+ }
+ return httpParams;
+ }
+
+ /**
+ * @param url
+ * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+ * @param reportProgress flag to report request and response progress.
+ */
+ public getRoutesByUrl(url: string, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable;
+ public getRoutesByUrl(url: string, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>;
+ public getRoutesByUrl(url: string, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>;
+ public getRoutesByUrl(url: string, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable {
+ if (url === null || url === undefined) {
+ throw new Error('Required parameter url was null or undefined when calling getRoutesByUrl.');
+ }
+
+ let localVarQueryParameters = new HttpParams({encoder: this.encoder});
+ if (url !== undefined && url !== null) {
+ localVarQueryParameters = this.addToHttpParams(localVarQueryParameters,
+ url, 'url');
+ }
+
+ let localVarHeaders = this.defaultHeaders;
+
+ let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept;
+ if (localVarHttpHeaderAcceptSelected === undefined) {
+ // to determine the Accept header
+ const httpHeaderAccepts: string[] = [
+ 'application/json'
+ ];
+ localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+ }
+ if (localVarHttpHeaderAcceptSelected !== undefined) {
+ localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
+ }
+
+ let localVarHttpContext: HttpContext | undefined = options && options.context;
+ if (localVarHttpContext === undefined) {
+ localVarHttpContext = new HttpContext();
+ }
+
+
+ let responseType_: 'text' | 'json' | 'blob' = 'json';
+ if (localVarHttpHeaderAcceptSelected) {
+ if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
+ responseType_ = 'text';
+ } else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
+ responseType_ = 'json';
+ } else {
+ responseType_ = 'blob';
+ }
+ }
+
+ let localVarPath = `/routes`;
+ return this.httpClient.request('get', `${this.configuration.basePath}${localVarPath}`,
+ {
+ context: localVarHttpContext,
+ params: localVarQueryParameters,
+ responseType: responseType_,
+ withCredentials: this.configuration.withCredentials,
+ headers: localVarHeaders,
+ observe: observe,
+ reportProgress: reportProgress
+ }
+ );
+ }
+
+}
diff --git a/src/app/shared/generated/api/user.service.ts b/src/app/shared/generated/api/user.service.ts
new file mode 100644
index 0000000..f08c0e0
--- /dev/null
+++ b/src/app/shared/generated/api/user.service.ts
@@ -0,0 +1,220 @@
+/**
+ * onecx-shell-bff
+ * OneCx shell Bff
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+/* tslint:disable:no-unused-variable member-ordering */
+
+import { Inject, Injectable, Optional } from '@angular/core';
+import { HttpClient, HttpHeaders, HttpParams,
+ HttpResponse, HttpEvent, HttpParameterCodec, HttpContext
+ } from '@angular/common/http';
+import { CustomHttpParameterCodec } from '../encoder';
+import { Observable } from 'rxjs';
+
+// @ts-ignore
+import { GetPermissionsRequest } from '../model/getPermissionsRequest';
+// @ts-ignore
+import { GetPermissionsResponse } from '../model/getPermissionsResponse';
+// @ts-ignore
+import { GetUserProfileResponse } from '../model/getUserProfileResponse';
+// @ts-ignore
+import { ProblemDetailResponse } from '../model/problemDetailResponse';
+
+// @ts-ignore
+import { BASE_PATH, COLLECTION_FORMATS } from '../variables';
+import { Configuration } from '../configuration';
+
+
+
+@Injectable({
+ providedIn: 'any'
+})
+export class UserBffService {
+
+ protected basePath = 'http://onecx-shell-bff:8080';
+ public defaultHeaders = new HttpHeaders();
+ public configuration = new Configuration();
+ public encoder: HttpParameterCodec;
+
+ constructor(protected httpClient: HttpClient, @Optional()@Inject(BASE_PATH) basePath: string|string[], @Optional() configuration: Configuration) {
+ if (configuration) {
+ this.configuration = configuration;
+ }
+ if (typeof this.configuration.basePath !== 'string') {
+ if (Array.isArray(basePath) && basePath.length > 0) {
+ basePath = basePath[0];
+ }
+
+ if (typeof basePath !== 'string') {
+ basePath = this.basePath;
+ }
+ this.configuration.basePath = basePath;
+ }
+ this.encoder = this.configuration.encoder || new CustomHttpParameterCodec();
+ }
+
+
+ // @ts-ignore
+ private addToHttpParams(httpParams: HttpParams, value: any, key?: string): HttpParams {
+ if (typeof value === "object" && value instanceof Date === false) {
+ httpParams = this.addToHttpParamsRecursive(httpParams, value);
+ } else {
+ httpParams = this.addToHttpParamsRecursive(httpParams, value, key);
+ }
+ return httpParams;
+ }
+
+ private addToHttpParamsRecursive(httpParams: HttpParams, value?: any, key?: string): HttpParams {
+ if (value == null) {
+ return httpParams;
+ }
+
+ if (typeof value === "object") {
+ if (Array.isArray(value)) {
+ (value as any[]).forEach( elem => httpParams = this.addToHttpParamsRecursive(httpParams, elem, key));
+ } else if (value instanceof Date) {
+ if (key != null) {
+ httpParams = httpParams.append(key, (value as Date).toISOString().substring(0, 10));
+ } else {
+ throw Error("key may not be null if value is Date");
+ }
+ } else {
+ Object.keys(value).forEach( k => httpParams = this.addToHttpParamsRecursive(
+ httpParams, value[k], key != null ? `${key}.${k}` : k));
+ }
+ } else if (key != null) {
+ httpParams = httpParams.append(key, value);
+ } else {
+ throw Error("key may not be null if value is not object or array");
+ }
+ return httpParams;
+ }
+
+ /**
+ * @param getPermissionsRequest
+ * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+ * @param reportProgress flag to report request and response progress.
+ */
+ public getPermissions(getPermissionsRequest: GetPermissionsRequest, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable;
+ public getPermissions(getPermissionsRequest: GetPermissionsRequest, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>;
+ public getPermissions(getPermissionsRequest: GetPermissionsRequest, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>;
+ public getPermissions(getPermissionsRequest: GetPermissionsRequest, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable {
+ if (getPermissionsRequest === null || getPermissionsRequest === undefined) {
+ throw new Error('Required parameter getPermissionsRequest was null or undefined when calling getPermissions.');
+ }
+
+ let localVarHeaders = this.defaultHeaders;
+
+ let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept;
+ if (localVarHttpHeaderAcceptSelected === undefined) {
+ // to determine the Accept header
+ const httpHeaderAccepts: string[] = [
+ 'application/json'
+ ];
+ localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+ }
+ if (localVarHttpHeaderAcceptSelected !== undefined) {
+ localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
+ }
+
+ let localVarHttpContext: HttpContext | undefined = options && options.context;
+ if (localVarHttpContext === undefined) {
+ localVarHttpContext = new HttpContext();
+ }
+
+
+ // to determine the Content-Type header
+ const consumes: string[] = [
+ 'application/json'
+ ];
+ const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes);
+ if (httpContentTypeSelected !== undefined) {
+ localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
+ }
+
+ let responseType_: 'text' | 'json' | 'blob' = 'json';
+ if (localVarHttpHeaderAcceptSelected) {
+ if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
+ responseType_ = 'text';
+ } else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
+ responseType_ = 'json';
+ } else {
+ responseType_ = 'blob';
+ }
+ }
+
+ let localVarPath = `/permissions`;
+ return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`,
+ {
+ context: localVarHttpContext,
+ body: getPermissionsRequest,
+ responseType: responseType_,
+ withCredentials: this.configuration.withCredentials,
+ headers: localVarHeaders,
+ observe: observe,
+ reportProgress: reportProgress
+ }
+ );
+ }
+
+ /**
+ * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+ * @param reportProgress flag to report request and response progress.
+ */
+ public getUserProfile(observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable;
+ public getUserProfile(observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>;
+ public getUserProfile(observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>;
+ public getUserProfile(observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable {
+
+ let localVarHeaders = this.defaultHeaders;
+
+ let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept;
+ if (localVarHttpHeaderAcceptSelected === undefined) {
+ // to determine the Accept header
+ const httpHeaderAccepts: string[] = [
+ 'application/json'
+ ];
+ localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+ }
+ if (localVarHttpHeaderAcceptSelected !== undefined) {
+ localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
+ }
+
+ let localVarHttpContext: HttpContext | undefined = options && options.context;
+ if (localVarHttpContext === undefined) {
+ localVarHttpContext = new HttpContext();
+ }
+
+
+ let responseType_: 'text' | 'json' | 'blob' = 'json';
+ if (localVarHttpHeaderAcceptSelected) {
+ if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
+ responseType_ = 'text';
+ } else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
+ responseType_ = 'json';
+ } else {
+ responseType_ = 'blob';
+ }
+ }
+
+ let localVarPath = `/userProfile`;
+ return this.httpClient.request('get', `${this.configuration.basePath}${localVarPath}`,
+ {
+ context: localVarHttpContext,
+ responseType: responseType_,
+ withCredentials: this.configuration.withCredentials,
+ headers: localVarHeaders,
+ observe: observe,
+ reportProgress: reportProgress
+ }
+ );
+ }
+
+}
diff --git a/src/app/shared/generated/api/userProfile.service.ts b/src/app/shared/generated/api/userProfile.service.ts
new file mode 100644
index 0000000..182c3b6
--- /dev/null
+++ b/src/app/shared/generated/api/userProfile.service.ts
@@ -0,0 +1,149 @@
+/**
+ * onecx-shell-bff
+ * OneCx shell Bff
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+/* tslint:disable:no-unused-variable member-ordering */
+
+import { Inject, Injectable, Optional } from '@angular/core';
+import { HttpClient, HttpHeaders, HttpParams,
+ HttpResponse, HttpEvent, HttpParameterCodec, HttpContext
+ } from '@angular/common/http';
+import { CustomHttpParameterCodec } from '../encoder';
+import { Observable } from 'rxjs';
+
+// @ts-ignore
+import { GetUserProfileResponse } from '../model/getUserProfileResponse';
+// @ts-ignore
+import { ProblemDetailResponse } from '../model/problemDetailResponse';
+
+// @ts-ignore
+import { BASE_PATH, COLLECTION_FORMATS } from '../variables';
+import { Configuration } from '../configuration';
+
+
+
+@Injectable({
+ providedIn: 'any'
+})
+export class UserProfileBffService {
+
+ protected basePath = 'http://onecx-shell-bff:8080';
+ public defaultHeaders = new HttpHeaders();
+ public configuration = new Configuration();
+ public encoder: HttpParameterCodec;
+
+ constructor(protected httpClient: HttpClient, @Optional()@Inject(BASE_PATH) basePath: string|string[], @Optional() configuration: Configuration) {
+ if (configuration) {
+ this.configuration = configuration;
+ }
+ if (typeof this.configuration.basePath !== 'string') {
+ if (Array.isArray(basePath) && basePath.length > 0) {
+ basePath = basePath[0];
+ }
+
+ if (typeof basePath !== 'string') {
+ basePath = this.basePath;
+ }
+ this.configuration.basePath = basePath;
+ }
+ this.encoder = this.configuration.encoder || new CustomHttpParameterCodec();
+ }
+
+
+ // @ts-ignore
+ private addToHttpParams(httpParams: HttpParams, value: any, key?: string): HttpParams {
+ if (typeof value === "object" && value instanceof Date === false) {
+ httpParams = this.addToHttpParamsRecursive(httpParams, value);
+ } else {
+ httpParams = this.addToHttpParamsRecursive(httpParams, value, key);
+ }
+ return httpParams;
+ }
+
+ private addToHttpParamsRecursive(httpParams: HttpParams, value?: any, key?: string): HttpParams {
+ if (value == null) {
+ return httpParams;
+ }
+
+ if (typeof value === "object") {
+ if (Array.isArray(value)) {
+ (value as any[]).forEach( elem => httpParams = this.addToHttpParamsRecursive(httpParams, elem, key));
+ } else if (value instanceof Date) {
+ if (key != null) {
+ httpParams = httpParams.append(key, (value as Date).toISOString().substring(0, 10));
+ } else {
+ throw Error("key may not be null if value is Date");
+ }
+ } else {
+ Object.keys(value).forEach( k => httpParams = this.addToHttpParamsRecursive(
+ httpParams, value[k], key != null ? `${key}.${k}` : k));
+ }
+ } else if (key != null) {
+ httpParams = httpParams.append(key, value);
+ } else {
+ throw Error("key may not be null if value is not object or array");
+ }
+ return httpParams;
+ }
+
+ /**
+ * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+ * @param reportProgress flag to report request and response progress.
+ */
+ public getUserProfile(observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable;
+ public getUserProfile(observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>;
+ public getUserProfile(observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>;
+ public getUserProfile(observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable {
+
+ let localVarHeaders = this.defaultHeaders;
+
+ let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept;
+ if (localVarHttpHeaderAcceptSelected === undefined) {
+ // to determine the Accept header
+ const httpHeaderAccepts: string[] = [
+ 'application/json'
+ ];
+ localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+ }
+ if (localVarHttpHeaderAcceptSelected !== undefined) {
+ localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
+ }
+
+ let localVarHttpContext: HttpContext | undefined = options && options.context;
+ if (localVarHttpContext === undefined) {
+ localVarHttpContext = new HttpContext();
+ }
+
+
+ let responseType_: 'text' | 'json' | 'blob' = 'json';
+ if (localVarHttpHeaderAcceptSelected) {
+ if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
+ responseType_ = 'text';
+ } else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
+ responseType_ = 'json';
+ } else {
+ responseType_ = 'blob';
+ }
+ }
+
+ let localVarPath = `/userProfile`;
+ return this.httpClient.request('get', `${this.configuration.basePath}${localVarPath}`,
+ {
+ context: localVarHttpContext,
+ responseType: responseType_,
+ withCredentials: this.configuration.withCredentials,
+ headers: localVarHeaders,
+ observe: observe,
+ reportProgress: reportProgress
+ }
+ );
+ }
+
+}
diff --git a/src/app/shared/generated/api/userProfle.service.ts b/src/app/shared/generated/api/userProfle.service.ts
new file mode 100644
index 0000000..1f75066
--- /dev/null
+++ b/src/app/shared/generated/api/userProfle.service.ts
@@ -0,0 +1,160 @@
+/**
+ * Shell BFF
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+/* tslint:disable:no-unused-variable member-ordering */
+
+import { Inject, Injectable, Optional } from '@angular/core';
+import { HttpClient, HttpHeaders, HttpParams,
+ HttpResponse, HttpEvent, HttpParameterCodec, HttpContext
+ } from '@angular/common/http';
+import { CustomHttpParameterCodec } from '../encoder';
+import { Observable } from 'rxjs';
+
+// @ts-ignore
+import { GetUserProfileResponse } from '../model/getUserProfileResponse';
+// @ts-ignore
+import { ProblemDetailResponse } from '../model/problemDetailResponse';
+
+// @ts-ignore
+import { BASE_PATH, COLLECTION_FORMATS } from '../variables';
+import { Configuration } from '../configuration';
+
+
+
+@Injectable({
+ providedIn: 'any'
+})
+export class UserProfleBffService {
+
+ protected basePath = 'http://localhost';
+ public defaultHeaders = new HttpHeaders();
+ public configuration = new Configuration();
+ public encoder: HttpParameterCodec;
+
+ constructor(protected httpClient: HttpClient, @Optional()@Inject(BASE_PATH) basePath: string|string[], @Optional() configuration: Configuration) {
+ if (configuration) {
+ this.configuration = configuration;
+ }
+ if (typeof this.configuration.basePath !== 'string') {
+ if (Array.isArray(basePath) && basePath.length > 0) {
+ basePath = basePath[0];
+ }
+
+ if (typeof basePath !== 'string') {
+ basePath = this.basePath;
+ }
+ this.configuration.basePath = basePath;
+ }
+ this.encoder = this.configuration.encoder || new CustomHttpParameterCodec();
+ }
+
+
+ // @ts-ignore
+ private addToHttpParams(httpParams: HttpParams, value: any, key?: string): HttpParams {
+ if (typeof value === "object" && value instanceof Date === false) {
+ httpParams = this.addToHttpParamsRecursive(httpParams, value);
+ } else {
+ httpParams = this.addToHttpParamsRecursive(httpParams, value, key);
+ }
+ return httpParams;
+ }
+
+ private addToHttpParamsRecursive(httpParams: HttpParams, value?: any, key?: string): HttpParams {
+ if (value == null) {
+ return httpParams;
+ }
+
+ if (typeof value === "object") {
+ if (Array.isArray(value)) {
+ (value as any[]).forEach( elem => httpParams = this.addToHttpParamsRecursive(httpParams, elem, key));
+ } else if (value instanceof Date) {
+ if (key != null) {
+ httpParams = httpParams.append(key, (value as Date).toISOString().substring(0, 10));
+ } else {
+ throw Error("key may not be null if value is Date");
+ }
+ } else {
+ Object.keys(value).forEach( k => httpParams = this.addToHttpParamsRecursive(
+ httpParams, value[k], key != null ? `${key}.${k}` : k));
+ }
+ } else if (key != null) {
+ httpParams = httpParams.append(key, value);
+ } else {
+ throw Error("key may not be null if value is not object or array");
+ }
+ return httpParams;
+ }
+
+ /**
+ * @param url
+ * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+ * @param reportProgress flag to report request and response progress.
+ */
+ public getUserProfile(url: string, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable;
+ public getUserProfile(url: string, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>;
+ public getUserProfile(url: string, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>;
+ public getUserProfile(url: string, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable {
+ if (url === null || url === undefined) {
+ throw new Error('Required parameter url was null or undefined when calling getUserProfile.');
+ }
+
+ let localVarQueryParameters = new HttpParams({encoder: this.encoder});
+ if (url !== undefined && url !== null) {
+ localVarQueryParameters = this.addToHttpParams(localVarQueryParameters,
+ url, 'url');
+ }
+
+ let localVarHeaders = this.defaultHeaders;
+
+ let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept;
+ if (localVarHttpHeaderAcceptSelected === undefined) {
+ // to determine the Accept header
+ const httpHeaderAccepts: string[] = [
+ 'application/json'
+ ];
+ localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+ }
+ if (localVarHttpHeaderAcceptSelected !== undefined) {
+ localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
+ }
+
+ let localVarHttpContext: HttpContext | undefined = options && options.context;
+ if (localVarHttpContext === undefined) {
+ localVarHttpContext = new HttpContext();
+ }
+
+
+ let responseType_: 'text' | 'json' | 'blob' = 'json';
+ if (localVarHttpHeaderAcceptSelected) {
+ if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
+ responseType_ = 'text';
+ } else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
+ responseType_ = 'json';
+ } else {
+ responseType_ = 'blob';
+ }
+ }
+
+ let localVarPath = `/userProfile`;
+ return this.httpClient.request('get', `${this.configuration.basePath}${localVarPath}`,
+ {
+ context: localVarHttpContext,
+ params: localVarQueryParameters,
+ responseType: responseType_,
+ withCredentials: this.configuration.withCredentials,
+ headers: localVarHeaders,
+ observe: observe,
+ reportProgress: reportProgress
+ }
+ );
+ }
+
+}
diff --git a/src/app/shared/generated/api/workspaceConfig.service.ts b/src/app/shared/generated/api/workspaceConfig.service.ts
new file mode 100644
index 0000000..fb9f3b6
--- /dev/null
+++ b/src/app/shared/generated/api/workspaceConfig.service.ts
@@ -0,0 +1,212 @@
+/**
+ * onecx-shell-bff
+ * OneCx shell Bff
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+/* tslint:disable:no-unused-variable member-ordering */
+
+import { Inject, Injectable, Optional } from '@angular/core';
+import { HttpClient, HttpHeaders, HttpParams,
+ HttpResponse, HttpEvent, HttpParameterCodec, HttpContext
+ } from '@angular/common/http';
+import { CustomHttpParameterCodec } from '../encoder';
+import { Observable } from 'rxjs';
+
+// @ts-ignore
+import { GetWorkspaceConfigRequest } from '../model/getWorkspaceConfigRequest';
+// @ts-ignore
+import { GetWorkspaceConfigResponse } from '../model/getWorkspaceConfigResponse';
+// @ts-ignore
+import { ProblemDetailResponse } from '../model/problemDetailResponse';
+
+// @ts-ignore
+import { BASE_PATH, COLLECTION_FORMATS } from '../variables';
+import { Configuration } from '../configuration';
+
+
+
+@Injectable({
+ providedIn: 'any'
+})
+export class WorkspaceConfigBffService {
+
+ protected basePath = 'http://onecx-shell-bff:8080';
+ public defaultHeaders = new HttpHeaders();
+ public configuration = new Configuration();
+ public encoder: HttpParameterCodec;
+
+ constructor(protected httpClient: HttpClient, @Optional()@Inject(BASE_PATH) basePath: string|string[], @Optional() configuration: Configuration) {
+ if (configuration) {
+ this.configuration = configuration;
+ }
+ if (typeof this.configuration.basePath !== 'string') {
+ if (Array.isArray(basePath) && basePath.length > 0) {
+ basePath = basePath[0];
+ }
+
+ if (typeof basePath !== 'string') {
+ basePath = this.basePath;
+ }
+ this.configuration.basePath = basePath;
+ }
+ this.encoder = this.configuration.encoder || new CustomHttpParameterCodec();
+ }
+
+
+ // @ts-ignore
+ private addToHttpParams(httpParams: HttpParams, value: any, key?: string): HttpParams {
+ if (typeof value === "object" && value instanceof Date === false) {
+ httpParams = this.addToHttpParamsRecursive(httpParams, value);
+ } else {
+ httpParams = this.addToHttpParamsRecursive(httpParams, value, key);
+ }
+ return httpParams;
+ }
+
+ private addToHttpParamsRecursive(httpParams: HttpParams, value?: any, key?: string): HttpParams {
+ if (value == null) {
+ return httpParams;
+ }
+
+ if (typeof value === "object") {
+ if (Array.isArray(value)) {
+ (value as any[]).forEach( elem => httpParams = this.addToHttpParamsRecursive(httpParams, elem, key));
+ } else if (value instanceof Date) {
+ if (key != null) {
+ httpParams = httpParams.append(key, (value as Date).toISOString().substring(0, 10));
+ } else {
+ throw Error("key may not be null if value is Date");
+ }
+ } else {
+ Object.keys(value).forEach( k => httpParams = this.addToHttpParamsRecursive(
+ httpParams, value[k], key != null ? `${key}.${k}` : k));
+ }
+ } else if (key != null) {
+ httpParams = httpParams.append(key, value);
+ } else {
+ throw Error("key may not be null if value is not object or array");
+ }
+ return httpParams;
+ }
+
+ /**
+ * Load favicon by theme name
+ * @param name
+ * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+ * @param reportProgress flag to report request and response progress.
+ */
+ public getThemeFaviconByName(name: string, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'image/*', context?: HttpContext}): Observable;
+ public getThemeFaviconByName(name: string, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'image/*', context?: HttpContext}): Observable>;
+ public getThemeFaviconByName(name: string, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'image/*', context?: HttpContext}): Observable>;
+ public getThemeFaviconByName(name: string, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'image/*', context?: HttpContext}): Observable {
+ if (name === null || name === undefined) {
+ throw new Error('Required parameter name was null or undefined when calling getThemeFaviconByName.');
+ }
+
+ let localVarHeaders = this.defaultHeaders;
+
+ let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept;
+ if (localVarHttpHeaderAcceptSelected === undefined) {
+ // to determine the Accept header
+ const httpHeaderAccepts: string[] = [
+ 'image/*'
+ ];
+ localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+ }
+ if (localVarHttpHeaderAcceptSelected !== undefined) {
+ localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
+ }
+
+ let localVarHttpContext: HttpContext | undefined = options && options.context;
+ if (localVarHttpContext === undefined) {
+ localVarHttpContext = new HttpContext();
+ }
+
+
+ let localVarPath = `/workspaceConfig/themes/${this.configuration.encodeParam({name: "name", value: name, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined})}/favicon`;
+ return this.httpClient.request('get', `${this.configuration.basePath}${localVarPath}`,
+ {
+ context: localVarHttpContext,
+ responseType: "blob",
+ withCredentials: this.configuration.withCredentials,
+ headers: localVarHeaders,
+ observe: observe,
+ reportProgress: reportProgress
+ }
+ );
+ }
+
+ /**
+ * @param getWorkspaceConfigRequest
+ * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+ * @param reportProgress flag to report request and response progress.
+ */
+ public getWorkspaceConfig(getWorkspaceConfigRequest: GetWorkspaceConfigRequest, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable;
+ public getWorkspaceConfig(getWorkspaceConfigRequest: GetWorkspaceConfigRequest, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>;
+ public getWorkspaceConfig(getWorkspaceConfigRequest: GetWorkspaceConfigRequest, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>;
+ public getWorkspaceConfig(getWorkspaceConfigRequest: GetWorkspaceConfigRequest, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable {
+ if (getWorkspaceConfigRequest === null || getWorkspaceConfigRequest === undefined) {
+ throw new Error('Required parameter getWorkspaceConfigRequest was null or undefined when calling getWorkspaceConfig.');
+ }
+
+ let localVarHeaders = this.defaultHeaders;
+
+ let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept;
+ if (localVarHttpHeaderAcceptSelected === undefined) {
+ // to determine the Accept header
+ const httpHeaderAccepts: string[] = [
+ 'application/json'
+ ];
+ localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+ }
+ if (localVarHttpHeaderAcceptSelected !== undefined) {
+ localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
+ }
+
+ let localVarHttpContext: HttpContext | undefined = options && options.context;
+ if (localVarHttpContext === undefined) {
+ localVarHttpContext = new HttpContext();
+ }
+
+
+ // to determine the Content-Type header
+ const consumes: string[] = [
+ 'application/json'
+ ];
+ const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes);
+ if (httpContentTypeSelected !== undefined) {
+ localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
+ }
+
+ let responseType_: 'text' | 'json' | 'blob' = 'json';
+ if (localVarHttpHeaderAcceptSelected) {
+ if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
+ responseType_ = 'text';
+ } else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
+ responseType_ = 'json';
+ } else {
+ responseType_ = 'blob';
+ }
+ }
+
+ let localVarPath = `/workspaceConfig`;
+ return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`,
+ {
+ context: localVarHttpContext,
+ body: getWorkspaceConfigRequest,
+ responseType: responseType_,
+ withCredentials: this.configuration.withCredentials,
+ headers: localVarHeaders,
+ observe: observe,
+ reportProgress: reportProgress
+ }
+ );
+ }
+
+}
diff --git a/src/app/shared/generated/configuration.ts b/src/app/shared/generated/configuration.ts
new file mode 100644
index 0000000..526b454
--- /dev/null
+++ b/src/app/shared/generated/configuration.ts
@@ -0,0 +1,166 @@
+import { HttpParameterCodec } from '@angular/common/http';
+import { Param } from './param';
+
+export interface ConfigurationParameters {
+ /**
+ * @deprecated Since 5.0. Use credentials instead
+ */
+ apiKeys?: {[ key: string ]: string};
+ username?: string;
+ password?: string;
+ /**
+ * @deprecated Since 5.0. Use credentials instead
+ */
+ accessToken?: string | (() => string);
+ basePath?: string;
+ withCredentials?: boolean;
+ /**
+ * Takes care of encoding query- and form-parameters.
+ */
+ encoder?: HttpParameterCodec;
+ /**
+ * Override the default method for encoding path parameters in various
+ * styles.
+ *
+ * See {@link README.md} for more details
+ *
+ */
+ encodeParam?: (param: Param) => string;
+ /**
+ * The keys are the names in the securitySchemes section of the OpenAPI
+ * document. They should map to the value used for authentication
+ * minus any standard prefixes such as 'Basic' or 'Bearer'.
+ */
+ credentials?: {[ key: string ]: string | (() => string | undefined)};
+}
+
+export class Configuration {
+ /**
+ * @deprecated Since 5.0. Use credentials instead
+ */
+ apiKeys?: {[ key: string ]: string};
+ username?: string;
+ password?: string;
+ /**
+ * @deprecated Since 5.0. Use credentials instead
+ */
+ accessToken?: string | (() => string);
+ basePath?: string;
+ withCredentials?: boolean;
+ /**
+ * Takes care of encoding query- and form-parameters.
+ */
+ encoder?: HttpParameterCodec;
+ /**
+ * Encoding of various path parameter
+ * styles.
+ *
+ * See {@link README.md} for more details
+ *
+ */
+ encodeParam: (param: Param) => string;
+ /**
+ * The keys are the names in the securitySchemes section of the OpenAPI
+ * document. They should map to the value used for authentication
+ * minus any standard prefixes such as 'Basic' or 'Bearer'.
+ */
+ credentials: {[ key: string ]: string | (() => string | undefined)};
+
+ constructor(configurationParameters: ConfigurationParameters = {}) {
+ this.apiKeys = configurationParameters.apiKeys;
+ this.username = configurationParameters.username;
+ this.password = configurationParameters.password;
+ this.accessToken = configurationParameters.accessToken;
+ this.basePath = configurationParameters.basePath;
+ this.withCredentials = configurationParameters.withCredentials;
+ this.encoder = configurationParameters.encoder;
+ if (configurationParameters.encodeParam) {
+ this.encodeParam = configurationParameters.encodeParam;
+ }
+ else {
+ this.encodeParam = param => this.defaultEncodeParam(param);
+ }
+ if (configurationParameters.credentials) {
+ this.credentials = configurationParameters.credentials;
+ }
+ else {
+ this.credentials = {};
+ }
+ }
+
+ /**
+ * Select the correct content-type to use for a request.
+ * Uses {@link Configuration#isJsonMime} to determine the correct content-type.
+ * If no content type is found return the first found type if the contentTypes is not empty
+ * @param contentTypes - the array of content types that are available for selection
+ * @returns the selected content-type or undefined if no selection could be made.
+ */
+ public selectHeaderContentType (contentTypes: string[]): string | undefined {
+ if (contentTypes.length === 0) {
+ return undefined;
+ }
+
+ const type = contentTypes.find((x: string) => this.isJsonMime(x));
+ if (type === undefined) {
+ return contentTypes[0];
+ }
+ return type;
+ }
+
+ /**
+ * Select the correct accept content-type to use for a request.
+ * Uses {@link Configuration#isJsonMime} to determine the correct accept content-type.
+ * If no content type is found return the first found type if the contentTypes is not empty
+ * @param accepts - the array of content types that are available for selection.
+ * @returns the selected content-type or undefined if no selection could be made.
+ */
+ public selectHeaderAccept(accepts: string[]): string | undefined {
+ if (accepts.length === 0) {
+ return undefined;
+ }
+
+ const type = accepts.find((x: string) => this.isJsonMime(x));
+ if (type === undefined) {
+ return accepts[0];
+ }
+ return type;
+ }
+
+ /**
+ * Check if the given MIME is a JSON MIME.
+ * JSON MIME examples:
+ * application/json
+ * application/json; charset=UTF8
+ * APPLICATION/JSON
+ * application/vnd.company+json
+ * @param mime - MIME (Multipurpose Internet Mail Extensions)
+ * @return True if the given MIME is JSON, false otherwise.
+ */
+ public isJsonMime(mime: string): boolean {
+ const jsonMime: RegExp = new RegExp('^(application\/json|[^;/ \t]+\/[^;/ \t]+[+]json)[ \t]*(;.*)?$', 'i');
+ return mime !== null && (jsonMime.test(mime) || mime.toLowerCase() === 'application/json-patch+json');
+ }
+
+ public lookupCredential(key: string): string | undefined {
+ const value = this.credentials[key];
+ return typeof value === 'function'
+ ? value()
+ : value;
+ }
+
+ private defaultEncodeParam(param: Param): string {
+ // This implementation exists as fallback for missing configuration
+ // and for backwards compatibility to older typescript-angular generator versions.
+ // It only works for the 'simple' parameter style.
+ // Date-handling only works for the 'date-time' format.
+ // All other styles and Date-formats are probably handled incorrectly.
+ //
+ // But: if that's all you need (i.e.: the most common use-case): no need for customization!
+
+ const value = param.dataFormat === 'date-time' && param.value instanceof Date
+ ? (param.value as Date).toISOString()
+ : param.value;
+
+ return encodeURIComponent(String(value));
+ }
+}
diff --git a/src/app/shared/generated/encoder.ts b/src/app/shared/generated/encoder.ts
new file mode 100644
index 0000000..138c4d5
--- /dev/null
+++ b/src/app/shared/generated/encoder.ts
@@ -0,0 +1,20 @@
+import { HttpParameterCodec } from '@angular/common/http';
+
+/**
+ * Custom HttpParameterCodec
+ * Workaround for https://github.com/angular/angular/issues/18261
+ */
+export class CustomHttpParameterCodec implements HttpParameterCodec {
+ encodeKey(k: string): string {
+ return encodeURIComponent(k);
+ }
+ encodeValue(v: string): string {
+ return encodeURIComponent(v);
+ }
+ decodeKey(k: string): string {
+ return decodeURIComponent(k);
+ }
+ decodeValue(v: string): string {
+ return decodeURIComponent(v);
+ }
+}
diff --git a/src/app/shared/generated/git_push.sh b/src/app/shared/generated/git_push.sh
new file mode 100644
index 0000000..f53a75d
--- /dev/null
+++ b/src/app/shared/generated/git_push.sh
@@ -0,0 +1,57 @@
+#!/bin/sh
+# ref: https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/
+#
+# Usage example: /bin/sh ./git_push.sh wing328 openapi-petstore-perl "minor update" "gitlab.com"
+
+git_user_id=$1
+git_repo_id=$2
+release_note=$3
+git_host=$4
+
+if [ "$git_host" = "" ]; then
+ git_host="github.com"
+ echo "[INFO] No command line input provided. Set \$git_host to $git_host"
+fi
+
+if [ "$git_user_id" = "" ]; then
+ git_user_id="GIT_USER_ID"
+ echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id"
+fi
+
+if [ "$git_repo_id" = "" ]; then
+ git_repo_id="GIT_REPO_ID"
+ echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id"
+fi
+
+if [ "$release_note" = "" ]; then
+ release_note="Minor update"
+ echo "[INFO] No command line input provided. Set \$release_note to $release_note"
+fi
+
+# Initialize the local directory as a Git repository
+git init
+
+# Adds the files in the local repository and stages them for commit.
+git add .
+
+# Commits the tracked changes and prepares them to be pushed to a remote repository.
+git commit -m "$release_note"
+
+# Sets the new remote
+git_remote=$(git remote)
+if [ "$git_remote" = "" ]; then # git remote not defined
+
+ if [ "$GIT_TOKEN" = "" ]; then
+ echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git credential in your environment."
+ git remote add origin https://${git_host}/${git_user_id}/${git_repo_id}.git
+ else
+ git remote add origin https://${git_user_id}:"${GIT_TOKEN}"@${git_host}/${git_user_id}/${git_repo_id}.git
+ fi
+
+fi
+
+git pull origin master
+
+# Pushes (Forces) the changes in the local repository up to the remote repository
+echo "Git pushing to https://${git_host}/${git_user_id}/${git_repo_id}.git"
+git push origin master 2>&1 | grep -v 'To https'
diff --git a/src/app/shared/generated/index.ts b/src/app/shared/generated/index.ts
new file mode 100644
index 0000000..104dd3d
--- /dev/null
+++ b/src/app/shared/generated/index.ts
@@ -0,0 +1,6 @@
+export * from './api/api';
+export * from './model/models';
+export * from './variables';
+export * from './configuration';
+export * from './api.module';
+export * from './param';
diff --git a/src/app/shared/generated/model/accountSettings.ts b/src/app/shared/generated/model/accountSettings.ts
new file mode 100644
index 0000000..54a9d72
--- /dev/null
+++ b/src/app/shared/generated/model/accountSettings.ts
@@ -0,0 +1,20 @@
+/**
+ * onecx-shell-bff
+ * OneCx shell Bff
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+import { LayoutAndThemeSettings } from './layoutAndThemeSettings';
+import { LocaleAndTimeSettings } from './localeAndTimeSettings';
+
+
+export interface AccountSettings {
+ layoutAndThemeSettings?: LayoutAndThemeSettings;
+ localeAndTimeSettings?: LocaleAndTimeSettings;
+}
+
diff --git a/src/app/shared/generated/model/angularRoute.ts b/src/app/shared/generated/model/angularRoute.ts
new file mode 100644
index 0000000..fbcaea6
--- /dev/null
+++ b/src/app/shared/generated/model/angularRoute.ts
@@ -0,0 +1,28 @@
+/**
+ * onecx-shell-bff
+ * OneCx shell Bff
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+import { PathMatch } from './pathMatch';
+import { Technologies } from './technologies';
+
+
+export interface AngularRoute {
+ url: string;
+ baseUrl: string;
+ remoteEntryUrl: string;
+ appId: string;
+ productName: string;
+ technology?: Technologies;
+ exposedModule: string;
+ pathMatch: PathMatch;
+}
+
+
+
diff --git a/src/app/shared/generated/model/colorScheme.ts b/src/app/shared/generated/model/colorScheme.ts
new file mode 100644
index 0000000..ddd9ccc
--- /dev/null
+++ b/src/app/shared/generated/model/colorScheme.ts
@@ -0,0 +1,19 @@
+/**
+ * onecx-shell-bff
+ * OneCx shell Bff
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+export enum ColorScheme {
+ AUTO = 'AUTO',
+ LIGHT = 'LIGHT',
+ DARK = 'DARK'
+}
+
diff --git a/src/app/shared/generated/model/component.ts b/src/app/shared/generated/model/component.ts
new file mode 100644
index 0000000..ae9339d
--- /dev/null
+++ b/src/app/shared/generated/model/component.ts
@@ -0,0 +1,23 @@
+/**
+ * Generated API
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+export interface Component {
+ url: string;
+ remoteEntry: string;
+ remoteBaseUrl: string;
+ displayName: string;
+ appVersion: string;
+ exposedModule: string;
+ pathMatch?: string;
+}
+
diff --git a/src/app/shared/generated/model/getComponentsByUrlResponse.ts b/src/app/shared/generated/model/getComponentsByUrlResponse.ts
new file mode 100644
index 0000000..799891e
--- /dev/null
+++ b/src/app/shared/generated/model/getComponentsByUrlResponse.ts
@@ -0,0 +1,18 @@
+/**
+ * Generated API
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+import { Component } from './component';
+
+
+export interface GetComponentsByUrlResponse {
+ slotComponents: { [key: string]: Array; };
+}
+
diff --git a/src/app/shared/generated/model/getPermissionsRequest.ts b/src/app/shared/generated/model/getPermissionsRequest.ts
new file mode 100644
index 0000000..49d3c03
--- /dev/null
+++ b/src/app/shared/generated/model/getPermissionsRequest.ts
@@ -0,0 +1,18 @@
+/**
+ * onecx-shell-bff
+ * OneCx shell Bff
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+export interface GetPermissionsRequest {
+ appId: string;
+ productName: string;
+}
+
diff --git a/src/app/shared/generated/model/getPermissionsResponse.ts b/src/app/shared/generated/model/getPermissionsResponse.ts
new file mode 100644
index 0000000..8684693
--- /dev/null
+++ b/src/app/shared/generated/model/getPermissionsResponse.ts
@@ -0,0 +1,17 @@
+/**
+ * onecx-shell-bff
+ * OneCx shell Bff
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+export interface GetPermissionsResponse {
+ permissions: Array;
+}
+
diff --git a/src/app/shared/generated/model/getRoutesByUrlResponse.ts b/src/app/shared/generated/model/getRoutesByUrlResponse.ts
new file mode 100644
index 0000000..d689cb4
--- /dev/null
+++ b/src/app/shared/generated/model/getRoutesByUrlResponse.ts
@@ -0,0 +1,18 @@
+/**
+ * Generated API
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+import { GetRoutesByUrlResponseRoutesInner } from './getRoutesByUrlResponseRoutesInner';
+
+
+export interface GetRoutesByUrlResponse {
+ routes: Array;
+}
+
diff --git a/src/app/shared/generated/model/getRoutesByUrlResponseRoutesInner.ts b/src/app/shared/generated/model/getRoutesByUrlResponseRoutesInner.ts
new file mode 100644
index 0000000..4ed5ad8
--- /dev/null
+++ b/src/app/shared/generated/model/getRoutesByUrlResponseRoutesInner.ts
@@ -0,0 +1,21 @@
+/**
+ * Generated API
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+import { WebComponentRoute } from './webComponentRoute';
+import { AngularRoute } from './angularRoute';
+
+
+/**
+ * @type GetRoutesByUrlResponseRoutesInner
+ * @export
+ */
+export type GetRoutesByUrlResponseRoutesInner = AngularRoute | WebComponentRoute;
+
diff --git a/src/app/shared/generated/model/getUserProfileResponse.ts b/src/app/shared/generated/model/getUserProfileResponse.ts
new file mode 100644
index 0000000..d8ea634
--- /dev/null
+++ b/src/app/shared/generated/model/getUserProfileResponse.ts
@@ -0,0 +1,18 @@
+/**
+ * onecx-shell-bff
+ * OneCx shell Bff
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+import { UserProfile } from './userProfile';
+
+
+export interface GetUserProfileResponse {
+ userProfile: UserProfile;
+}
+
diff --git a/src/app/shared/generated/model/getWorkspaceConfigRequest.ts b/src/app/shared/generated/model/getWorkspaceConfigRequest.ts
new file mode 100644
index 0000000..36d2bc7
--- /dev/null
+++ b/src/app/shared/generated/model/getWorkspaceConfigRequest.ts
@@ -0,0 +1,17 @@
+/**
+ * onecx-shell-bff
+ * OneCx shell Bff
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+export interface GetWorkspaceConfigRequest {
+ baseUrl: string;
+}
+
diff --git a/src/app/shared/generated/model/getWorkspaceConfigResponse.ts b/src/app/shared/generated/model/getWorkspaceConfigResponse.ts
new file mode 100644
index 0000000..c7d230e
--- /dev/null
+++ b/src/app/shared/generated/model/getWorkspaceConfigResponse.ts
@@ -0,0 +1,26 @@
+/**
+ * onecx-shell-bff
+ * OneCx shell Bff
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+import { RemoteComponent } from './remoteComponent';
+import { RemoteComponentMapping } from './remoteComponentMapping';
+import { Theme } from './theme';
+import { Route } from './route';
+import { Workspace } from './workspace';
+
+
+export interface GetWorkspaceConfigResponse {
+ routes: Array;
+ theme: Theme;
+ workspace: Workspace;
+ remoteComponents: Array;
+ shellRemoteComponents: Array;
+}
+
diff --git a/src/app/shared/generated/model/getWorkspaceConfigResponseRoutes.ts b/src/app/shared/generated/model/getWorkspaceConfigResponseRoutes.ts
new file mode 100644
index 0000000..f75c4a4
--- /dev/null
+++ b/src/app/shared/generated/model/getWorkspaceConfigResponseRoutes.ts
@@ -0,0 +1,20 @@
+/**
+ * onecx-shell-bff
+ * OneCx shell Bff
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+import { WebComponentRoute } from './webComponentRoute';
+import { AngularRoute } from './angularRoute';
+
+
+export interface GetWorkspaceConfigResponseRoutes {
+ angularRoutes?: Array;
+ webComponentRoutes?: Array;
+}
+
diff --git a/src/app/shared/generated/model/getWorkspaceConfigResponseRoutesInner.ts b/src/app/shared/generated/model/getWorkspaceConfigResponseRoutesInner.ts
new file mode 100644
index 0000000..9c20349
--- /dev/null
+++ b/src/app/shared/generated/model/getWorkspaceConfigResponseRoutesInner.ts
@@ -0,0 +1,30 @@
+/**
+ * onecx-shell-bff
+ * OneCx shell Bff
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+import { WebComponentRoute } from './webComponentRoute';
+import { AngularRoute } from './angularRoute';
+import { PathMatch } from './pathMatch';
+import { Technologies } from './technologies';
+
+
+export interface GetWorkspaceConfigResponseRoutesInner {
+ url: string;
+ baseUrl: string;
+ remoteEntryUrl: string;
+ appId: string;
+ productName: string;
+ technology?: Technologies;
+ exposedModule: string;
+ pathMatch: PathMatch;
+}
+
+
+
diff --git a/src/app/shared/generated/model/layoutAndThemeSettings.ts b/src/app/shared/generated/model/layoutAndThemeSettings.ts
new file mode 100644
index 0000000..80719ea
--- /dev/null
+++ b/src/app/shared/generated/model/layoutAndThemeSettings.ts
@@ -0,0 +1,22 @@
+/**
+ * onecx-shell-bff
+ * OneCx shell Bff
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+import { ColorScheme } from './colorScheme';
+import { MenuMode } from './menuMode';
+
+
+export interface LayoutAndThemeSettings {
+ colorScheme?: ColorScheme;
+ menuMode?: MenuMode;
+}
+
+
+
diff --git a/src/app/shared/generated/model/localeAndTimeSettings.ts b/src/app/shared/generated/model/localeAndTimeSettings.ts
new file mode 100644
index 0000000..d11ebd4
--- /dev/null
+++ b/src/app/shared/generated/model/localeAndTimeSettings.ts
@@ -0,0 +1,18 @@
+/**
+ * onecx-shell-bff
+ * OneCx shell Bff
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+export interface LocaleAndTimeSettings {
+ locale?: string;
+ timezone?: string;
+}
+
diff --git a/src/app/shared/generated/model/menuMode.ts b/src/app/shared/generated/model/menuMode.ts
new file mode 100644
index 0000000..f1221b4
--- /dev/null
+++ b/src/app/shared/generated/model/menuMode.ts
@@ -0,0 +1,21 @@
+/**
+ * onecx-shell-bff
+ * OneCx shell Bff
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+export enum MenuMode {
+ HORIZONTAL = 'HORIZONTAL',
+ STATIC = 'STATIC',
+ OVERLAY = 'OVERLAY',
+ SLIM = 'SLIM',
+ SLIMPLUS = 'SLIMPLUS'
+}
+
diff --git a/src/app/shared/generated/model/models.ts b/src/app/shared/generated/model/models.ts
new file mode 100644
index 0000000..1c84de1
--- /dev/null
+++ b/src/app/shared/generated/model/models.ts
@@ -0,0 +1,25 @@
+export * from './accountSettings';
+export * from './colorScheme';
+export * from './getPermissionsRequest';
+export * from './getPermissionsResponse';
+export * from './getUserProfileResponse';
+export * from './getWorkspaceConfigRequest';
+export * from './getWorkspaceConfigResponse';
+export * from './layoutAndThemeSettings';
+export * from './localeAndTimeSettings';
+export * from './menuMode';
+export * from './pathMatch';
+export * from './phoneType';
+export * from './problemDetailInvalidParam';
+export * from './problemDetailParam';
+export * from './problemDetailResponse';
+export * from './remoteComponent';
+export * from './remoteComponentMapping';
+export * from './route';
+export * from './technologies';
+export * from './theme';
+export * from './userPerson';
+export * from './userPersonAddress';
+export * from './userPersonPhone';
+export * from './userProfile';
+export * from './workspace';
diff --git a/src/app/shared/generated/model/pathMatch.ts b/src/app/shared/generated/model/pathMatch.ts
new file mode 100644
index 0000000..aa85f90
--- /dev/null
+++ b/src/app/shared/generated/model/pathMatch.ts
@@ -0,0 +1,18 @@
+/**
+ * onecx-shell-bff
+ * OneCx shell Bff
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+export enum PathMatch {
+ full = 'full',
+ prefix = 'prefix'
+}
+
diff --git a/src/app/shared/generated/model/phoneType.ts b/src/app/shared/generated/model/phoneType.ts
new file mode 100644
index 0000000..1f2a767
--- /dev/null
+++ b/src/app/shared/generated/model/phoneType.ts
@@ -0,0 +1,18 @@
+/**
+ * onecx-shell-bff
+ * OneCx shell Bff
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+export enum PhoneType {
+ MOBILE = 'MOBILE',
+ LANDLINE = 'LANDLINE'
+}
+
diff --git a/src/app/shared/generated/model/problemDetailInvalidParam.ts b/src/app/shared/generated/model/problemDetailInvalidParam.ts
new file mode 100644
index 0000000..92a4204
--- /dev/null
+++ b/src/app/shared/generated/model/problemDetailInvalidParam.ts
@@ -0,0 +1,18 @@
+/**
+ * onecx-shell-bff
+ * OneCx shell Bff
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+export interface ProblemDetailInvalidParam {
+ name?: string;
+ message?: string;
+}
+
diff --git a/src/app/shared/generated/model/problemDetailParam.ts b/src/app/shared/generated/model/problemDetailParam.ts
new file mode 100644
index 0000000..11bebf7
--- /dev/null
+++ b/src/app/shared/generated/model/problemDetailParam.ts
@@ -0,0 +1,18 @@
+/**
+ * onecx-shell-bff
+ * OneCx shell Bff
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+export interface ProblemDetailParam {
+ key?: string;
+ value?: string;
+}
+
diff --git a/src/app/shared/generated/model/problemDetailResponse.ts b/src/app/shared/generated/model/problemDetailResponse.ts
new file mode 100644
index 0000000..c683932
--- /dev/null
+++ b/src/app/shared/generated/model/problemDetailResponse.ts
@@ -0,0 +1,22 @@
+/**
+ * onecx-shell-bff
+ * OneCx shell Bff
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+import { ProblemDetailInvalidParam } from './problemDetailInvalidParam';
+import { ProblemDetailParam } from './problemDetailParam';
+
+
+export interface ProblemDetailResponse {
+ errorCode?: string;
+ detail?: string;
+ params?: Array;
+ invalidParams?: Array;
+}
+
diff --git a/src/app/shared/generated/model/remoteComponent.ts b/src/app/shared/generated/model/remoteComponent.ts
new file mode 100644
index 0000000..5e43ebb
--- /dev/null
+++ b/src/app/shared/generated/model/remoteComponent.ts
@@ -0,0 +1,22 @@
+/**
+ * onecx-shell-bff
+ * OneCx shell Bff
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+export interface RemoteComponent {
+ name: string;
+ baseUrl: string;
+ remoteEntryUrl: string;
+ appId: string;
+ productName: string;
+ exposedModule: string;
+}
+
diff --git a/src/app/shared/generated/model/remoteComponentMapping.ts b/src/app/shared/generated/model/remoteComponentMapping.ts
new file mode 100644
index 0000000..0d1d648
--- /dev/null
+++ b/src/app/shared/generated/model/remoteComponentMapping.ts
@@ -0,0 +1,18 @@
+/**
+ * onecx-shell-bff
+ * OneCx shell Bff
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+export interface RemoteComponentMapping {
+ slotName: string;
+ remoteComponent: string;
+}
+
diff --git a/src/app/shared/generated/model/route.ts b/src/app/shared/generated/model/route.ts
new file mode 100644
index 0000000..e06826b
--- /dev/null
+++ b/src/app/shared/generated/model/route.ts
@@ -0,0 +1,29 @@
+/**
+ * onecx-shell-bff
+ * OneCx shell Bff
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+import { PathMatch } from './pathMatch';
+import { Technologies } from './technologies';
+
+
+export interface Route {
+ url: string;
+ baseUrl: string;
+ remoteEntryUrl: string;
+ appId: string;
+ productName: string;
+ technology?: Technologies;
+ exposedModule: string;
+ pathMatch: PathMatch;
+ remoteName?: string;
+}
+
+
+
diff --git a/src/app/shared/generated/model/technologies.ts b/src/app/shared/generated/model/technologies.ts
new file mode 100644
index 0000000..118babc
--- /dev/null
+++ b/src/app/shared/generated/model/technologies.ts
@@ -0,0 +1,18 @@
+/**
+ * onecx-shell-bff
+ * OneCx shell Bff
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+export enum Technologies {
+ Angular = 'Angular',
+ WebComponent = 'WebComponent'
+}
+
diff --git a/src/app/shared/generated/model/theme.ts b/src/app/shared/generated/model/theme.ts
new file mode 100644
index 0000000..be152c4
--- /dev/null
+++ b/src/app/shared/generated/model/theme.ts
@@ -0,0 +1,25 @@
+/**
+ * onecx-shell-bff
+ * OneCx shell Bff
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+export interface Theme {
+ name: string;
+ cssFile?: string;
+ description?: string;
+ assetsUrl?: string;
+ logoUrl?: string;
+ faviconUrl?: string;
+ previewImageUrl?: string;
+ assetsUpdateDate?: string;
+ properties: string;
+}
+
diff --git a/src/app/shared/generated/model/themePropertiesValue.ts b/src/app/shared/generated/model/themePropertiesValue.ts
new file mode 100644
index 0000000..467a3a8
--- /dev/null
+++ b/src/app/shared/generated/model/themePropertiesValue.ts
@@ -0,0 +1,17 @@
+/**
+ * Shell BFF
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+export interface ThemePropertiesValue {
+ key?: string;
+}
+
diff --git a/src/app/shared/generated/model/userPerson.ts b/src/app/shared/generated/model/userPerson.ts
new file mode 100644
index 0000000..e6b8cbd
--- /dev/null
+++ b/src/app/shared/generated/model/userPerson.ts
@@ -0,0 +1,24 @@
+/**
+ * onecx-shell-bff
+ * OneCx shell Bff
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+import { UserPersonPhone } from './userPersonPhone';
+import { UserPersonAddress } from './userPersonAddress';
+
+
+export interface UserPerson {
+ firstName?: string;
+ lastName?: string;
+ displayName?: string;
+ email?: string;
+ address?: UserPersonAddress;
+ phone?: UserPersonPhone;
+}
+
diff --git a/src/app/shared/generated/model/userPersonAddress.ts b/src/app/shared/generated/model/userPersonAddress.ts
new file mode 100644
index 0000000..ce300cb
--- /dev/null
+++ b/src/app/shared/generated/model/userPersonAddress.ts
@@ -0,0 +1,21 @@
+/**
+ * onecx-shell-bff
+ * OneCx shell Bff
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+export interface UserPersonAddress {
+ street?: string;
+ streetNo?: string;
+ city?: string;
+ postalCode?: string;
+ country?: string;
+}
+
diff --git a/src/app/shared/generated/model/userPersonPhone.ts b/src/app/shared/generated/model/userPersonPhone.ts
new file mode 100644
index 0000000..60d60fa
--- /dev/null
+++ b/src/app/shared/generated/model/userPersonPhone.ts
@@ -0,0 +1,21 @@
+/**
+ * onecx-shell-bff
+ * OneCx shell Bff
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+import { PhoneType } from './phoneType';
+
+
+export interface UserPersonPhone {
+ type?: PhoneType;
+ number?: string;
+}
+
+
+
diff --git a/src/app/shared/generated/model/userProfile.ts b/src/app/shared/generated/model/userProfile.ts
new file mode 100644
index 0000000..243c2eb
--- /dev/null
+++ b/src/app/shared/generated/model/userProfile.ts
@@ -0,0 +1,21 @@
+/**
+ * onecx-shell-bff
+ * OneCx shell Bff
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+import { AccountSettings } from './accountSettings';
+import { UserPerson } from './userPerson';
+
+
+export interface UserProfile {
+ userId: string;
+ person: UserPerson;
+ accountSettings?: AccountSettings;
+}
+
diff --git a/src/app/shared/generated/model/userProfileLayoutAndThemeSettings.ts b/src/app/shared/generated/model/userProfileLayoutAndThemeSettings.ts
new file mode 100644
index 0000000..47ca92c
--- /dev/null
+++ b/src/app/shared/generated/model/userProfileLayoutAndThemeSettings.ts
@@ -0,0 +1,32 @@
+/**
+ * Shell BFF
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+export interface UserProfileLayoutAndThemeSettings {
+ colorScheme?: UserProfileLayoutAndThemeSettingsColorSchemeEnum;
+ menuMode?: UserProfileLayoutAndThemeSettingsMenuModeEnum;
+}
+export enum UserProfileLayoutAndThemeSettingsColorSchemeEnum {
+ Auto = 'AUTO',
+ Light = 'LIGHT',
+ Dark = 'DARK'
+};
+export enum UserProfileLayoutAndThemeSettingsMenuModeEnum {
+ Horizontal = 'HORIZONTAL',
+ Static = 'STATIC',
+ Overlay = 'OVERLAY',
+ Slim = 'SLIM',
+ Slimplus = 'SLIMPLUS'
+};
+
+
+
diff --git a/src/app/shared/generated/model/userProfileLocaleAndTimeSettings.ts b/src/app/shared/generated/model/userProfileLocaleAndTimeSettings.ts
new file mode 100644
index 0000000..0d9b84d
--- /dev/null
+++ b/src/app/shared/generated/model/userProfileLocaleAndTimeSettings.ts
@@ -0,0 +1,18 @@
+/**
+ * Shell BFF
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+export interface UserProfileLocaleAndTimeSettings {
+ locale?: string;
+ timeZone?: string;
+}
+
diff --git a/src/app/shared/generated/model/webComponentRoute.ts b/src/app/shared/generated/model/webComponentRoute.ts
new file mode 100644
index 0000000..a8b212d
--- /dev/null
+++ b/src/app/shared/generated/model/webComponentRoute.ts
@@ -0,0 +1,29 @@
+/**
+ * onecx-shell-bff
+ * OneCx shell Bff
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+import { PathMatch } from './pathMatch';
+import { Technologies } from './technologies';
+
+
+export interface WebComponentRoute {
+ remoteName: string;
+ url: string;
+ baseUrl: string;
+ remoteEntryUrl: string;
+ appId: string;
+ productName: string;
+ technology?: Technologies;
+ exposedModule: string;
+ pathMatch: PathMatch;
+}
+
+
+
diff --git a/src/app/shared/generated/model/workspace.ts b/src/app/shared/generated/model/workspace.ts
new file mode 100644
index 0000000..90daced
--- /dev/null
+++ b/src/app/shared/generated/model/workspace.ts
@@ -0,0 +1,18 @@
+/**
+ * onecx-shell-bff
+ * OneCx shell Bff
+ *
+ * The version of the OpenAPI document: 1.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+export interface Workspace {
+ name: string;
+ baseUrl: string;
+}
+
diff --git a/src/app/shared/generated/param.ts b/src/app/shared/generated/param.ts
new file mode 100644
index 0000000..78a2d20
--- /dev/null
+++ b/src/app/shared/generated/param.ts
@@ -0,0 +1,69 @@
+/**
+ * Standard parameter styles defined by OpenAPI spec
+ */
+export type StandardParamStyle =
+ | 'matrix'
+ | 'label'
+ | 'form'
+ | 'simple'
+ | 'spaceDelimited'
+ | 'pipeDelimited'
+ | 'deepObject'
+ ;
+
+/**
+ * The OpenAPI standard {@link StandardParamStyle}s may be extended by custom styles by the user.
+ */
+export type ParamStyle = StandardParamStyle | string;
+
+/**
+ * Standard parameter locations defined by OpenAPI spec
+ */
+export type ParamLocation = 'query' | 'header' | 'path' | 'cookie';
+
+/**
+ * Standard types as defined in OpenAPI Specification: Data Types
+ */
+export type StandardDataType =
+ | "integer"
+ | "number"
+ | "boolean"
+ | "string"
+ | "object"
+ | "array"
+ ;
+
+/**
+ * Standard {@link DataType}s plus your own types/classes.
+ */
+export type DataType = StandardDataType | string;
+
+/**
+ * Standard formats as defined in OpenAPI Specification: Data Types
+ */
+export type StandardDataFormat =
+ | "int32"
+ | "int64"
+ | "float"
+ | "double"
+ | "byte"
+ | "binary"
+ | "date"
+ | "date-time"
+ | "password"
+ ;
+
+export type DataFormat = StandardDataFormat | string;
+
+/**
+ * The parameter to encode.
+ */
+export interface Param {
+ name: string;
+ value: unknown;
+ in: ParamLocation;
+ style: ParamStyle,
+ explode: boolean;
+ dataType: DataType;
+ dataFormat: DataFormat | undefined;
+}
diff --git a/src/app/shared/generated/variables.ts b/src/app/shared/generated/variables.ts
new file mode 100644
index 0000000..6fe5854
--- /dev/null
+++ b/src/app/shared/generated/variables.ts
@@ -0,0 +1,9 @@
+import { InjectionToken } from '@angular/core';
+
+export const BASE_PATH = new InjectionToken('basePath');
+export const COLLECTION_FORMATS = {
+ 'csv': ',',
+ 'tsv': ' ',
+ 'ssv': ' ',
+ 'pipes': '|'
+}
diff --git a/src/app/shared/services/routes.service.ts b/src/app/shared/services/routes.service.ts
new file mode 100644
index 0000000..2c8aac9
--- /dev/null
+++ b/src/app/shared/services/routes.service.ts
@@ -0,0 +1,195 @@
+import { Injectable } from '@angular/core';
+import { Route, Router } from '@angular/router';
+import { PathMatch, PermissionBffService } from '../generated';
+import { appRoutes } from 'src/app/app.routes';
+import {
+ LoadRemoteModuleOptions,
+ loadRemoteModule,
+} from '@angular-architects/module-federation';
+import {
+ AppStateService,
+ CONFIG_KEY,
+ ConfigurationService,
+ PortalMessageService,
+} from '@onecx/portal-integration-angular';
+import { Route as BffGeneratedRoute } from '../generated/model/route';
+import { ErrorPageComponent } from '../components/error-page.component';
+import { PermissionsCacheService } from '@onecx/shell-core';
+import { firstValueFrom, map } from 'rxjs';
+import { PermissionsTopic } from '@onecx/integration-interface';
+import { HomeComponent } from '../components/home/home.component';
+import { WebComponentRoute } from '../generated/model/webComponentRoute';
+import { Location } from '@angular/common';
+
+export const DEFAULT_CATCH_ALL_ROUTE: Route = {
+ path: '**',
+ component: ErrorPageComponent,
+};
+
+@Injectable({ providedIn: 'root' })
+export class RoutesService {
+ private permissionsTopic$ = new PermissionsTopic();
+
+ constructor(
+ private router: Router,
+ private appStateService: AppStateService,
+ private portalMessageService: PortalMessageService,
+ private configurationService: ConfigurationService,
+ private permissionsCacheService: PermissionsCacheService,
+ private permissionsService: PermissionBffService
+ ) {}
+
+ async init(routes: BffGeneratedRoute[]): Promise {
+ const workspaceBaseUrl =
+ this.appStateService.currentWorkspace$.getValue()?.baseUrl;
+ const genreatedRoutes = routes.map((r) =>
+ this.convertToRoute(r, workspaceBaseUrl ?? '')
+ );
+ if (!this.containsRouteForWorkspace(routes)) {
+ console.log(`Adding fallback route for base url ${workspaceBaseUrl}`);
+ genreatedRoutes.push(this.createFallbackRoute());
+ }
+ this.router.resetConfig([
+ ...appRoutes,
+ ...genreatedRoutes.sort(
+ (a, b) => (b.path || '')?.length - (a.path || '')?.length
+ ),
+ DEFAULT_CATCH_ALL_ROUTE,
+ ]);
+ console.log(
+ `🧭 Adding App routes: \n${routes
+ .map((lr) => `${lr.url} -> ${JSON.stringify(workspaceBaseUrl + lr.baseUrl)}`)
+ .join('\t\n')}`
+ );
+ return Promise.resolve();
+ }
+
+ private convertToRoute(
+ r: BffGeneratedRoute,
+ workspaceBaseUrl: string
+ ): Route {
+ const joinedBaseUrl = Location.joinWithSlash(workspaceBaseUrl, r.baseUrl);
+ return {
+ path: this.toRouteUrl(joinedBaseUrl),
+ data: {
+ module: r.exposedModule,
+ breadcrumb: r.productName,
+ },
+ pathMatch: r.pathMatch ?? (joinedBaseUrl.endsWith('$') ? 'full' : 'prefix'),
+ loadChildren: async () => await this.loadChildren(r, joinedBaseUrl),
+ canActivateChild: [() => this.updateMfeInfo(r, joinedBaseUrl)],
+ };
+ }
+
+ private async loadChildren(r: BffGeneratedRoute, joinedBaseUrl: string) {
+ await this.appStateService.globalLoading$.publish(true);
+ console.log(`➡ Load remote module ${r.exposedModule}`);
+ try {
+ try {
+ await this.updateMfeInfo(r, joinedBaseUrl);
+ const permissions = await firstValueFrom(
+ this.permissionsCacheService.getPermissions(
+ r.appId,
+ r.productName,
+ (appId, productName) =>
+ this.permissionsService
+ .getPermissions({ appId, productName })
+ .pipe(map(({ permissions }) => permissions))
+ )
+ );
+ await this.permissionsTopic$.publish(permissions);
+ const m = await loadRemoteModule(this.toLoadRemoteEntryOptions(r));
+ console.log(`Load remote module ${r.exposedModule} finished`);
+ return m[r.exposedModule];
+ } catch (err) {
+ return this.onRemoteLoadError(err);
+ }
+ } finally {
+ this.appStateService.globalLoading$.publish(false);
+ }
+ }
+
+ private async updateMfeInfo(r: BffGeneratedRoute, joinedBaseUrl: string) {
+ const mfeInfo = {
+ baseHref: joinedBaseUrl,
+ mountPath: joinedBaseUrl,
+ shellName: 'portal',
+ remoteBaseUrl: r.url,
+ displayName: r.productName,
+ appId: r.appId,
+ productName: r.productName,
+ };
+ return await this.appStateService.currentMfe$.publish(mfeInfo);
+ }
+
+ private onRemoteLoadError(err: unknown) {
+ console.log(`Failed to load remote module: ${err}`);
+ this.portalMessageService.error({
+ summaryKey: 'MESSAGE.ON_REMOTE_LOAD_ERROR',
+ });
+ throw err;
+ }
+
+ private toLoadRemoteEntryOptions(
+ r: BffGeneratedRoute
+ ): LoadRemoteModuleOptions {
+ if (r.technology === 'Angular') {
+ return {
+ type: 'module',
+ remoteEntry: r.remoteEntryUrl,
+ exposedModule: './' + r.exposedModule,
+ };
+ }
+ return {
+ type: 'script',
+ remoteName: (r as WebComponentRoute).productName,
+ remoteEntry: r.remoteEntryUrl,
+ exposedModule: './' + r.exposedModule,
+ };
+ }
+
+ private toRouteUrl(url: string | undefined) {
+ if (!url) {
+ return url;
+ }
+ const SHELL_BASE_HREF = this.configurationService.getProperty(
+ CONFIG_KEY.APP_BASE_HREF
+ );
+ if (SHELL_BASE_HREF && url.startsWith(SHELL_BASE_HREF)) {
+ url = url.slice(SHELL_BASE_HREF.length);
+ }
+
+ if (url?.startsWith('/')) {
+ url = url.substring(1);
+ }
+ if (url.endsWith('$')) {
+ url = url.substring(0, url.length - 1);
+ }
+ if (url.endsWith('/')) {
+ url = url.substring(0, url.length - 1);
+ }
+ return url;
+ }
+
+ private containsRouteForWorkspace(routes: BffGeneratedRoute[]): boolean {
+ return (
+ routes.find(
+ (r) =>
+ r.url ===
+ this.toRouteUrl(
+ this.appStateService.currentWorkspace$.getValue()?.baseUrl
+ )
+ ) === undefined
+ );
+ }
+
+ private createFallbackRoute(): Route {
+ return {
+ path: this.toRouteUrl(
+ this.appStateService.currentWorkspace$.getValue()?.baseUrl
+ )!,
+ component: HomeComponent,
+ pathMatch: PathMatch.full,
+ };
+ }
+}
diff --git a/src/app/shared/services/shell-slot.service.ts b/src/app/shared/services/shell-slot.service.ts
new file mode 100644
index 0000000..7fb7d63
--- /dev/null
+++ b/src/app/shared/services/shell-slot.service.ts
@@ -0,0 +1,104 @@
+import { loadRemoteModule } from '@angular-architects/module-federation';
+import { Injectable, Type } from '@angular/core';
+import { RemoteComponentsTopic } from '@onecx/integration-interface';
+import { SlotService } from '@onecx/angular-remote-components';
+import { Observable, from, map, mergeMap, zip } from 'rxjs';
+import {
+ PermissionBffService,
+ RemoteComponent,
+ RemoteComponentMapping,
+} from '../generated';
+import { RemoteComponentInfo } from '@onecx/angular-remote-components';
+import { PermissionsCacheService } from '@onecx/shell-core';
+
+@Injectable()
+export class ShellSlotService implements SlotService {
+ remoteComponents$ = new RemoteComponentsTopic();
+ remoteComponentMappings: RemoteComponentMapping[] | undefined;
+
+ constructor(
+ private permissionsService: PermissionBffService,
+ private permissionsCacheService: PermissionsCacheService
+ ) {}
+
+ async init(): Promise {
+ return Promise.resolve();
+ }
+
+ getComponentsForSlot(slotName: string): Observable<
+ {
+ componentType: Type;
+ remoteComponent: RemoteComponentInfo;
+ permissions: string[];
+ }[]
+ > {
+ return this.remoteComponents$.pipe(
+ map((remoteComponents) =>
+ (
+ this.remoteComponentMappings?.filter(
+ (remoteComponentMappings) =>
+ remoteComponentMappings.slotName === slotName
+ ) ?? []
+ )
+ .map((remoteComponentMappings) =>
+ remoteComponents.find(
+ (rc) => rc.name === remoteComponentMappings.remoteComponent
+ )
+ )
+ .filter((remoteComponent) => !!remoteComponent)
+ .map((remoteComponent) => remoteComponent as RemoteComponent)
+ ),
+ mergeMap((remoteComponents: RemoteComponent[]) =>
+ zip(
+ remoteComponents.map((remoteComponent) =>
+ this.permissionsCacheService
+ .getPermissions(
+ remoteComponent.appId,
+ remoteComponent.productName,
+ (appId, productName) =>
+ this.permissionsService
+ .getPermissions({ appId, productName })
+ .pipe(map(({ permissions }) => permissions))
+ )
+ .pipe(map((permissions) => ({ remoteComponent, permissions })))
+ )
+ )
+ ),
+ mergeMap((infos) =>
+ from(
+ Promise.all(
+ infos.map(({ remoteComponent, permissions }) =>
+ this.loadComponent(remoteComponent).then((componentType) => ({
+ componentType,
+ remoteComponent,
+ permissions,
+ }))
+ )
+ )
+ )
+ )
+ );
+ }
+
+ private async loadComponent(component: {
+ remoteEntryUrl: string;
+ exposedModule: string;
+ }): Promise> {
+ try {
+ const m = await loadRemoteModule({
+ type: 'module',
+ remoteEntry: component.remoteEntryUrl,
+ exposedModule: './' + component.exposedModule,
+ });
+ return m[component.exposedModule];
+ } catch (e) {
+ console.log(
+ 'Failed to load remote module ',
+ e,
+ component.remoteEntryUrl,
+ component.exposedModule
+ );
+ throw e;
+ }
+ }
+}
diff --git a/src/assets/.gitkeep b/src/assets/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/src/assets/env.json b/src/assets/env.json
new file mode 100644
index 0000000..6576133
--- /dev/null
+++ b/src/assets/env.json
@@ -0,0 +1,8 @@
+{
+ "APP_BASE_HREF": "${APP_BASE_HREF}",
+ "KEYCLOAK_REALM": "${KEYCLOAK_REALM}",
+ "KEYCLOAK_URL": "${KEYCLOAK_URL}",
+ "KEYCLOAK_CLIENT_ID": "${KEYCLOAK_CLIENT_ID}",
+ "APP_VERSION": "${APP_VERSION}",
+ "IS_SHELL": true
+}
\ No newline at end of file
diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json
new file mode 100644
index 0000000..f932e37
--- /dev/null
+++ b/src/assets/i18n/de.json
@@ -0,0 +1,5 @@
+{
+ "ERROR_PAGE_H1": "Oops, das konnte nicht gefunden werden.",
+ "PAGE_NOT_FOUND": "Seite nicht gefunden.",
+ "TO_HOME_PAGE": "Gehe zu der Startseite."
+}
\ No newline at end of file
diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json
new file mode 100644
index 0000000..d3ef746
--- /dev/null
+++ b/src/assets/i18n/en.json
@@ -0,0 +1,5 @@
+{
+ "ERROR_PAGE_H1": "Oops, we could not find that.",
+ "PAGE_NOT_FOUND": "Page not found.",
+ "TO_HOME_PAGE": "Go to home page."
+}
\ No newline at end of file
diff --git a/src/assets/swagger/shell-bff.yaml b/src/assets/swagger/shell-bff.yaml
new file mode 100644
index 0000000..aa9c3f6
--- /dev/null
+++ b/src/assets/swagger/shell-bff.yaml
@@ -0,0 +1,420 @@
+---
+openapi: 3.0.3
+info:
+ title: onecx-shell-bff
+ description: OneCx shell Bff
+ version: "1.0"
+servers:
+ - url: http://onecx-shell-bff:8080/
+
+paths:
+ /workspaceConfig:
+ post:
+ x-onecx:
+ permissions:
+ workspaceConfig:
+ - read
+ tags:
+ - "WorkspaceConfig"
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/GetWorkspaceConfigRequest'
+ operationId: getWorkspaceConfig
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/GetWorkspaceConfigResponse'
+ '400':
+ description: Bad request
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ProblemDetailResponse'
+ '404':
+ description: 'Not Found'
+
+ /workspaceConfig/themes/{name}/favicon:
+ get:
+ x-onecx:
+ permissions:
+ workspaceConfig:
+ - read
+ tags:
+ - "WorkspaceConfig"
+ description: Load favicon by theme name
+ operationId: getThemeFaviconByName
+ parameters:
+ - name: name
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ 200:
+ description: OK
+ content:
+ image/*:
+ schema:
+ minimum: 1
+ maximum: 110000
+ type: string
+ format: binary
+ 404:
+ description: Not found
+
+ /userProfile:
+ get:
+ x-onecx:
+ permissions:
+ userProfile:
+ - read
+ tags:
+ - userProfile
+ operationId: getUserProfile
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/GetUserProfileResponse'
+ '400':
+ description: Bad request
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ProblemDetailResponse'
+ '404':
+ description: 'Not Found'
+
+ /permissions:
+ post:
+ x-onecx:
+ permissions:
+ permission:
+ - read
+ tags:
+ - permission
+ operationId: getPermissions
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/GetPermissionsRequest'
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/GetPermissionsResponse'
+ '400':
+ description: Bad request
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ProblemDetailResponse'
+ '404':
+ description: 'Not Found'
+
+components:
+ schemas:
+ GetWorkspaceConfigResponse:
+ type: object
+ required:
+ - 'routes'
+ - 'theme'
+ - 'workspace'
+ - 'remoteComponents'
+ - 'shellRemoteComponents'
+ properties:
+ routes:
+ type: array
+ items:
+ $ref: '#/components/schemas/Route'
+ theme:
+ $ref: '#/components/schemas/Theme'
+ workspace:
+ $ref: '#/components/schemas/Workspace'
+ remoteComponents:
+ type: array
+ items:
+ $ref: '#/components/schemas/RemoteComponent'
+ shellRemoteComponents:
+ type: array
+ items:
+ $ref: '#/components/schemas/RemoteComponentMapping'
+
+ GetWorkspaceConfigRequest:
+ type: object
+ required:
+ - baseUrl
+ properties:
+ baseUrl:
+ type: string
+
+ GetPermissionsRequest:
+ type: object
+ required:
+ - appId
+ - productName
+ properties:
+ appId:
+ type: string
+ productName:
+ type: string
+
+ Workspace:
+ type: object
+ required:
+ - name
+ - baseUrl
+ properties:
+ name:
+ type: string
+ baseUrl:
+ type: string
+
+ Theme:
+ required:
+ - name
+ - properties
+ type: object
+ properties:
+ name:
+ minLength: 2
+ type: string
+ cssFile:
+ type: string
+ description:
+ type: string
+ assetsUrl:
+ type: string
+ logoUrl:
+ type: string
+ faviconUrl:
+ type: string
+ previewImageUrl:
+ type: string
+ assetsUpdateDate:
+ type: string
+ properties:
+ type: string
+
+ Route:
+ type: object
+ required:
+ - 'url'
+ - 'baseUrl'
+ - 'remoteEntryUrl'
+ - 'type'
+ - 'exposedModule'
+ - 'appId'
+ - 'productName'
+ - 'pathMatch'
+ properties:
+ url:
+ type: string
+ baseUrl:
+ type: string
+ remoteEntryUrl:
+ type: string
+ appId:
+ type: string
+ productName:
+ type: string
+ technology:
+ $ref: '#/components/schemas/Technologies'
+ exposedModule:
+ type: string
+ pathMatch:
+ $ref: '#/components/schemas/PathMatch'
+ remoteName:
+ type: string
+
+ Technologies:
+ type: string
+ enum: ['Angular', 'WebComponent']
+
+ PathMatch:
+ type: string
+ enum: ['full', 'prefix']
+
+ RemoteComponent:
+ type: object
+ required:
+ - 'name'
+ - 'url'
+ - 'baseUrl'
+ - 'remoteEntryUrl'
+ - 'exposedModule'
+ - 'appId'
+ - 'productName'
+ properties:
+ name:
+ type: string
+ baseUrl:
+ type: string
+ remoteEntryUrl:
+ type: string
+ appId:
+ type: string
+ productName:
+ type: string
+ exposedModule:
+ type: string
+
+ RemoteComponentMapping:
+ type: object
+ required:
+ - 'slotName'
+ - 'remoteComponent'
+ properties:
+ slotName:
+ type: string
+ remoteComponent:
+ type: string
+
+ GetUserProfileResponse:
+ type: object
+ required:
+ - 'userProfile'
+ properties:
+ userProfile:
+ $ref: '#/components/schemas/UserProfile'
+
+ UserProfile:
+ type: object
+ required:
+ - 'userId'
+ - 'person'
+ properties:
+ userId:
+ type: string
+ person:
+ $ref: '#/components/schemas/UserPerson'
+ accountSettings:
+ $ref: '#/components/schemas/AccountSettings'
+
+ UserPerson:
+ type: object
+ properties:
+ firstName:
+ type: string
+ lastName:
+ type: string
+ displayName:
+ type: string
+ email:
+ type: string
+ address:
+ $ref: '#/components/schemas/UserPersonAddress'
+ phone:
+ $ref: '#/components/schemas/UserPersonPhone'
+
+ UserPersonAddress:
+ type: object
+ properties:
+ street:
+ type: string
+ streetNo:
+ type: string
+ city:
+ type: string
+ postalCode:
+ type: string
+ country:
+ type: string
+
+ UserPersonPhone:
+ type: object
+ properties:
+ type:
+ $ref: '#/components/schemas/PhoneType'
+ number:
+ type: string
+
+ PhoneType:
+ type: string
+ enum: ['MOBILE', 'LANDLINE']
+
+ AccountSettings:
+ type: object
+ properties:
+ layoutAndThemeSettings:
+ $ref: '#/components/schemas/LayoutAndThemeSettings'
+ localeAndTimeSettings:
+ $ref: '#/components/schemas/LocaleAndTimeSettings'
+
+ LayoutAndThemeSettings:
+ type: object
+ properties:
+ colorScheme:
+ $ref: '#/components/schemas/ColorScheme'
+ menuMode:
+ $ref: '#/components/schemas/MenuMode'
+
+ ColorScheme:
+ type: string
+ enum: ['AUTO', 'LIGHT', 'DARK']
+
+ MenuMode:
+ type: string
+ enum: ['HORIZONTAL', 'STATIC', 'OVERLAY', 'SLIM', 'SLIMPLUS']
+
+ LocaleAndTimeSettings:
+ type: object
+ properties:
+ locale:
+ type: string
+ timezone:
+ type: string
+
+ GetPermissionsResponse:
+ type: object
+ required:
+ - permissions
+ properties:
+ permissions:
+ type: array
+ items:
+ type: string
+
+ ProblemDetailResponse:
+ type: object
+ properties:
+ errorCode:
+ type: string
+ detail:
+ type: string
+ params:
+ type: array
+ items:
+ $ref: '#/components/schemas/ProblemDetailParam'
+ invalidParams:
+ type: array
+ items:
+ $ref: '#/components/schemas/ProblemDetailInvalidParam'
+
+ ProblemDetailParam:
+ type: object
+ properties:
+ key:
+ type: string
+ value:
+ type: string
+
+ ProblemDetailInvalidParam:
+ type: object
+ properties:
+ name:
+ type: string
+ message:
+ type: string
\ No newline at end of file
diff --git a/src/environments/environment.ts b/src/environments/environment.ts
new file mode 100644
index 0000000..8366ce2
--- /dev/null
+++ b/src/environments/environment.ts
@@ -0,0 +1,6 @@
+export const environment = {
+ KEYCLOAK_CLIENT_ID: 'portal-mf-shell',
+ KEYCLOAK_URL: 'http://keycloak-app/',
+ KEYCLOAK_REALM: 'OneCX',
+ skipRemoteConfigLoad: true,
+};
diff --git a/src/favicon.ico b/src/favicon.ico
new file mode 100644
index 0000000..317ebcb
Binary files /dev/null and b/src/favicon.ico differ
diff --git a/src/index.html b/src/index.html
new file mode 100644
index 0000000..28b9ec4
--- /dev/null
+++ b/src/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+ shell
+
+
+
+
+
+
+
+
diff --git a/src/main.ts b/src/main.ts
new file mode 100644
index 0000000..16de236
--- /dev/null
+++ b/src/main.ts
@@ -0,0 +1,6 @@
+import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
+import { AppModule } from './app/app.module';
+
+platformBrowserDynamic()
+ .bootstrapModule(AppModule)
+ .catch((err) => console.error(err));
diff --git a/src/styles.scss b/src/styles.scss
new file mode 100644
index 0000000..accadd2
--- /dev/null
+++ b/src/styles.scss
@@ -0,0 +1,100 @@
+/* You can add global styles to this file, and also import other style files */
+@import '../node_modules/primeng/resources/primeng.min.css';
+@import '../node_modules/primeflex/primeflex.scss';
+@import '../node_modules/primeicons/primeicons.css';
+
+@import '@onecx/portal-layout-styles/src/styles/shell/shell.scss';
+@import '@onecx/portal-layout-styles/src/styles/primeng/theme-light.scss';
+@import '../node_modules/@onecx/portal-integration-angular/assets/output.css';
+
+.splash {
+ opacity: 0;
+ transition: opacity 0.3s ease-in-out;
+ width: 100vw;
+ height: 100vh;
+ display: none;
+ align-items: center;
+ justify-content: center;
+ background: rgb(0, 123, 180);
+ color: white;
+ z-index: 999;
+ position: fixed;
+ top: 0;
+ left: 0;
+}
+
+onecx-root:empty + .splash {
+ // transition: all 0.5s;
+ display: flex;
+ opacity: 1;
+ // animation: fadeIn 1.5s forwards;
+}
+
+.splash-welcome {
+ padding: 10px;
+}
+
+@keyframes fadeIn {
+ to {
+ opacity: 1;
+ }
+}
+
+.splash-loader {
+ animation: rotator 1.4s linear infinite;
+}
+
+@keyframes rotator {
+ 0% {
+ transform: rotate(0deg);
+ }
+
+ 100% {
+ transform: rotate(270deg);
+ }
+}
+
+.splash-path {
+ stroke-dasharray: 187;
+ stroke-dashoffset: 0;
+ transform-origin: center;
+ animation: dash 1.4s ease-in-out infinite, colors 5.6s ease-in-out infinite;
+}
+
+@keyframes colors {
+ 0% {
+ stroke: #4285f4;
+ }
+
+ 25% {
+ stroke: #de3e35;
+ }
+
+ 50% {
+ stroke: #f7c223;
+ }
+
+ 75% {
+ stroke: #1b9a59;
+ }
+
+ 100% {
+ stroke: #4285f4;
+ }
+}
+
+@keyframes dash {
+ 0% {
+ stroke-dashoffset: 187;
+ }
+
+ 50% {
+ stroke-dashoffset: 46.75;
+ transform: rotate(135deg);
+ }
+
+ 100% {
+ stroke-dashoffset: 187;
+ transform: rotate(450deg);
+ }
+}
diff --git a/src/test-setup.ts b/src/test-setup.ts
new file mode 100644
index 0000000..ab1eeeb
--- /dev/null
+++ b/src/test-setup.ts
@@ -0,0 +1,8 @@
+// @ts-expect-error https://thymikee.github.io/jest-preset-angular/docs/getting-started/test-environment
+globalThis.ngJest = {
+ testEnvironmentOptions: {
+ errorOnUnknownElements: true,
+ errorOnUnknownProperties: true,
+ },
+};
+import 'jest-preset-angular/setup-jest';
diff --git a/tsconfig.app.json b/tsconfig.app.json
new file mode 100644
index 0000000..3c5c0c5
--- /dev/null
+++ b/tsconfig.app.json
@@ -0,0 +1,10 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "outDir": "./dist/out-tsc",
+ "types": []
+ },
+ "files": ["src/main.ts"],
+ "include": ["src/**/*.d.ts"],
+ "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"]
+}
diff --git a/tsconfig.editor.json b/tsconfig.editor.json
new file mode 100644
index 0000000..8ae117d
--- /dev/null
+++ b/tsconfig.editor.json
@@ -0,0 +1,7 @@
+{
+ "extends": "./tsconfig.json",
+ "include": ["src/**/*.ts"],
+ "compilerOptions": {
+ "types": ["jest", "node"]
+ }
+}
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..2f1afe3
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,46 @@
+{
+ "compilerOptions": {
+ "rootDir": ".",
+ "sourceMap": true,
+ "declaration": false,
+ "moduleResolution": "node",
+ "emitDecoratorMetadata": true,
+ "experimentalDecorators": true,
+ "importHelpers": true,
+ "target": "es2022",
+ "module": "esnext",
+ "lib": ["es2020", "dom"],
+ "skipLibCheck": true,
+ "skipDefaultLibCheck": true,
+ "baseUrl": ".",
+ "paths": {},
+ "useDefineForClassFields": false,
+ "forceConsistentCasingInFileNames": true,
+ "strict": true,
+ "noImplicitOverride": true,
+ "noPropertyAccessFromIndexSignature": true,
+ "noImplicitReturns": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "files": [],
+ "include": [],
+ "references": [
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.spec.json"
+ },
+ {
+ "path": "./tsconfig.editor.json"
+ }
+ ],
+ "compileOnSave": false,
+ "exclude": ["node_modules", "tmp"],
+ "angularCompilerOptions": {
+ "enableI18nLegacyMessageIdFormat": false,
+ "strictInjectionParameters": true,
+ "strictInputAccessModifiers": true,
+ "strictTemplates": true
+ }
+}
diff --git a/tsconfig.spec.json b/tsconfig.spec.json
new file mode 100644
index 0000000..1dbe7f6
--- /dev/null
+++ b/tsconfig.spec.json
@@ -0,0 +1,16 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "outDir": "./dist/out-tsc",
+ "module": "commonjs",
+ "target": "es2016",
+ "types": ["jest", "node"]
+ },
+ "files": ["src/test-setup.ts"],
+ "include": [
+ "jest.config.ts",
+ "src/**/*.test.ts",
+ "src/**/*.spec.ts",
+ "src/**/*.d.ts"
+ ]
+}
diff --git a/webpack.config.js b/webpack.config.js
new file mode 100644
index 0000000..ee413b1
--- /dev/null
+++ b/webpack.config.js
@@ -0,0 +1,63 @@
+const {
+ ModifyEntryPlugin,
+} = require('@angular-architects/module-federation/src/utils/modify-entry-plugin');
+const {
+ share,
+ withModuleFederationPlugin,
+} = require('@angular-architects/module-federation/webpack');
+
+const webpackConfig = {
+ ...withModuleFederationPlugin({
+ shared: share({
+ '@angular/core': { requiredVersion: 'auto', includeSecondaries: true, eager: true, singleton: true },
+ '@angular/forms': {
+ requiredVersion: 'auto',
+ includeSecondaries: true,
+ eager: true,
+ singleton: true
+ },
+ '@angular/common': {
+ requiredVersion: 'auto',
+ includeSecondaries: {
+ skip: ['@angular/common/http/testing'],
+ },
+ eager: true,
+ singleton: true
+ },
+ '@angular/common/http': {
+ requiredVersion: 'auto',
+ includeSecondaries: true,
+ eager: true,
+ singleton: true
+ },
+ '@angular/router': {
+ requiredVersion: 'auto',
+ includeSecondaries: true,
+ eager: true,
+ singleton: true
+ },
+ rxjs: { requiredVersion: 'auto', includeSecondaries: true, eager: true },
+ '@ngx-translate/core': {
+ singleton: true,
+ strictVersion: false,
+ requiredVersion: '^14.0.0',
+ eager: true
+ },
+ '@onecx/portal-integration-angular': {
+ requiredVersion: 'auto',
+ includeSecondaries: true,
+ eager: true
+ },
+ }),
+
+ sharedMappings: ['@onecx/portal-integration-angular'],
+ }),
+};
+const plugins = webpackConfig.plugins.filter(
+ (plugin) => !(plugin instanceof ModifyEntryPlugin)
+);
+
+module.exports = {
+ ...webpackConfig,
+ plugins,
+};