From 2a2e8292f63d21efc9ac50d6edf979746177bc11 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 20 Jan 2025 15:40:08 +0100 Subject: [PATCH] add rules for federation options --- federation/package.json | 3 ++ federation/src/config/index.ts | 26 ++++-------- federation/src/config/schema.ts | 75 +++++++++++++++++++++++++++++++++ federation/yarn.lock | 52 +++++++++++++++++++++++ 4 files changed, 138 insertions(+), 18 deletions(-) create mode 100644 federation/src/config/schema.ts diff --git a/federation/package.json b/federation/package.json index ecf2d2d50..376e8551a 100644 --- a/federation/package.json +++ b/federation/package.json @@ -28,6 +28,7 @@ "graphql": "15.5.1", "graphql-request": "5.0.0", "helmet": "^7.1.0", + "joi": "^17.13.3", "lodash.clonedeep": "^4.5.0", "log4js": "^6.7.1", "reflect-metadata": "^0.1.13", @@ -38,6 +39,7 @@ "devDependencies": { "@types/express": "4.17.12", "@types/jest": "27.0.2", + "@types/joi": "^17.2.3", "@types/lodash.clonedeep": "^4.5.6", "@types/node": "^16.10.3", "@types/sodium-native": "^2.3.5", @@ -56,6 +58,7 @@ "eslint-plugin-promise": "^6.1.1", "eslint-plugin-security": "^1.7.1", "eslint-plugin-type-graphql": "^1.0.0", + "gradido-config": "../config", "graphql-tag": "^2.12.6", "jest": "^27.2.4", "nodemon": "^2.0.7", diff --git a/federation/src/config/index.ts b/federation/src/config/index.ts index 4f72859c1..26ed37a98 100644 --- a/federation/src/config/index.ts +++ b/federation/src/config/index.ts @@ -1,7 +1,12 @@ // ATTENTION: DO NOT PUT ANY SECRETS IN HERE (or the .env) import { Decimal } from 'decimal.js-light' +import { latestDbVersion } from '@dbTools/config/detectLastDBVersion' import dotenv from 'dotenv' +import { validate } from 'gradido-config' + +import { schema } from './schema' + dotenv.config() Decimal.set({ @@ -10,16 +15,11 @@ Decimal.set({ }) const constants = { - DB_VERSION: '0087-add_index_on_user_roles', + DB_VERSION: latestDbVersion, DECAY_START_TIME: new Date('2021-05-13 17:46:31-0000'), // GMT+0 LOG4JS_CONFIG: 'log4js-config.json', // default log level on production should be info LOG_LEVEL: process.env.LOG_LEVEL ?? 'info', - CONFIG_VERSION: { - DEFAULT: 'DEFAULT', - EXPECTED: 'v2.2023-08-24', - CURRENT: '', - }, } const server = { @@ -38,18 +38,6 @@ const database = { TYPEORM_LOGGING_RELATIVE_PATH: process.env.TYPEORM_LOGGING_RELATIVE_PATH ?? 'typeorm.backend.log', } -// Check config version -constants.CONFIG_VERSION.CURRENT = process.env.CONFIG_VERSION ?? constants.CONFIG_VERSION.DEFAULT -if ( - ![constants.CONFIG_VERSION.EXPECTED, constants.CONFIG_VERSION.DEFAULT].includes( - constants.CONFIG_VERSION.CURRENT, - ) -) { - throw new Error( - `Fatal: Config Version incorrect - expected "${constants.CONFIG_VERSION.EXPECTED}" or "${constants.CONFIG_VERSION.DEFAULT}", but found "${constants.CONFIG_VERSION.CURRENT}"`, - ) -} - const COMMUNITY_HOST = process.env.COMMUNITY_HOST ?? 'localhost' const URL_PROTOCOL = process.env.URL_PROTOCOL ?? 'http' const COMMUNITY_URL = process.env.COMMUNITY_URL ?? `${URL_PROTOCOL}://${COMMUNITY_HOST}` @@ -74,4 +62,6 @@ export const CONFIG = { ...federation, } +validate(schema, CONFIG) + export default CONFIG diff --git a/federation/src/config/schema.ts b/federation/src/config/schema.ts new file mode 100644 index 000000000..3d05afabd --- /dev/null +++ b/federation/src/config/schema.ts @@ -0,0 +1,75 @@ +import { + DB_DATABASE, + DB_HOST, + DB_PASSWORD, + DB_PORT, + DB_USER, + DB_VERSION, + DECAY_START_TIME, + GRAPHIQL, + LOG4JS_CONFIG, + LOG_LEVEL, + NODE_ENV, + PRODUCTION, + TYPEORM_LOGGING_RELATIVE_PATH, +} from 'gradido-config' +import Joi from 'joi' + +export const schema = Joi.object({ + DB_DATABASE, + DB_HOST, + DB_PASSWORD, + DB_PORT, + DB_USER, + DB_VERSION, + DECAY_START_TIME, + GRAPHIQL, + LOG4JS_CONFIG, + LOG_LEVEL, + NODE_ENV, + PRODUCTION, + TYPEORM_LOGGING_RELATIVE_PATH, + + FEDERATION_API: Joi.string() + .valid('1_0', '1_1') + .default('1_0') + .description('Federation API version, defaults to 1_0') + .required(), + + FEDERATION_PORT: Joi.number() + .integer() + .min(1024) + .max(49151) + .default(5010) + .description('Port number for the federation service, defaults to 5010') + .required(), + + FEDERATION_COMMUNITY_URL: Joi.string() + .uri({ scheme: ['http', 'https'] }) + .default(Joi.ref('COMMUNITY_URL')) + .description('Community URL for federation, defaults to COMMUNITY_URL') + .required(), + + FEDERATION_TRADING_LEVEL: Joi.object({ + RECEIVER_COMMUNITY_URL: Joi.string() + .uri({ scheme: ['http', 'https'] }) + .default('https://stage3.gradido.net/api/') + .description('URL of the receiver community for trading') + .required(), + + SEND_COINS: Joi.boolean() + .default(true) + .description('Indicates if coins can be sent to the receiver community') + .required(), + + AMOUNT: Joi.number() + .integer() + .min(1) + .default(100) + .description('Maximum amount of coins allowed for trading') + .required(), + }) + .default() + .description('Trading level configuration for federation') + .optional(), +}) diff --git a/federation/yarn.lock b/federation/yarn.lock index 74cc04521..3596473a4 100644 --- a/federation/yarn.lock +++ b/federation/yarn.lock @@ -379,6 +379,18 @@ resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== +"@hapi/hoek@^9.0.0", "@hapi/hoek@^9.3.0": + version "9.3.0" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== + +"@hapi/topo@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + "@humanwhocodes/config-array@^0.11.10": version "0.11.10" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2" @@ -722,6 +734,23 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== +"@sideway/address@^4.1.5": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.5.tgz#4bc149a0076623ced99ca8208ba780d65a99b9d5" + integrity sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" + integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + "@sinonjs/commons@^1.7.0": version "1.8.6" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" @@ -941,6 +970,13 @@ jest-diff "^27.0.0" pretty-format "^27.0.0" +"@types/joi@^17.2.3": + version "17.2.3" + resolved "https://registry.yarnpkg.com/@types/joi/-/joi-17.2.3.tgz#b7768ed9d84f1ebd393328b9f97c1cf3d2b94798" + integrity sha512-dGjs/lhrWOa+eO0HwgxCSnDm5eMGCsXuvLglMghJq32F6q5LyyNuXb41DHzrg501CKNOSSAHmfB7FDGeUnDmzw== + dependencies: + joi "*" + "@types/json-schema@^7.0.9": version "7.0.12" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" @@ -3027,6 +3063,11 @@ graceful-fs@^4.2.4: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== +gradido-config@../config: + version "1.0.0" + dependencies: + joi "^17.13.3" + grapheme-splitter@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" @@ -3944,6 +3985,17 @@ jest@^27.2.4: import-local "^3.0.2" jest-cli "^27.5.1" +joi@*, joi@^17.13.3: + version "17.13.3" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.13.3.tgz#0f5cc1169c999b30d344366d384b12d92558bcec" + integrity sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA== + dependencies: + "@hapi/hoek" "^9.3.0" + "@hapi/topo" "^5.1.0" + "@sideway/address" "^4.1.5" + "@sideway/formula" "^3.0.1" + "@sideway/pinpoint" "^2.0.0" + js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"