Skip to content

Commit

Permalink
feat: removing tenant id from the library, changing the frameContext …
Browse files Browse the repository at this point in the history
…to portalContext for PortalConfig (#31)

- removing tenant id from the library
- changing the frameContext to portalContext for PortalConfig
- simplyfying the CustomMessageListener, remove changed$ and changed fields from CustomMessageListener because they are unused
- organizing imports
- removing assets and replacing with inline svg data

---------

Co-authored-by: Grzegorz Krajniak <grzegorz.krajniak@sap.com>
  • Loading branch information
gkrajniak and gkrajniaksap authored Sep 23, 2024
1 parent cd4abfb commit 366fae0
Show file tree
Hide file tree
Showing 31 changed files with 73 additions and 197 deletions.
27 changes: 0 additions & 27 deletions README.md

This file was deleted.

28 changes: 0 additions & 28 deletions src/assets/mfp_logo.svg

This file was deleted.

20 changes: 0 additions & 20 deletions src/assets/mfp_mark.svg

This file was deleted.

1 change: 1 addition & 0 deletions src/lib/data/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './mfp-mark';
2 changes: 2 additions & 0 deletions src/lib/data/mfp-logo.ts

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions src/lib/data/mfp-mark.ts

Large diffs are not rendered by default.

14 changes: 14 additions & 0 deletions src/lib/models/luigi.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,17 @@
export interface LuigiConfig {
auth?: any;
routing?: any;
settings?: any;
lifecycleHooks?: any;
navigation?: any;
userSettings?: any;
globalSearch?: any;
}

export interface LuigiCustomMessage {
id: string;
}

export interface EntityDefinition {
id: string;
dynamicFetchId?: string;
Expand Down
2 changes: 0 additions & 2 deletions src/lib/models/portal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@ export interface EntityConfig {

export interface PortalConfig {
providers: ServiceProvider[];
tenantId: string;
portalContext: Record<string, any>;
frameContext: Record<string, any>;
featureToggles: Record<string, boolean>;
}
5 changes: 0 additions & 5 deletions src/lib/portal.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -161,11 +161,6 @@ export interface PortalModuleOptions {
provide: LOCAL_NODES_SERVICE_INJECTION_TOKEN,
useClass: NoopLocalNodesService,
},
{
provide: LUIGI_CUSTOM_MESSAGE_LISTENERS_INJECTION_TOKEN,
multi: true,
useValue: null,
},
],
imports: [PortalRoutingModule, BrowserModule, RouterOutlet, HttpClientModule],
exports: [PortalComponent],
Expand Down
10 changes: 5 additions & 5 deletions src/lib/services/luigi-config/auth-config.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,19 +32,19 @@ export class AuthConfigService {
accessTokenExpiringNotificationTime: 60,
expirationCheckInterval: 5,
userInfoFn: () => {
const uinfo = this.authService.getUserInfo();
const userInfo = this.authService.getUserInfo();

return new Promise((resolve) => {
fetch(uinfo.picture, {
fetch(userInfo.picture, {
method: 'HEAD',
mode: 'no-cors',
})
.then(() => {
resolve(uinfo);
resolve(userInfo);
})
.catch(() => {
uinfo.picture = '';
resolve(uinfo);
userInfo.picture = '';
resolve(userInfo);
});
});
},
Expand Down
4 changes: 0 additions & 4 deletions src/lib/services/luigi-config/custom-message-listener.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,11 @@
* A representation of a custom message listener and the custom message the listener listens on.
* See also {@link https://docs.luigi-project.io/docs/communication/?section=luigi-client-to-luigi-core}
*/
import { Observable, Subject } from 'rxjs';

export interface CustomMessageListener {
/**
* The custom message id the listener is registered for.
*/
messageId(): string;
changed$?: Subject<void>;
changed?: Observable<void>;

/**
* The callback to be executed when the custom message is send by Luigi.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,31 +1,24 @@
import { TestBed } from '@angular/core/testing';
import { LUIGI_CUSTOM_MESSAGE_LISTENERS_INJECTION_TOKEN } from '../../injection-tokens';
import { Observable, Subject } from 'rxjs';
import { CustomMessageListener } from './custom-message-listener';
import { CustomMessageListenersService } from './custom-message-listeners.service';

describe('CustomMessageListenersService', () => {
let customMessageListenersService: CustomMessageListenersService;

const projChanged$ = new Subject<void>();
const projectCreatedListener: CustomMessageListener = {
messageId(): string {
return 'ProjectCreatedListener';
},
changed$: projChanged$,
changed: projChanged$.asObservable(),
onCustomMessageReceived: jest.fn(),
};
} as CustomMessageListener;

const customChanged$ = new Subject<void>();
const entityChangedListener: CustomMessageListener = {
messageId(): string {
return 'EntityChangedListener';
},
changed$: customChanged$,
changed: customChanged$.asObservable(),
onCustomMessageReceived: jest.fn(),
};
} as CustomMessageListener;

beforeEach(() => {
TestBed.configureTestingModule({
Expand Down Expand Up @@ -85,40 +78,6 @@ describe('CustomMessageListenersService', () => {
);
});

it('should emit a change when the listener emits a change', (done) => {
const messageListeners =
customMessageListenersService.getMessageListeners();

customMessageListenersService.changed.subscribe(() => {
done();
});

messageListeners.customMessagesListeners['ProjectCreatedListener'](
{},
{},
[]
);

projectCreatedListener['changed$'].next();
});

it('should not emit a change when the listener does not emit a change', () => {
const messageListeners =
customMessageListenersService.getMessageListeners();
const changeSpy = jest.spyOn(
customMessageListenersService['changed$'],
'next'
);

messageListeners.customMessagesListeners['ProjectCreatedListener'](
{},
{},
[]
);

expect(changeSpy).not.toHaveBeenCalled();
});

function listeners(): string[] {
return Object.keys(
customMessageListenersService.getMessageListeners()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { Inject, Injectable } from '@angular/core';
import { Observable, Subject, take } from 'rxjs';
import { Inject, Injectable, Optional } from '@angular/core';
import { LUIGI_CUSTOM_MESSAGE_LISTENERS_INJECTION_TOKEN } from '../../injection-tokens';
import { CustomMessageListener } from './custom-message-listener';

Expand All @@ -20,10 +19,8 @@ export interface MessageListeners {
providedIn: 'root',
})
export class CustomMessageListenersService {
private changed$: Subject<string> = new Subject<string>();
public changed: Observable<string> = this.changed$.asObservable();

constructor(
@Optional()
@Inject(LUIGI_CUSTOM_MESSAGE_LISTENERS_INJECTION_TOKEN)
private listeners: CustomMessageListener[]
) {
Expand All @@ -39,9 +36,6 @@ export class CustomMessageListenersService {
for (const listener of this.listeners) {
const obj = {
[listener.messageId()]: (msg, mf, mfNodes) => {
listener.changed?.pipe(take(1)).subscribe(() => {
this.changed$.next(listener.messageId());
});
listener.onCustomMessageReceived(msg, mf, mfNodes);
},
};
Expand Down
4 changes: 2 additions & 2 deletions src/lib/services/luigi-config/luigi-config.service.spec.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { LuigiConfigService } from './luigi-config.service';
import { EnvConfigService } from '../portal/env-config.service';
import { EnvConfigService } from '../portal';
import { AuthConfigService } from './auth-config.service';
import { ClientEnvironment } from '../../models/env';
import { ClientEnvironment } from '../../models';
import { RoutingConfigService } from './routing-config.service';
import { StaticSettingsConfigService } from './static-settings-config.service';
import { CustomMessageListenersService } from './custom-message-listeners.service';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ describe('NavigationConfigService', () => {
luigiCoreService.resetLuigi = jest.fn();

jest
.spyOn(serviceProviderService, 'getRawConfigsForTenant')
.spyOn(serviceProviderService, 'getRawConfigs')
.mockResolvedValue(serviceProviders);

const entityConfig = { providers: [], entityContext: {} };
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { mfpMarkSvg } from '../../data/mfp-mark';
import { StaticSettingsConfigServiceImpl } from './static-settings-config.service';
import { LuigiCoreService } from '../luigi-core.service';

Expand All @@ -19,8 +20,8 @@ describe('StaticSettingsConfigServiceImpl', () => {
expect(config).toEqual({
header: {
title: 'OpenMFP Portal',
logo: 'assets/mfp_mark.svg',
favicon: 'assets/mfp_mark.svg',
logo: mfpMarkSvg,
favicon: mfpMarkSvg,
},
experimental: {
btpToolLayout: true,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { Injectable } from '@angular/core';
import { mfpMarkSvg } from '../../data';

export interface StaticSettingsConfigService {
getInitialStaticSettingsConfig(): Record<string, any>;
Expand All @@ -14,7 +15,7 @@ export class StaticSettingsConfigServiceImpl
constructor() {}

getInitialStaticSettingsConfig() {
const logo = 'assets/mfp_mark.svg';
const logo = mfpMarkSvg;

return {
header: {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { LuigiNode } from '../../models/luigi';
import { LuigiNode } from '../../models';

export interface UserSettingsConfigService {
getUserSettings(luigiNodes: Record<string, LuigiNode[]>): Promise<any>;
Expand Down
7 changes: 7 additions & 0 deletions src/lib/services/luigi-core.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ const luigiMock = {
i18n: jest.fn(),
globalSearch: jest.fn(),
routing: jest.fn(),
sendCustomMessage: jest.fn(),
featureToggles: jest.fn().mockReturnValue({
setFeatureToggle: jest.fn(),
getActiveFeatureToggleList: jest.fn().mockReturnValue([]),
Expand Down Expand Up @@ -124,6 +125,12 @@ describe('LuigiCoreService', () => {
expect(luigiMock.routing).toHaveBeenCalled();
});

it('should call sendCustomMessage', () => {
const msg = { id: 'id-1' };
service.sendCustomMessage(msg);
expect(luigiMock.sendCustomMessage).toHaveBeenCalledWith(msg);
});

it('should call setFeatureToggle with correct featureToggleName', () => {
const featureToggleName = 'someFeature';
service.setFeatureToggle(featureToggleName);
Expand Down
15 changes: 5 additions & 10 deletions src/lib/services/luigi-core.service.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,7 @@
import { Injectable } from '@angular/core';
import { LuigiConfig, LuigiCustomMessage } from '../models';
const luigi = (globalThis as any).Luigi;

export interface LuigiConfig {
auth?: any;
routing?: any;
settings?: any;
lifecycleHooks?: any;
navigation?: any;
userSettings?: any;
globalSearch?: any;
}

@Injectable({
providedIn: 'root',
})
Expand All @@ -35,6 +26,10 @@ export class LuigiCoreService {
return luigi.unload();
}

sendCustomMessage(customMessage: LuigiCustomMessage) {
return luigi.sendCustomMessage(customMessage);
}

configChanged(scope?: string) {
luigi.configChanged(scope);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { Injectable } from '@angular/core';
import { ClientEnvironment } from '../../models/env';
import { AuthService } from '../portal/auth.service';
import { ConfigService } from '../portal/config.service';
import { ClientEnvironment } from '../../models';
import { AuthService, ConfigService } from '../portal';

export interface LuigiNodeExtendedContextService {
createLuigiNodeContext(
Expand All @@ -24,9 +23,7 @@ export class LuigiNodeExtendedContextServiceImpl
const portalConfig = await this.configService.getPortalConfig();
return {
userid: this.authService.getUsername(),
frameContext: portalConfig.frameContext,
portalContext: portalConfig.portalContext,
tenantid: portalConfig.tenantId,
};
}
}
16 changes: 8 additions & 8 deletions src/lib/services/luigi-nodes/luigi-nodes.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -158,11 +158,11 @@ describe('LuigiNodesService', () => {
},
]
);
const spyInstanceForTenant = jest.spyOn(
const spyInstanceGetRawConfigs = jest.spyOn(
serviceProviderService,
'getRawConfigsForTenant'
'getRawConfigs'
);
spyInstanceForTenant.mockReturnValue(configServiceResponse);
spyInstanceGetRawConfigs.mockReturnValue(configServiceResponse);

const spyInstanceForProject = jest.spyOn(
serviceProviderService,
Expand All @@ -174,19 +174,19 @@ describe('LuigiNodesService', () => {
localNodeServiceSpy.mockReturnValue(Promise.resolve([]));
});

it('should handle errors when retrieving tenant nodes', async () => {
it('should handle errors when retrieving nodes', async () => {
const consoleWarnSpy = jest.spyOn(console, 'warn');
const errorMessage = 'Failed to retrieve tenant nodes';
const errorMessage = 'Failed to retrieve nodes';
const serviceProviderServiceSpy = jest
.spyOn(serviceProviderService, 'getRawConfigsForTenant')
.spyOn(serviceProviderService, 'getRawConfigs')
.mockRejectedValue(new Error(errorMessage));

try {
await service.retrieveChildrenByEntity();
} catch (e) {
expect(serviceProviderServiceSpy).toHaveBeenCalled();
expect(consoleWarnSpy).toHaveBeenCalledWith(
'Could not retrieve tenant nodes, error: ',
'Could not retrieve nodes, error: ',
expect.any(Error)
);
}
Expand Down Expand Up @@ -239,7 +239,7 @@ describe('LuigiNodesService', () => {
];

const serviceProviderServiceSpy = jest
.spyOn(serviceProviderService, 'getRawConfigsForTenant')
.spyOn(serviceProviderService, 'getRawConfigs')
.mockResolvedValue(serviceProviders);

const childrenByEntity = await service.retrieveChildrenByEntity();
Expand Down
4 changes: 2 additions & 2 deletions src/lib/services/luigi-nodes/luigi-nodes.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -142,9 +142,9 @@ export class LuigiNodesService {

private async retrieveAndMergeNodes(): Promise<LuigiNode[]> {
const rawConfigsPromise = this.serviceProviderService
.getRawConfigsForTenant()
.getRawConfigs()
.catch((e) => {
console.warn('Could not retrieve tenant nodes, error: ', e);
console.warn('Could not retrieve nodes, error: ', e);
throw e;
});

Expand Down
Loading

0 comments on commit 366fae0

Please sign in to comment.