From 20a4aeff97ea3739eab8128d08a4033b61020a45 Mon Sep 17 00:00:00 2001 From: Christopher Kolstad Date: Tue, 12 Oct 2021 10:39:28 +0200 Subject: [PATCH] Make Appinstance registration include environment (#1014) --- .gitignore | 4 ++- src/lib/db/client-instance-store.ts | 7 +++-- src/lib/routes/client-api/register.ts | 23 ++++++++++++--- .../client-metrics/register-schema.ts | 1 + src/lib/types/stores/client-instance-store.ts | 1 + ...226-add-environment-to-client-instances.js | 29 +++++++++++++++++++ 6 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 src/migrations/20211011094226-add-environment-to-client-instances.js diff --git a/.gitignore b/.gitignore index e55253b113..a5e6828db1 100644 --- a/.gitignore +++ b/.gitignore @@ -51,4 +51,6 @@ package-lock.json /website/node_modules /website/yarn.lock /website/translated_docs -/website/i18n/* \ No newline at end of file +/website/i18n/* +.env + diff --git a/src/lib/db/client-instance-store.ts b/src/lib/db/client-instance-store.ts index 67df244682..c213bb82ed 100644 --- a/src/lib/db/client-instance-store.ts +++ b/src/lib/db/client-instance-store.ts @@ -18,6 +18,7 @@ const COLUMNS = [ 'client_ip', 'last_seen', 'created_at', + 'environment', ]; const TABLE = 'client_instances'; @@ -30,6 +31,7 @@ const mapRow = (row) => ({ clientIp: row.client_ip, lastSeen: row.last_seen, createdAt: row.created_at, + environment: row.environment, }); const mapToDb = (client) => ({ @@ -38,6 +40,7 @@ const mapToDb = (client) => ({ sdk_version: client.sdkVersion || '', client_ip: client.clientIp, last_seen: client.lastSeen || 'now()', + environment: client.environment || 'default', }); export default class ClientInstanceStore implements IClientInstanceStore { @@ -79,7 +82,7 @@ export default class ClientInstanceStore implements IClientInstanceStore { const rows = instances.map(mapToDb); await this.db(TABLE) .insert(rows) - .onConflict(['app_name', 'instance_id']) + .onConflict(['app_name', 'instance_id', 'environment']) .merge(); } @@ -126,7 +129,7 @@ export default class ClientInstanceStore implements IClientInstanceStore { await this.db(TABLE) .insert(mapToDb(details)) - .onConflict(['app_name', 'instance_id']) + .onConflict(['app_name', 'instance_id', 'environment']) .merge(); stopTimer(); diff --git a/src/lib/routes/client-api/register.ts b/src/lib/routes/client-api/register.ts index 31f55356ca..86f3b84873 100644 --- a/src/lib/routes/client-api/register.ts +++ b/src/lib/routes/client-api/register.ts @@ -1,9 +1,13 @@ -import { Request, Response } from 'express'; +import { Response } from 'express'; import Controller from '../controller'; import { IUnleashServices } from '../../types'; import { IUnleashConfig } from '../../types/option'; import { Logger } from '../../logger'; import ClientMetricsService from '../../services/client-metrics'; +import { IAuthRequest, User } from '../../server-impl'; +import { IClientApp } from '../../types/model'; +import ApiUser from '../../types/api-user'; +import { ALL } from '../../types/models/api-token'; export default class RegisterController extends Controller { logger: Logger; @@ -22,9 +26,20 @@ export default class RegisterController extends Controller { this.post('/', this.handleRegister); } - async handleRegister(req: Request, res: Response): Promise { - const data = req.body; - const clientIp = req.ip; + private resolveEnvironment(user: User, data: IClientApp) { + if (user instanceof ApiUser) { + if (user.environment !== ALL) { + return user.environment; + } else if (user.environment === ALL && data.environment) { + return data.environment; + } + } + return 'default'; + } + + async handleRegister(req: IAuthRequest, res: Response): Promise { + const { body: data, ip: clientIp, user } = req; + data.environment = this.resolveEnvironment(user, data); await this.metrics.registerClient(data, clientIp); return res.status(202).end(); } diff --git a/src/lib/services/client-metrics/register-schema.ts b/src/lib/services/client-metrics/register-schema.ts index 6e41b9c1f1..0ad69843b1 100644 --- a/src/lib/services/client-metrics/register-schema.ts +++ b/src/lib/services/client-metrics/register-schema.ts @@ -13,4 +13,5 @@ export const clientRegisterSchema = joi .items(joi.string(), joi.any().strip()), started: joi.date().required(), interval: joi.number().required(), + environment: joi.string().optional(), }); diff --git a/src/lib/types/stores/client-instance-store.ts b/src/lib/types/stores/client-instance-store.ts index ffa2fcf054..8bc0f74d52 100644 --- a/src/lib/types/stores/client-instance-store.ts +++ b/src/lib/types/stores/client-instance-store.ts @@ -10,6 +10,7 @@ export interface INewClientInstance { sdkVersion?: string; clientIp?: string; lastSeen?: Date; + environment?: string; } export interface IClientInstanceStore extends Store< diff --git a/src/migrations/20211011094226-add-environment-to-client-instances.js b/src/migrations/20211011094226-add-environment-to-client-instances.js new file mode 100644 index 0000000000..126cd6d2a5 --- /dev/null +++ b/src/migrations/20211011094226-add-environment-to-client-instances.js @@ -0,0 +1,29 @@ +'use strict'; + +exports.up = function (db, cb) { + db.runSql( + ` + ALTER TABLE client_instances DROP CONSTRAINT client_instances_pkey; + ALTER TABLE client_instances ADD COLUMN environment varchar(255) NOT NULL DEFAULT 'default'; + ALTER TABLE client_instances ADD CONSTRAINT client_instances_pkey PRIMARY KEY (app_name, environment, instance_id); + CREATE INDEX client_instances_environment_idx ON client_instances(environment); + `, + cb, + ); +}; + +exports.down = function (db, cb) { + db.runSql( + ` + DROP INDEX client_instances_environment_idx; + ALTER TABLE client_instances DROP CONSTRAINT client_instances_pkey; + ALTER TABLE client_instances ADD CONSTRAINT client_instances_pkey PRIMARY KEY (app_name, instance_id); + ALTER TABLE client_instances DROP COLUMN environment; + `, + cb, + ); +}; + +exports._meta = { + version: 1, +};