Skip to content
22 changes: 21 additions & 1 deletion src/portal-options/auth-config-provider.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { HttpException } from '@nestjs/common';
import {
DiscoveryService,
EnvAuthConfigService,
EnvService,
} from '@openmfp/portal-server-lib';
import type { Request } from 'express';
import { mock } from 'jest-mock-extended';
Expand All @@ -11,11 +12,18 @@ describe('PMAuthConfigProvider', () => {
let provider: PMAuthConfigProvider;
let discoveryService: jest.Mocked<DiscoveryService>;
let envAuthConfigService: jest.Mocked<EnvAuthConfigService>;
let mockEnvService: jest.Mocked<EnvService>;

beforeEach(() => {
discoveryService = mock<DiscoveryService>();
envAuthConfigService = mock<EnvAuthConfigService>();
provider = new PMAuthConfigProvider(discoveryService, envAuthConfigService);
mockEnvService = mock<EnvService>();
mockEnvService.getEnv.mockReturnValue({ isLocal: false });
provider = new PMAuthConfigProvider(
discoveryService,
envAuthConfigService,
mockEnvService,
);
jest.resetModules();
process.env = {
AUTH_SERVER_URL_DEFAULT: 'authUrl',
Expand Down Expand Up @@ -95,4 +103,16 @@ describe('PMAuthConfigProvider', () => {
baseDomain: 'example.com',
});
});

it('getDomain should return defaults for local developmentn', () => {
const req = { hostname: 'localhost' } as Request;
mockEnvService.getEnv.mockReturnValue({ isLocal: true });

const result = provider.getDomain(req);

expect(result).toEqual({
organization: 'openmfp',
baseDomain: 'localhost',
});
});
});
11 changes: 11 additions & 0 deletions src/portal-options/auth-config-provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import {
AuthConfigService,
DiscoveryService,
EnvAuthConfigService,
EnvService,
ServerAuthVariables,
} from '@openmfp/portal-server-lib';
import type { Request } from 'express';
Expand All @@ -14,6 +15,7 @@ export class PMAuthConfigProvider implements AuthConfigService {
constructor(
private discoveryService: DiscoveryService,
private envEuthConfigService: EnvAuthConfigService,
private envService: EnvService,
) {}

async getAuthConfig(request: Request): Promise<ServerAuthVariables> {
Expand Down Expand Up @@ -75,6 +77,15 @@ export class PMAuthConfigProvider implements AuthConfigService {
const subDomain = request.hostname.split('.')[0];
const clientId = process.env['OIDC_CLIENT_ID_DEFAULT'];
const baseDomain = process.env['BASE_DOMAINS_DEFAULT'];

const { isLocal } = this.envService.getEnv();
if (isLocal) {
return {
organization: 'openmfp',
baseDomain: request.hostname,
};
}

return {
organization: request.hostname === baseDomain ? clientId : subDomain,
baseDomain,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import { RequestContext } from '../openmfp-request-context-provider.js';
import { ContentConfigurationServiceProvidersService } from './content-configuration-service-providers.service.js';
import { welcomeNodeConfig } from './models/welcome-node-config.js';
import { EnvService } from '@openmfp/portal-server-lib';
import { GraphQLClient } from 'graphql-request';
import { mock } from 'jest-mock-extended';

jest.mock('graphql-request', () => {
return {
Expand All @@ -16,10 +19,13 @@ jest.mock('graphql-request', () => {
describe('ContentConfigurationServiceProvidersService', () => {
let service: ContentConfigurationServiceProvidersService;
let mockClient: jest.Mocked<GraphQLClient>;
let mockEnvService: jest.Mocked<EnvService>;
let context: RequestContext;

beforeEach(() => {
service = new ContentConfigurationServiceProvidersService();
mockEnvService = mock();
mockEnvService.getEnv.mockReturnValue({ isLocal: false });
service = new ContentConfigurationServiceProvidersService(mockEnvService);
mockClient = new GraphQLClient('') as any;
(GraphQLClient as jest.Mock).mockReturnValue(mockClient);
context = {
Expand All @@ -44,6 +50,17 @@ describe('ContentConfigurationServiceProvidersService', () => {
).rejects.toThrow('Context with organization is required');
});

it('throws if context organization is missing', async () => {
context.isSubDomain = false;
const result = await service.getServiceProviders(
'token',
['entity'],
context,
);

expect(result).toEqual(welcomeNodeConfig);
});

it('returns parsed content configurations', async () => {
mockClient.request.mockResolvedValue({
ui_platform_mesh_io: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,21 @@ import { RequestContext } from '../openmfp-request-context-provider.js';
import { contentConfigurationsQuery } from './contentconfigurations-query.js';
import { ContentConfigurationQueryResponse } from './models/contentconfigurations.js';
import { welcomeNodeConfig } from './models/welcome-node-config.js';
import { Injectable } from '@nestjs/common';
import {
ContentConfiguration,
EnvService,
ServiceProviderResponse,
ServiceProviderService,
} from '@openmfp/portal-server-lib';
import { GraphQLClient } from 'graphql-request';

@Injectable()
export class ContentConfigurationServiceProvidersService
implements ServiceProviderService
{
constructor(private envService: EnvService) {}

async getServiceProviders(
token: string,
entities: string[],
Expand All @@ -22,7 +27,8 @@ export class ContentConfigurationServiceProvidersService
throw new Error('Token is required');
}

if (!context.isSubDomain) {
const { isLocal } = this.envService.getEnv();
if (!context.isSubDomain && !isLocal) {
return welcomeNodeConfig;
}

Expand All @@ -38,6 +44,8 @@ export class ContentConfigurationServiceProvidersService
url = url.replace('/graphql', `:${context.account}/graphql`);
}

console.log(`Calculated crd gateway api url: ${url}`);

const client = new GraphQLClient(url, {
headers: {
Authorization: `Bearer ${token}`,
Expand Down