Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 11 additions & 10 deletions .env.template
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
# SPDX-License-Identifier: Apache-2.0
NODE_TLS_REJECT_UNAUTHORIZED='0'

FUNCTION_NAME=transaction-aggregation-decisioning-processor
NODE_ENV=production
SERVER_URL=0.0.0.0:4222
SIDECAR_HOST=0.0.0.0:4222
NODE_ENV=dev
MAX_CPU=

# Redis
REDIS_DB=0
REDIS_DATABASE=0
REDIS_AUTH="exampleAuth"
REDIS_SERVERS='[{"host":"127.0.0.1", "port":6379}, {"host":"127.0.0.1", "port":6380}]'
REDIS_IS_CLUSTER=false
Expand All @@ -19,11 +17,11 @@ TRANSACTION_HISTORY_DATABASE_USER=
TRANSACTION_HISTORY_DATABASE_PASSWORD=
TRANSACTION_HISTORY_DATABASE=

CONFIG_DATABASE_CERT_PATH=
CONFIG_DATABASE_URL=
CONFIG_DATABASE_USER=
CONFIG_DATABASE_PASSWORD=
CONFIG_DATABASE=
CONFIGURATION_DATABASE_CERT_PATH=
CONFIGURATION_DATABASE_URL=
CONFIGURATION_DATABASE_USER=
CONFIGURATION_DATABASE_PASSWORD=
CONFIGURATION_DATABASE=

TRANSACTION_DATABASE_CERT_PATH=
TRANSACTION_DATABASE_URL=
Expand All @@ -35,6 +33,7 @@ TRANSACTION_DATABASE=
SUPPRESS_ALERTS=false

# Apm
APM_SERVICE_NAME=transaction-aggregation-decisioning-processor
APM_ACTIVE=true
APM_URL=http://apm-server.development:8200
APM_SECRET_TOKEN=
Expand All @@ -43,7 +42,9 @@ APM_SECRET_TOKEN=
LOGSTASH_HOST=logstash.development
LOGSTASH_PORT=8080
LOGSTASH_LEVEL='info'
SIDECAR_HOST=0.0.0.0:5000

# Nats
PRODUCER_STREAM=
STARTUP_TYPE=nats
SERVER_URL=0.0.0.0:4222
25 changes: 8 additions & 17 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -40,26 +40,21 @@ COPY service.yaml ./
# Turn down the verbosity to default level.
ENV NPM_CONFIG_LOGLEVEL info

ENV mode="http"
ENV upstream_url="http://127.0.0.1:3000"
ENV exec_timeout="10s"
ENV write_timeout="15s"
ENV read_timeout="15s"
ENV prefix_logs="false"
ENV MAX_CPU=

# Service-Based Environment Variables
ENV FUNCTION_NAME=transaction-aggregation-decisioning-processor
ENV NODE_ENV=production
ENV SERVER_URL=
ENV CMS_ENDPOINT=
ENV MAX_CPU=

ENV TRANSACTION_ROUTING_HOST=localhost
ENV TRANSACTION_ROUTING_PORT=3000
ENV TRANSACTION_ROUTING_PATH=result-test

# Redis
ENV REDIS_DB=0
ENV REDIS_DATABASE=0
ENV REDIS_AUTH=
ENV REDIS_SERVERS=
ENV REDIS_IS_CLUSTER=
Expand All @@ -71,11 +66,11 @@ ENV TRANSACTION_HISTORY_DATABASE_USER='root'
ENV TRANSACTION_HISTORY_DATABASE_PASSWORD=
ENV TRANSACTION_HISTORY_DATABASE='transactionHistory'

ENV CONFIG_DATABASE_CERT_PATH='/usr/local/share/ca-certificates/ca-certificates.crt'
ENV CONFIG_DATABASE_URL=
ENV CONFIG_DATABASE_USER='root'
ENV CONFIG_DATABASE_PASSWORD=
ENV CONFIG_DATABASE='configuration'
ENV CONFIGURATION_DATABASE_CERT_PATH='/usr/local/share/ca-certificates/ca-certificates.crt'
ENV CONFIGURATION_DATABASE_URL=
ENV CONFIGURATION_DATABASE_USER='root'
ENV CONFIGURATION_DATABASE_PASSWORD=
ENV CONFIGURATION_DATABASE='configuration'

ENV TRANSACTION_DATABASE_CERT_PATH='/usr/local/share/ca-certificates/ca-certificates.crt'
ENV TRANSACTION_DATABASE_URL=
Expand All @@ -84,7 +79,7 @@ ENV TRANSACTION_DATABASE_PASSWORD=
ENV TRANSACTION_DATABASE='evaluationResults'

ENV CACHE_ENABLED=
ENV CACHE_TTL=30
ENV CACHETTL=30

# Alert
ENV SUPPRESS_ALERTS=false
Expand All @@ -108,9 +103,5 @@ ENV PRODUCER_STORAGE=File
ENV PRODUCER_RETENTION_POLICY=Workqueue
ENV SIDECAR_HOST=0.0.0.0:5000

# Set healthcheck command
HEALTHCHECK --interval=3s CMD [ -e /tmp/.lock ] || exit 1
EXPOSE 4222

# Execute watchdog command
CMD ["build/index.js"]
39 changes: 39 additions & 0 deletions __tests__/unit/logic.service.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,45 @@ import { handleExecute } from '../../src/services/logic.service';

let cacheString: string | number | Buffer;

jest.mock('@tazama-lf/frms-coe-lib/lib/helpers/env', () => ({
validateAPMConfig: jest.fn().mockReturnValue({
apmServiceName: '',
}),
validateLogConfig: jest.fn().mockReturnValue({}),
validateProcessorConfig: jest.fn().mockReturnValue({
functionName: 'test-ed',
nodeEnv: 'test',
}),
validateEnvVar: jest.fn().mockReturnValue(''),
validateRedisConfig: jest.fn().mockReturnValue({
db: 0,
servers: [
{
host: 'redis://localhost',
port: 6379,
},
],
password: '',
isCluster: false,
}),
validateDatabaseConfig: jest.fn().mockReturnValue({}),
}));

jest.mock('@tazama-lf/frms-coe-lib/lib/helpers/env/database.config', () => ({
Database: {
CONFIGURATION: 'MOCK_DB',
},
}));

jest.mock('@tazama-lf/frms-coe-startup-lib/lib/interfaces/iStartupConfig', () => ({
startupConfig: {
startupType: 'nats',
consumerStreamName: 'consumer',
serverUrl: 'server',
producerStreamName: 'producer',
functionName: 'producer',
},
}));
describe('TADProc Service', () => {
beforeAll(async () => {
await dbInit();
Expand Down
40 changes: 40 additions & 0 deletions __tests__/unit/typology.helper.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,46 @@ import { databaseManager, dbInit, runServer, server } from '../../src/index';
import * as helpers from '../../src/services/helper.service';
import { handleTypologies } from '../../src/services/helper.service';

jest.mock('@tazama-lf/frms-coe-lib/lib/helpers/env', () => ({
validateAPMConfig: jest.fn().mockReturnValue({
apmServiceName: '',
}),
validateLogConfig: jest.fn().mockReturnValue({}),
validateProcessorConfig: jest.fn().mockReturnValue({
functionName: 'test-ed',
nodeEnv: 'test',
}),
validateEnvVar: jest.fn().mockReturnValue(''),
validateRedisConfig: jest.fn().mockReturnValue({
db: 0,
servers: [
{
host: 'redis://localhost',
port: 6379,
},
],
password: '',
isCluster: false,
}),
validateDatabaseConfig: jest.fn().mockReturnValue({}),
}));

jest.mock('@tazama-lf/frms-coe-lib/lib/helpers/env/database.config', () => ({
Database: {
CONFIGURATION: 'MOCK_DB',
},
}));

jest.mock('@tazama-lf/frms-coe-startup-lib/lib/interfaces/iStartupConfig', () => ({
startupConfig: {
startupType: 'nats',
consumerStreamName: 'consumer',
serverUrl: 'server',
producerStreamName: 'producer',
functionName: 'producer',
},
}));

describe('TADProc Service', () => {
let responseSpy: jest.SpyInstance;
beforeAll(async () => {
Expand Down
29 changes: 25 additions & 4 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
],
"license": "Apache-2.0",
"dependencies": {
"@tazama-lf/frms-coe-lib": "4.2.0-alpha.6",
"@tazama-lf/frms-coe-lib": "4.2.0-rc.3",
"@tazama-lf/frms-coe-startup-lib": "2.3.0-rc.0",
"dotenv": "^16.4.5",
"tslib": "^2.6.3"
Expand Down
6 changes: 3 additions & 3 deletions src/apm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ import { configuration } from './config';
**/
const apm = new Apm({
serviceName: configuration.serviceName,
secretToken: configuration.apm?.secretToken,
serverUrl: configuration.apm?.url,
secretToken: configuration.apm?.apmSecretToken,
serverUrl: configuration.apm?.apmUrl,
usePathAsTransactionName: true,
active: configuration.apm?.active?.toLowerCase() === 'true',
active: configuration.apm?.apmActive,
transactionIgnoreUrls: ['/health'],
});

Expand Down
88 changes: 32 additions & 56 deletions src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,16 @@
import * as path from 'path';
import * as dotenv from 'dotenv';
import { type ManagerConfig } from '@tazama-lf/frms-coe-lib';
import {
validateDatabaseConfig,
validateEnvVar,
validateLogConfig,
validateRedisConfig,
validateAPMConfig,
validateProcessorConfig,
} from '@tazama-lf/frms-coe-lib/lib/helpers/env';
import { Database } from '@tazama-lf/frms-coe-lib/lib/helpers/env/database.config';
import { type ApmConfig, type LogConfig } from '@tazama-lf/frms-coe-lib/lib/helpers/env/monitoring.config';

// Load .env file into process.env if it exists. This is convenient for running locally.
dotenv.config({
Expand All @@ -13,68 +23,34 @@ export interface IConfig {
maxCPU: number;
env: string;
serviceName: string;
apm: {
secretToken: string;
url: string;
active: string;
};
apm: ApmConfig;
db: ManagerConfig;
logger: {
logstashHost: string;
logstashPort: number;
logstashLevel: string;
};
sidecarHost: string;
logger: LogConfig;
producerStream: string;
suppressAlerts: boolean;
}

const generalConfig = validateProcessorConfig();
const authEnabled = generalConfig.nodeEnv === 'production';
const redisConfig = validateRedisConfig(authEnabled);
const transactionHistory = validateDatabaseConfig(authEnabled, Database.TRANSACTION_HISTORY);
const transaction = validateDatabaseConfig(authEnabled, Database.TRANSACTION);
const configDBConfig = validateDatabaseConfig(authEnabled, Database.CONFIGURATION);
const apm = validateAPMConfig();
const logger = validateLogConfig();

export const configuration: IConfig = {
maxCPU: parseInt(process.env.MAX_CPU!, 10) || 1,
serviceName: process.env.FUNCTION_NAME!,
apm: {
url: process.env.APM_URL!,
secretToken: process.env.APM_SECRET_TOKEN!,
active: process.env.APM_ACTIVE!,
},
maxCPU: generalConfig.maxCPU || 1,
serviceName: generalConfig.functionName,
apm,
db: {
redisConfig: {
db: parseInt(process.env.REDIS_DB!, 10) || 0,
servers: JSON.parse(process.env.REDIS_SERVERS! || '[{"hostname": "127.0.0.1", "port":6379}]'),
password: process.env.REDIS_AUTH!,
isCluster: process.env.REDIS_IS_CLUSTER === 'true',
},
configuration: {
password: process.env.CONFIG_DATABASE_PASSWORD!,
url: process.env.CONFIG_DATABASE_URL!,
user: process.env.CONFIG_DATABASE_USER!,
databaseName: process.env.CONFIG_DATABASE!,
certPath: process.env.CONFIG_DATABASE_CERT_PATH!,
localCacheEnabled: process.env.CACHE_ENABLED === 'true',
localCacheTTL: parseInt(process.env.CACHE_TTL!, 10) || 3000,
},
transactionHistory: {
password: process.env.TRANSACTION_HISTORY_DATABASE_PASSWORD!,
url: process.env.TRANSACTION_HISTORY_DATABASE_URL!,
user: process.env.TRANSACTION_HISTORY_DATABASE_USER!,
databaseName: process.env.TRANSACTION_HISTORY_DATABASE!,
certPath: process.env.TRANSACTION_HISTORY_DATABASE_CERT_PATH!,
},
transaction: {
password: process.env.TRANSACTION_DATABASE_PASSWORD!,
url: process.env.TRANSACTION_DATABASE_URL!,
user: process.env.TRANSACTION_DATABASE_USER!,
databaseName: process.env.TRANSACTION_DATABASE!,
certPath: process.env.TRANSACTION_DATABASE_CERT_PATH!,
},
},
env: process.env.NODE_ENV!,
logger: {
logstashHost: process.env.LOGSTASH_HOST!,
logstashPort: parseInt(process.env.LOGSTASH_PORT ?? '0', 10),
logstashLevel: process.env.LOGSTASH_LEVEL! || 'info',
redisConfig,
configuration: configDBConfig,
transactionHistory,
transaction,
},
sidecarHost: process.env.SIDECAR_HOST!,
producerStream: process.env.PRODUCER_STREAM!,
suppressAlerts: process.env.SUPPRESS_ALERTS === 'true',
env: generalConfig.nodeEnv || 'dev',
logger,
producerStream: validateEnvVar('PRODUCER_STREAM', 'string'),
suppressAlerts: validateEnvVar('SUPPRESS_ALERTS', 'boolean'),
};
2 changes: 1 addition & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import { Singleton } from './services/services';

const databaseManagerConfig = configuration.db;

export const loggerService: LoggerService = new LoggerService(configuration.sidecarHost);
export const loggerService: LoggerService = new LoggerService(configuration.logger.sidecarHost);
let databaseManager: DatabaseManagerInstance<typeof databaseManagerConfig>;

export const dbInit = async (): Promise<void> => {
Expand Down