mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	Make Appinstance registration include environment (#1014)
This commit is contained in:
		
							parent
							
								
									8ac3f6fc36
								
							
						
					
					
						commit
						20a4aeff97
					
				
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@ -52,3 +52,5 @@ package-lock.json
 | 
			
		||||
/website/yarn.lock
 | 
			
		||||
/website/translated_docs
 | 
			
		||||
/website/i18n/*
 | 
			
		||||
.env
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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();
 | 
			
		||||
 | 
			
		||||
@ -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<void> {
 | 
			
		||||
        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<void> {
 | 
			
		||||
        const { body: data, ip: clientIp, user } = req;
 | 
			
		||||
        data.environment = this.resolveEnvironment(user, data);
 | 
			
		||||
        await this.metrics.registerClient(data, clientIp);
 | 
			
		||||
        return res.status(202).end();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -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(),
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
@ -10,6 +10,7 @@ export interface INewClientInstance {
 | 
			
		||||
    sdkVersion?: string;
 | 
			
		||||
    clientIp?: string;
 | 
			
		||||
    lastSeen?: Date;
 | 
			
		||||
    environment?: string;
 | 
			
		||||
}
 | 
			
		||||
export interface IClientInstanceStore
 | 
			
		||||
    extends Store<
 | 
			
		||||
 | 
			
		||||
@ -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,
 | 
			
		||||
};
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user