mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	cleanup api-db-stores a bit
This commit is contained in:
		
							parent
							
								
									23bf2250fc
								
							
						
					
					
						commit
						4037fdf8ba
					
				@ -1,36 +1,45 @@
 | 
				
			|||||||
'use strict';
 | 
					'use strict';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const { EventEmitter } = require('events');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const EVENT_COLUMNS = ['id', 'type', 'created_by', 'created_at', 'data'];
 | 
					const EVENT_COLUMNS = ['id', 'type', 'created_by', 'created_at', 'data'];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module.exports = function (db) {
 | 
					class EventStore extends EventEmitter {
 | 
				
			||||||
    function storeEvent (event) {
 | 
					
 | 
				
			||||||
        return db('events').insert({
 | 
					    constructor (db) {
 | 
				
			||||||
 | 
					        super();
 | 
				
			||||||
 | 
					        this.db = db;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    store (event) {
 | 
				
			||||||
 | 
					        return this.db('events').insert({
 | 
				
			||||||
            type: event.type,
 | 
					            type: event.type,
 | 
				
			||||||
            created_by: event.createdBy, // eslint-disable-line
 | 
					            created_by: event.createdBy, // eslint-disable-line
 | 
				
			||||||
            data: event.data,
 | 
					            data: event.data,
 | 
				
			||||||
        });
 | 
					        })
 | 
				
			||||||
 | 
					        .then(() => this.emit(event.type, event));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function getEvents () {
 | 
					    getEvents () {
 | 
				
			||||||
        return db
 | 
					        return this.db
 | 
				
			||||||
            .select(EVENT_COLUMNS)
 | 
					            .select(EVENT_COLUMNS)
 | 
				
			||||||
            .from('events')
 | 
					            .from('events')
 | 
				
			||||||
            .limit(100)
 | 
					            .limit(100)
 | 
				
			||||||
            .orderBy('created_at', 'desc')
 | 
					            .orderBy('created_at', 'desc')
 | 
				
			||||||
            .map(rowToEvent);
 | 
					            .map(this.rowToEvent);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function getEventsFilterByName (name) {
 | 
					    getEventsFilterByName (name) {
 | 
				
			||||||
        return db
 | 
					        return this.db
 | 
				
			||||||
        .select(EVENT_COLUMNS)
 | 
					        .select(EVENT_COLUMNS)
 | 
				
			||||||
        .from('events')
 | 
					        .from('events')
 | 
				
			||||||
        .limit(100)
 | 
					        .limit(100)
 | 
				
			||||||
        .whereRaw('data ->> \'name\' = ?', [name])
 | 
					        .whereRaw('data ->> \'name\' = ?', [name])
 | 
				
			||||||
        .orderBy('created_at', 'desc')
 | 
					        .orderBy('created_at', 'desc')
 | 
				
			||||||
        .map(rowToEvent);
 | 
					        .map(this.rowToEvent);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function rowToEvent (row) {
 | 
					    rowToEvent (row) {
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
            id: row.id,
 | 
					            id: row.id,
 | 
				
			||||||
            type: row.type,
 | 
					            type: row.type,
 | 
				
			||||||
@ -39,11 +48,7 @@ module.exports = function (db) {
 | 
				
			|||||||
            data: row.data,
 | 
					            data: row.data,
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    return {
 | 
					 | 
				
			||||||
        store: storeEvent,
 | 
					 | 
				
			||||||
        getEvents,
 | 
					 | 
				
			||||||
        getEventsFilterByName,
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					module.exports = EventStore;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -5,42 +5,43 @@ const logger = require('../logger');
 | 
				
			|||||||
const NotFoundError = require('../error/notfound-error');
 | 
					const NotFoundError = require('../error/notfound-error');
 | 
				
			||||||
const FEATURE_COLUMNS = ['name', 'description', 'enabled', 'strategies'];
 | 
					const FEATURE_COLUMNS = ['name', 'description', 'enabled', 'strategies'];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module.exports = function (db, eventStore) {
 | 
					class FeatureToggleStore {
 | 
				
			||||||
    eventStore.on(eventType.featureCreated, event => createFeature(event.data));
 | 
					    constructor (db, eventStore) {
 | 
				
			||||||
 | 
					        this.db = db;
 | 
				
			||||||
 | 
					        eventStore.on(eventType.featureCreated, event => this._createFeature(event.data));
 | 
				
			||||||
 | 
					        eventStore.on(eventType.featureUpdated, event => this._updateFeature(event.data));
 | 
				
			||||||
 | 
					        eventStore.on(eventType.featureArchived, event => this._archiveFeature(event.data));
 | 
				
			||||||
 | 
					        eventStore.on(eventType.featureRevived, event => this._reviveFeature(event.data));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    eventStore.on(eventType.featureUpdated, event => updateFeature(event.data));
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    eventStore.on(eventType.featureArchived, event => archiveFeature(event.data));
 | 
					    getFeatures () {
 | 
				
			||||||
 | 
					        return this.db
 | 
				
			||||||
    eventStore.on(eventType.featureRevived, event => reviveFeature(event.data));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    function getFeatures () {
 | 
					 | 
				
			||||||
        return db
 | 
					 | 
				
			||||||
            .select(FEATURE_COLUMNS)
 | 
					            .select(FEATURE_COLUMNS)
 | 
				
			||||||
            .from('features')
 | 
					            .from('features')
 | 
				
			||||||
            .where({ archived: 0 })
 | 
					            .where({ archived: 0 })
 | 
				
			||||||
            .orderBy('name', 'asc')
 | 
					            .orderBy('name', 'asc')
 | 
				
			||||||
            .map(rowToFeature);
 | 
					            .map(this.rowToFeature);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function getFeature (name) {
 | 
					    getFeature (name) {
 | 
				
			||||||
        return db
 | 
					        return this.db
 | 
				
			||||||
            .first(FEATURE_COLUMNS)
 | 
					            .first(FEATURE_COLUMNS)
 | 
				
			||||||
            .from('features')
 | 
					            .from('features')
 | 
				
			||||||
            .where({ name })
 | 
					            .where({ name })
 | 
				
			||||||
            .then(rowToFeature);
 | 
					            .then(this.rowToFeature);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function getArchivedFeatures () {
 | 
					    getArchivedFeatures () {
 | 
				
			||||||
        return db
 | 
					        return this.db
 | 
				
			||||||
            .select(FEATURE_COLUMNS)
 | 
					            .select(FEATURE_COLUMNS)
 | 
				
			||||||
            .from('features')
 | 
					            .from('features')
 | 
				
			||||||
            .where({ archived: 1 })
 | 
					            .where({ archived: 1 })
 | 
				
			||||||
            .orderBy('name', 'asc')
 | 
					            .orderBy('name', 'asc')
 | 
				
			||||||
            .map(rowToFeature);
 | 
					            .map(this.rowToFeature);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function rowToFeature (row) {
 | 
					    rowToFeature (row) {
 | 
				
			||||||
        if (!row) {
 | 
					        if (!row) {
 | 
				
			||||||
            throw new NotFoundError('No feature toggle found');
 | 
					            throw new NotFoundError('No feature toggle found');
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -52,7 +53,7 @@ module.exports = function (db, eventStore) {
 | 
				
			|||||||
        };
 | 
					        };
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function eventDataToRow (data) {
 | 
					    eventDataToRow (data) {
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
            name: data.name,
 | 
					            name: data.name,
 | 
				
			||||||
            description: data.description,
 | 
					            description: data.description,
 | 
				
			||||||
@ -62,25 +63,25 @@ module.exports = function (db, eventStore) {
 | 
				
			|||||||
        };
 | 
					        };
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function createFeature (data) {
 | 
					    _createFeature (data) {
 | 
				
			||||||
        return db('features')
 | 
					        return this.db('features')
 | 
				
			||||||
            .insert(eventDataToRow(data))
 | 
					            .insert(this.eventDataToRow(data))
 | 
				
			||||||
            .catch(err => {
 | 
					            .catch(err => {
 | 
				
			||||||
                logger.error('Could not insert feature, error was: ', err);
 | 
					                logger.error('Could not insert feature, error was: ', err);
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function updateFeature (data) {
 | 
					    _updateFeature (data) {
 | 
				
			||||||
        return db('features')
 | 
					        return this.db('features')
 | 
				
			||||||
            .where({ name: data.name })
 | 
					            .where({ name: data.name })
 | 
				
			||||||
            .update(eventDataToRow(data))
 | 
					            .update(this.eventDataToRow(data))
 | 
				
			||||||
            .catch(err => {
 | 
					            .catch(err => {
 | 
				
			||||||
                logger.error('Could not update feature, error was: ', err);
 | 
					                logger.error('Could not update feature, error was: ', err);
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function archiveFeature (data) {
 | 
					    _archiveFeature (data) {
 | 
				
			||||||
        return db('features')
 | 
					        return this.db('features')
 | 
				
			||||||
            .where({ name: data.name })
 | 
					            .where({ name: data.name })
 | 
				
			||||||
            .update({ archived: 1 })
 | 
					            .update({ archived: 1 })
 | 
				
			||||||
            .catch(err => {
 | 
					            .catch(err => {
 | 
				
			||||||
@ -88,21 +89,14 @@ module.exports = function (db, eventStore) {
 | 
				
			|||||||
            });
 | 
					            });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function reviveFeature (data) {
 | 
					    _reviveFeature (data) {
 | 
				
			||||||
        return db('features')
 | 
					        return this.db('features')
 | 
				
			||||||
            .where({ name: data.name })
 | 
					            .where({ name: data.name })
 | 
				
			||||||
            .update({ archived: 0, enabled: 0 })
 | 
					            .update({ archived: 0, enabled: 0 })
 | 
				
			||||||
            .catch(err => {
 | 
					            .catch(err => {
 | 
				
			||||||
                logger.error('Could not archive feature, error was: ', err);
 | 
					                logger.error('Could not archive feature, error was: ', err);
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return {
 | 
					 | 
				
			||||||
        getFeatures,
 | 
					 | 
				
			||||||
        getFeature,
 | 
					 | 
				
			||||||
        getArchivedFeatures,
 | 
					 | 
				
			||||||
        _createFeature: createFeature, // visible for testing
 | 
					 | 
				
			||||||
        _updateFeature: updateFeature,  // visible for testing
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					module.exports = FeatureToggleStore;
 | 
				
			||||||
@ -1,13 +1,21 @@
 | 
				
			|||||||
'use strict';
 | 
					'use strict';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const eventDbCreator = require('./event');
 | 
					const EventStore = require('./event-store');
 | 
				
			||||||
 | 
					const FeatureToggleStore = require('./feature-toggle-store');
 | 
				
			||||||
 | 
					const StrategyStore = require('./strategy-store');
 | 
				
			||||||
const clientInstancesDbCreator = require('./client-instances');
 | 
					const clientInstancesDbCreator = require('./client-instances');
 | 
				
			||||||
const clientMetricsDbCreator = require('./client-metrics');
 | 
					const clientMetricsDbCreator = require('./client-metrics');
 | 
				
			||||||
const clientStrategiesDbCreator = require('./client-strategies');
 | 
					const clientStrategiesDbCreator = require('./client-strategies');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module.exports = (db) => ({
 | 
					module.exports = (db) => {
 | 
				
			||||||
    eventDb: eventDbCreator(db),
 | 
					    const eventStore = new EventStore(db);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					        eventStore,
 | 
				
			||||||
 | 
					        featureToggleStore: new FeatureToggleStore(db, eventStore),
 | 
				
			||||||
 | 
					        strategyStore: new StrategyStore(db, eventStore),
 | 
				
			||||||
        clientInstancesDb: clientInstancesDbCreator(db),
 | 
					        clientInstancesDb: clientInstancesDbCreator(db),
 | 
				
			||||||
        clientMetricsDb: clientMetricsDbCreator(db),
 | 
					        clientMetricsDb: clientMetricsDbCreator(db),
 | 
				
			||||||
        clientStrategiesDb: clientStrategiesDbCreator(db),
 | 
					        clientStrategiesDb: clientStrategiesDbCreator(db),
 | 
				
			||||||
});
 | 
					    };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
				
			|||||||
@ -4,36 +4,39 @@ const eventType = require('../event-type');
 | 
				
			|||||||
const logger = require('../logger');
 | 
					const logger = require('../logger');
 | 
				
			||||||
const NotFoundError = require('../error/notfound-error');
 | 
					const NotFoundError = require('../error/notfound-error');
 | 
				
			||||||
const STRATEGY_COLUMNS = ['name', 'description', 'parameters_template'];
 | 
					const STRATEGY_COLUMNS = ['name', 'description', 'parameters_template'];
 | 
				
			||||||
 | 
					const TABLE = 'strategies';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module.exports = function (db, eventStore) {
 | 
					class StrategyStore {
 | 
				
			||||||
    eventStore.on(eventType.strategyCreated, event => createStrategy(event.data));
 | 
					    constructor (db, eventStore) {
 | 
				
			||||||
 | 
					        this.db = db;
 | 
				
			||||||
 | 
					        eventStore.on(eventType.strategyCreated, event => this._createStrategy(event.data));
 | 
				
			||||||
        eventStore.on(eventType.strategyDeleted, event => {
 | 
					        eventStore.on(eventType.strategyDeleted, event => {
 | 
				
			||||||
        db('strategies')
 | 
					            db(TABLE)
 | 
				
			||||||
                .where('name', event.data.name)
 | 
					                .where('name', event.data.name)
 | 
				
			||||||
                .del()
 | 
					                .del()
 | 
				
			||||||
                .catch(err => {
 | 
					                .catch(err => {
 | 
				
			||||||
                    logger.error('Could not delete strategy, error was: ', err);
 | 
					                    logger.error('Could not delete strategy, error was: ', err);
 | 
				
			||||||
                });
 | 
					                });
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function getStrategies () {
 | 
					    getStrategies () {
 | 
				
			||||||
        return db
 | 
					        return this.db
 | 
				
			||||||
            .select(STRATEGY_COLUMNS)
 | 
					            .select(STRATEGY_COLUMNS)
 | 
				
			||||||
            .from('strategies')
 | 
					            .from(TABLE)
 | 
				
			||||||
            .orderBy('created_at', 'asc')
 | 
					            .orderBy('created_at', 'asc')
 | 
				
			||||||
            .map(rowToStrategy);
 | 
					            .map(this.rowToStrategy);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function getStrategy (name) {
 | 
					    getStrategy (name) {
 | 
				
			||||||
        return db
 | 
					        return this.db
 | 
				
			||||||
            .first(STRATEGY_COLUMNS)
 | 
					            .first(STRATEGY_COLUMNS)
 | 
				
			||||||
            .from('strategies')
 | 
					            .from(TABLE)
 | 
				
			||||||
            .where({ name })
 | 
					            .where({ name })
 | 
				
			||||||
            .then(rowToStrategy);
 | 
					            .then(this.rowToStrategy);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function rowToStrategy (row) {
 | 
					    rowToStrategy (row) {
 | 
				
			||||||
        if (!row) {
 | 
					        if (!row) {
 | 
				
			||||||
            throw new NotFoundError('No strategy found');
 | 
					            throw new NotFoundError('No strategy found');
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -45,7 +48,7 @@ module.exports = function (db, eventStore) {
 | 
				
			|||||||
        };
 | 
					        };
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function eventDataToRow (data) {
 | 
					    eventDataToRow (data) {
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
            name: data.name,
 | 
					            name: data.name,
 | 
				
			||||||
            description: data.description,
 | 
					            description: data.description,
 | 
				
			||||||
@ -53,18 +56,14 @@ module.exports = function (db, eventStore) {
 | 
				
			|||||||
        };
 | 
					        };
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function createStrategy (data) {
 | 
					    _createStrategy (data) {
 | 
				
			||||||
        db('strategies')
 | 
					        this.db(TABLE)
 | 
				
			||||||
            .insert(eventDataToRow(data))
 | 
					            .insert(this.eventDataToRow(data))
 | 
				
			||||||
            .catch(err => {
 | 
					            .catch(err => {
 | 
				
			||||||
                logger.error('Could not insert strategy, error was: ', err);
 | 
					                logger.error('Could not insert strategy, error was: ', err);
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    return {
 | 
					 | 
				
			||||||
        getStrategies,
 | 
					 | 
				
			||||||
        getStrategy,
 | 
					 | 
				
			||||||
        _createStrategy: createStrategy, // visible for testing
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					module.exports = StrategyStore;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1,15 +0,0 @@
 | 
				
			|||||||
'use strict';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const EventEmitter = require('events').EventEmitter;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
module.exports = class EventStore extends EventEmitter {
 | 
					 | 
				
			||||||
    constructor (eventDb) {
 | 
					 | 
				
			||||||
        super();
 | 
					 | 
				
			||||||
        this.eventDb = eventDb;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    create  (event) {
 | 
					 | 
				
			||||||
        return this.eventDb.store(event).then(() => this.emit(event.type, event));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@ -4,17 +4,17 @@ const eventDiffer = require('../event-differ');
 | 
				
			|||||||
const version = 1;
 | 
					const version = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module.exports = function (app, config) {
 | 
					module.exports = function (app, config) {
 | 
				
			||||||
    const eventDb = config.eventDb;
 | 
					    const eventStore = config.eventStore;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    app.get('/events', (req, res) => {
 | 
					    app.get('/events', (req, res) => {
 | 
				
			||||||
        eventDb.getEvents().then(events => {
 | 
					        eventStore.getEvents().then(events => {
 | 
				
			||||||
            eventDiffer.addDiffs(events);
 | 
					            eventDiffer.addDiffs(events);
 | 
				
			||||||
            res.json({ version, events });
 | 
					            res.json({ version, events });
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    app.get('/events/:name', (req, res) => {
 | 
					    app.get('/events/:name', (req, res) => {
 | 
				
			||||||
        eventDb.getEventsFilterByName(req.params.name).then(events => {
 | 
					        eventStore.getEventsFilterByName(req.params.name).then(events => {
 | 
				
			||||||
            if (events) {
 | 
					            if (events) {
 | 
				
			||||||
                eventDiffer.addDiffs(events);
 | 
					                eventDiffer.addDiffs(events);
 | 
				
			||||||
                res.json(events);
 | 
					                res.json(events);
 | 
				
			||||||
 | 
				
			|||||||
@ -6,11 +6,11 @@ const ValidationError = require('../error/validation-error');
 | 
				
			|||||||
const validateRequest = require('../error/validate-request');
 | 
					const validateRequest = require('../error/validate-request');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module.exports = function (app, config) {
 | 
					module.exports = function (app, config) {
 | 
				
			||||||
    const featureDb = config.featureDb;
 | 
					    const featureToggleStore = config.featureToggleStore;
 | 
				
			||||||
    const eventStore = config.eventStore;
 | 
					    const eventStore = config.eventStore;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    app.get('/archive/features', (req, res) => {
 | 
					    app.get('/archive/features', (req, res) => {
 | 
				
			||||||
        featureDb.getArchivedFeatures().then(archivedFeatures => {
 | 
					        featureToggleStore.getArchivedFeatures().then(archivedFeatures => {
 | 
				
			||||||
            res.json({ features: archivedFeatures });
 | 
					            res.json({ features: archivedFeatures });
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
@ -19,7 +19,7 @@ module.exports = function (app, config) {
 | 
				
			|||||||
        req.checkBody('name', 'Name is required').notEmpty();
 | 
					        req.checkBody('name', 'Name is required').notEmpty();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        validateRequest(req)
 | 
					        validateRequest(req)
 | 
				
			||||||
            .then(() => eventStore.create({
 | 
					            .then(() => eventStore.store({
 | 
				
			||||||
                type: eventType.featureRevived,
 | 
					                type: eventType.featureRevived,
 | 
				
			||||||
                createdBy: req.connection.remoteAddress,
 | 
					                createdBy: req.connection.remoteAddress,
 | 
				
			||||||
                data: req.body,
 | 
					                data: req.body,
 | 
				
			||||||
 | 
				
			|||||||
@ -13,17 +13,17 @@ const legacyFeatureMapper = require('../helper/legacy-feature-mapper');
 | 
				
			|||||||
const version = 1;
 | 
					const version = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module.exports = function (app, config) {
 | 
					module.exports = function (app, config) {
 | 
				
			||||||
    const featureDb = config.featureDb;
 | 
					    const featureToggleStore = config.featureToggleStore;
 | 
				
			||||||
    const eventStore = config.eventStore;
 | 
					    const eventStore = config.eventStore;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    app.get('/features', (req, res) => {
 | 
					    app.get('/features', (req, res) => {
 | 
				
			||||||
        featureDb.getFeatures()
 | 
					        featureToggleStore.getFeatures()
 | 
				
			||||||
            .then((features) => features.map(legacyFeatureMapper.addOldFields))
 | 
					            .then((features) => features.map(legacyFeatureMapper.addOldFields))
 | 
				
			||||||
            .then(features => res.json({ version, features }));
 | 
					            .then(features => res.json({ version, features }));
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    app.get('/features/:featureName', (req, res) => {
 | 
					    app.get('/features/:featureName', (req, res) => {
 | 
				
			||||||
        featureDb.getFeature(req.params.featureName)
 | 
					        featureToggleStore.getFeature(req.params.featureName)
 | 
				
			||||||
            .then(legacyFeatureMapper.addOldFields)
 | 
					            .then(legacyFeatureMapper.addOldFields)
 | 
				
			||||||
            .then(feature => res.json(feature).end())
 | 
					            .then(feature => res.json(feature).end())
 | 
				
			||||||
            .catch(() => res.status(404).json({ error: 'Could not find feature' }));
 | 
					            .catch(() => res.status(404).json({ error: 'Could not find feature' }));
 | 
				
			||||||
@ -36,7 +36,7 @@ module.exports = function (app, config) {
 | 
				
			|||||||
        validateRequest(req)
 | 
					        validateRequest(req)
 | 
				
			||||||
            .then(validateFormat)
 | 
					            .then(validateFormat)
 | 
				
			||||||
            .then(validateUniqueName)
 | 
					            .then(validateUniqueName)
 | 
				
			||||||
            .then(() => eventStore.create({
 | 
					            .then(() => eventStore.store({
 | 
				
			||||||
                type: eventType.featureCreated,
 | 
					                type: eventType.featureCreated,
 | 
				
			||||||
                createdBy: extractUser(req),
 | 
					                createdBy: extractUser(req),
 | 
				
			||||||
                data: legacyFeatureMapper.toNewFormat(req.body),
 | 
					                data: legacyFeatureMapper.toNewFormat(req.body),
 | 
				
			||||||
@ -61,8 +61,8 @@ module.exports = function (app, config) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        updatedFeature.name = featureName;
 | 
					        updatedFeature.name = featureName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        featureDb.getFeature(featureName)
 | 
					        featureToggleStore.getFeature(featureName)
 | 
				
			||||||
            .then(() => eventStore.create({
 | 
					            .then(() => eventStore.store({
 | 
				
			||||||
                type: eventType.featureUpdated,
 | 
					                type: eventType.featureUpdated,
 | 
				
			||||||
                createdBy: userName,
 | 
					                createdBy: userName,
 | 
				
			||||||
                data: updatedFeature,
 | 
					                data: updatedFeature,
 | 
				
			||||||
@ -79,8 +79,8 @@ module.exports = function (app, config) {
 | 
				
			|||||||
        const featureName    = req.params.featureName;
 | 
					        const featureName    = req.params.featureName;
 | 
				
			||||||
        const userName       = extractUser(req);
 | 
					        const userName       = extractUser(req);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        featureDb.getFeature(featureName)
 | 
					        featureToggleStore.getFeature(featureName)
 | 
				
			||||||
            .then(() => eventStore.create({
 | 
					            .then(() => eventStore.store({
 | 
				
			||||||
                type: eventType.featureArchived,
 | 
					                type: eventType.featureArchived,
 | 
				
			||||||
                createdBy: userName,
 | 
					                createdBy: userName,
 | 
				
			||||||
                data: {
 | 
					                data: {
 | 
				
			||||||
@ -97,7 +97,7 @@ module.exports = function (app, config) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    function validateUniqueName (req) {
 | 
					    function validateUniqueName (req) {
 | 
				
			||||||
        return new BPromise((resolve, reject) => {
 | 
					        return new BPromise((resolve, reject) => {
 | 
				
			||||||
            featureDb.getFeature(req.body.name)
 | 
					            featureToggleStore.getFeature(req.body.name)
 | 
				
			||||||
                .then(() => {
 | 
					                .then(() => {
 | 
				
			||||||
                    reject(new NameExistsError('Feature name already exist'));
 | 
					                    reject(new NameExistsError('Feature name already exist'));
 | 
				
			||||||
                }, () => {
 | 
					                }, () => {
 | 
				
			||||||
 | 
				
			|||||||
@ -11,17 +11,17 @@ const extractUser = require('../extract-user');
 | 
				
			|||||||
const version = 1;
 | 
					const version = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module.exports = function (app, config) {
 | 
					module.exports = function (app, config) {
 | 
				
			||||||
    const strategyDb = config.strategyDb;
 | 
					    const strategyStore = config.strategyStore;
 | 
				
			||||||
    const eventStore = config.eventStore;
 | 
					    const eventStore = config.eventStore;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    app.get('/strategies', (req, res) => {
 | 
					    app.get('/strategies', (req, res) => {
 | 
				
			||||||
        strategyDb.getStrategies().then(strategies => {
 | 
					        strategyStore.getStrategies().then(strategies => {
 | 
				
			||||||
            res.json({ version, strategies });
 | 
					            res.json({ version, strategies });
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    app.get('/strategies/:name', (req, res) => {
 | 
					    app.get('/strategies/:name', (req, res) => {
 | 
				
			||||||
        strategyDb.getStrategy(req.params.name)
 | 
					        strategyStore.getStrategy(req.params.name)
 | 
				
			||||||
            .then(strategy => {
 | 
					            .then(strategy => {
 | 
				
			||||||
                res.json(strategy);
 | 
					                res.json(strategy);
 | 
				
			||||||
            })
 | 
					            })
 | 
				
			||||||
@ -33,8 +33,8 @@ module.exports = function (app, config) {
 | 
				
			|||||||
    app.delete('/strategies/:name', (req, res) => {
 | 
					    app.delete('/strategies/:name', (req, res) => {
 | 
				
			||||||
        const strategyName = req.params.name;
 | 
					        const strategyName = req.params.name;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        strategyDb.getStrategy(strategyName)
 | 
					        strategyStore.getStrategy(strategyName)
 | 
				
			||||||
            .then(() => eventStore.create({
 | 
					            .then(() => eventStore.store({
 | 
				
			||||||
                type: eventType.strategyDeleted,
 | 
					                type: eventType.strategyDeleted,
 | 
				
			||||||
                createdBy: extractUser(req),
 | 
					                createdBy: extractUser(req),
 | 
				
			||||||
                data: {
 | 
					                data: {
 | 
				
			||||||
@ -61,7 +61,7 @@ module.exports = function (app, config) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        validateRequest(req)
 | 
					        validateRequest(req)
 | 
				
			||||||
            .then(validateStrategyName)
 | 
					            .then(validateStrategyName)
 | 
				
			||||||
            .then(() => eventStore.create({
 | 
					            .then(() => eventStore.store({
 | 
				
			||||||
                type: eventType.strategyCreated,
 | 
					                type: eventType.strategyCreated,
 | 
				
			||||||
                createdBy: extractUser(req),
 | 
					                createdBy: extractUser(req),
 | 
				
			||||||
                data: newStrategy,
 | 
					                data: newStrategy,
 | 
				
			||||||
@ -81,7 +81,7 @@ module.exports = function (app, config) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    function validateStrategyName (req) {
 | 
					    function validateStrategyName (req) {
 | 
				
			||||||
        return new BPromise((resolve, reject) => {
 | 
					        return new BPromise((resolve, reject) => {
 | 
				
			||||||
            strategyDb.getStrategy(req.body.name)
 | 
					            strategyStore.getStrategy(req.body.name)
 | 
				
			||||||
                .then(() => {
 | 
					                .then(() => {
 | 
				
			||||||
                    reject(new NameExistsError('Feature name already exist'));
 | 
					                    reject(new NameExistsError('Feature name already exist'));
 | 
				
			||||||
                }, () => {
 | 
					                }, () => {
 | 
				
			||||||
 | 
				
			|||||||
@ -13,23 +13,23 @@ function createApp (options) {
 | 
				
			|||||||
    const db = require('./lib/db/db-pool')(options.databaseUri);
 | 
					    const db = require('./lib/db/db-pool')(options.databaseUri);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Database dependecies (statefull)
 | 
					    // Database dependecies (statefull)
 | 
				
			||||||
    const { eventDb, clientInstancesDb, clientMetricsDb, clientStrategiesDb } = require('./lib/db')(db);
 | 
					    const {
 | 
				
			||||||
 | 
					        eventStore,
 | 
				
			||||||
    // Needs some cleanup!
 | 
					        featureToggleStore,
 | 
				
			||||||
    const EventStore = require('./lib/event-store');
 | 
					        strategyStore,
 | 
				
			||||||
    const eventStore = new EventStore(eventDb);
 | 
					        clientInstancesDb,
 | 
				
			||||||
    const featureDb = require('./lib/db/feature')(db, eventStore);
 | 
					        clientMetricsDb,
 | 
				
			||||||
    const strategyDb = require('./lib/db/strategy')(db, eventStore);
 | 
					        clientStrategiesDb,
 | 
				
			||||||
 | 
					    } = require('./lib/db')(db);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const config = {
 | 
					    const config = {
 | 
				
			||||||
        baseUriPath: options.baseUriPath,
 | 
					        baseUriPath: options.baseUriPath,
 | 
				
			||||||
        port: options.port,
 | 
					        port: options.port,
 | 
				
			||||||
        publicFolder: options.publicFolder,
 | 
					        publicFolder: options.publicFolder,
 | 
				
			||||||
        db,
 | 
					        db,
 | 
				
			||||||
        eventDb,
 | 
					 | 
				
			||||||
        eventStore,
 | 
					        eventStore,
 | 
				
			||||||
        featureDb,
 | 
					        featureToggleStore,
 | 
				
			||||||
        strategyDb,
 | 
					        strategyStore,
 | 
				
			||||||
        clientMetricsDb,
 | 
					        clientMetricsDb,
 | 
				
			||||||
        clientStrategiesDb,
 | 
					        clientStrategiesDb,
 | 
				
			||||||
        clientInstancesDb,
 | 
					        clientInstancesDb,
 | 
				
			||||||
 | 
				
			|||||||
@ -6,20 +6,22 @@ const BPromise = require('bluebird');
 | 
				
			|||||||
let request = require('supertest');
 | 
					let request = require('supertest');
 | 
				
			||||||
const databaseUri = require('./database-config').getDatabaseUri();
 | 
					const databaseUri = require('./database-config').getDatabaseUri();
 | 
				
			||||||
const knex = require('../../lib/db/db-pool')(databaseUri);
 | 
					const knex = require('../../lib/db/db-pool')(databaseUri);
 | 
				
			||||||
const { eventDb, clientInstancesDb, clientStrategiesDb, clientMetricsDb } = require('../../lib/db')(knex);
 | 
					const {
 | 
				
			||||||
const EventStore = require('../../lib/event-store');
 | 
					    eventStore,
 | 
				
			||||||
const eventStore = new EventStore(eventDb);
 | 
					    featureToggleStore,
 | 
				
			||||||
const featureDb = require('../../lib/db/feature')(knex, eventStore);
 | 
					    strategyStore,
 | 
				
			||||||
const strategyDb = require('../../lib/db/strategy')(knex, eventStore);
 | 
					    clientInstancesDb,
 | 
				
			||||||
 | 
					    clientStrategiesDb,
 | 
				
			||||||
 | 
					    clientMetricsDb,
 | 
				
			||||||
 | 
					} = require('../../lib/db')(knex);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const app = require('../../app')({
 | 
					const app = require('../../app')({
 | 
				
			||||||
    baseUriPath: '',
 | 
					    baseUriPath: '',
 | 
				
			||||||
    db: knex,
 | 
					    db: knex,
 | 
				
			||||||
    eventDb,
 | 
					 | 
				
			||||||
    eventStore,
 | 
					    eventStore,
 | 
				
			||||||
    featureDb,
 | 
					    featureToggleStore,
 | 
				
			||||||
    strategyDb,
 | 
					    strategyStore,
 | 
				
			||||||
    clientStrategiesDb,
 | 
					    clientStrategiesDb,
 | 
				
			||||||
    clientInstancesDb,
 | 
					    clientInstancesDb,
 | 
				
			||||||
    clientMetricsDb,
 | 
					    clientMetricsDb,
 | 
				
			||||||
@ -42,7 +44,7 @@ function createStrategies () {
 | 
				
			|||||||
                emails: 'String',
 | 
					                emails: 'String',
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
    ], strategy => strategyDb._createStrategy(strategy));
 | 
					    ], strategy => strategyStore._createStrategy(strategy));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function createFeatures () {
 | 
					function createFeatures () {
 | 
				
			||||||
@ -106,7 +108,7 @@ function createFeatures () {
 | 
				
			|||||||
                },
 | 
					                },
 | 
				
			||||||
            }],
 | 
					            }],
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
    ], feature => featureDb._createFeature(feature));
 | 
					    ], feature => featureToggleStore._createFeature(feature));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function destroyStrategies () {
 | 
					function destroyStrategies () {
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user