From 875fb7734cd982ea5017b9eae04d4cd0470b05fc Mon Sep 17 00:00:00 2001 From: Youssef Date: Mon, 8 Nov 2021 16:31:38 +0100 Subject: [PATCH 01/27] create splash migration store and service file --- src/lib/db/user-splash-store.ts | 111 ++++++++++++++++++ src/lib/services/user-splash-service.ts | 47 ++++++++ src/lib/types/stores.ts | 3 + src/lib/types/stores/user-splash-store.ts | 19 +++ ...20211108130333-create-user-splash-table.js | 25 ++++ src/server-dev.ts | 2 +- 6 files changed, 206 insertions(+), 1 deletion(-) create mode 100644 src/lib/db/user-splash-store.ts create mode 100644 src/lib/services/user-splash-service.ts create mode 100644 src/lib/types/stores/user-splash-store.ts create mode 100644 src/migrations/20211108130333-create-user-splash-table.js diff --git a/src/lib/db/user-splash-store.ts b/src/lib/db/user-splash-store.ts new file mode 100644 index 0000000000..77ddbc1c05 --- /dev/null +++ b/src/lib/db/user-splash-store.ts @@ -0,0 +1,111 @@ +import { Knex } from 'knex'; +import { EventEmitter } from 'events'; +import { LogProvider, Logger } from '../logger'; +import { + IUserSplash, + IUserSplashKey, + IUserSplashStore, +} from '../types/stores/user-splash-store'; + +const COLUMNS = ['user_id', 'splash_id', 'seen']; +const TABLE = 'user_splash'; + +interface IUserSplashTable { + seen?: boolean; + splash_id: string; + user_id: number; +} + +const fieldToRow = (fields: IUserSplash): IUserSplashTable => ({ + seen: fields.seen, + splash_id: fields.splashId, + user_id: fields.userId, +}); + +const rowToField = (row: IUserSplashTable): IUserSplash => ({ + seen: row.seen, + splashId: row.splash_id, + userId: row.user_id, +}); + +export default class UserSplashStore implements IUserSplashStore { + private db: Knex; + + private logger: Logger; + + constructor(db: Knex, eventBus: EventEmitter, getLogger: LogProvider) { + this.db = db; + this.logger = getLogger('user-splash-store.ts'); + } + + async getAllUserSplashs(userId: number): Promise { + const userSplash = await this.db + .table(TABLE) + .select() + .where({ user_id: userId }); + + return userSplash.map(rowToField); + } + + async getSplash( + userId: number, + splashId: string, + ): Promise { + const userSplash = await this.db + .table(TABLE) + .select() + .where({ user_id: userId, splash_id: splashId }) + .first(); + + return rowToField(userSplash); + } + + async updateSplash(splash: IUserSplash): Promise { + const insertedSplash = await this.db + .table(TABLE) + .insert(fieldToRow(splash)) + .onConflict(['user_id', 'splash_id']) + .merge() + .returning(COLUMNS); + + return rowToField(insertedSplash[0]); + } + + async delete({ userId, splashId }: IUserSplashKey): Promise { + await this.db(TABLE) + .where({ user_id: userId, splash_id: splashId }) + .del(); + } + + async deleteAll(): Promise { + await this.db(TABLE).del(); + } + + destroy(): void {} + + async exists({ userId, splashId }: IUserSplashKey): Promise { + const result = await this.db.raw( + `SELECT EXISTS (SELECT 1 FROM ${TABLE} WHERE user_id = ? AND splash_id = ?) AS present`, + [userId, splashId], + ); + const { present } = result.rows[0]; + return present; + } + + async get({ + userId, + splashId, + }: IUserSplashKey): Promise { + return this.getSplash(userId, splashId); + } + + async getAll(): Promise { + const userSplashs = await this.db + .table(TABLE) + .select(); + + return userSplashs.map(rowToField); + } +} + +module.exports = UserSplashStore; diff --git a/src/lib/services/user-splash-service.ts b/src/lib/services/user-splash-service.ts new file mode 100644 index 0000000000..a86b44f009 --- /dev/null +++ b/src/lib/services/user-splash-service.ts @@ -0,0 +1,47 @@ +import { Logger } from '../logger'; +import { IUnleashStores } from '../types/stores'; +import { IUnleashConfig } from '../types/option'; +import User from '../types/user'; +import { + IUserSplash, + IUserSplashStore, +} from '../types/stores/user-splash-store'; + +export default class UserSplashService { + private userSplashStore: IUserSplashStore; + + private logger: Logger; + + constructor( + { userSplashStore }: Pick, + { getLogger }: Pick, + ) { + this.userSplashStore = userSplashStore; + this.logger = getLogger('services/user-splash-service.js'); + } + + async getAllUserSplash(user: User): Promise { + if (user.isAPI) { + return []; + } + try { + return await this.userSplashStore.getAllUserSplashs(user.id); + } catch (err) { + this.logger.error(err); + return []; + } + } + + async getSplash( + user_id: number, + splash_id: string, + ): Promise { + return this.userSplashStore.getSplash(user_id, splash_id); + } + + async updateSplash(splash: IUserSplash): Promise { + return this.userSplashStore.updateSplash(splash); + } +} + +module.exports = UserSplashService; diff --git a/src/lib/types/stores.ts b/src/lib/types/stores.ts index ff22f24b3f..ff09b606a5 100644 --- a/src/lib/types/stores.ts +++ b/src/lib/types/stores.ts @@ -23,6 +23,8 @@ import { IFeatureStrategiesStore } from './stores/feature-strategies-store'; import { IEnvironmentStore } from './stores/environment-store'; import { IFeatureToggleClientStore } from './stores/feature-toggle-client-store'; import { IClientMetricsStoreV2 } from './stores/client-metrics-store-v2'; +import { IUserSplashStore } from './stores/user-splash-store'; + export interface IUnleashStores { accessStore: IAccessStore; @@ -50,4 +52,5 @@ export interface IUnleashStores { tagTypeStore: ITagTypeStore; userFeedbackStore: IUserFeedbackStore; userStore: IUserStore; + userSplashStore: IUserSplashStore; } diff --git a/src/lib/types/stores/user-splash-store.ts b/src/lib/types/stores/user-splash-store.ts new file mode 100644 index 0000000000..ebe833e823 --- /dev/null +++ b/src/lib/types/stores/user-splash-store.ts @@ -0,0 +1,19 @@ +import { Store } from './store'; + +export interface IUserSplash { + seen?: boolean; + splashId: string; + userId: number; +} + +export interface IUserSplashKey { + userId: number; + splashId: string; +} + +export interface IUserSplashStore + extends Store { + getAllUserSplashs(userId: number): Promise; + getSplash(userId: number, splashId: string): Promise; + updateSplash(splash: IUserSplash): Promise; +} diff --git a/src/migrations/20211108130333-create-user-splash-table.js b/src/migrations/20211108130333-create-user-splash-table.js new file mode 100644 index 0000000000..067ec76bd3 --- /dev/null +++ b/src/migrations/20211108130333-create-user-splash-table.js @@ -0,0 +1,25 @@ +'use strict'; + +exports.up = function (db, cb) { + db.runSql( + ` + CREATE TABLE IF NOT EXISTS user_splash + (user_id INTEGER NOT NULL references users (id), + splash_id TEXT, + seen BOOLEAN NOT NULL DEFAULT false, + PRIMARY KEY (user_id, splash_id)); + CREATE INDEX user_splash_user_id_idx ON user_splash (user_id); + );`, + cb, + ); +}; + +exports.down = function (db, cb) { + db.runSql( + ` + DROP INDEX user_splash_user_id_idx; + DROP TABLE user_splash; +`, + cb, +); +}; diff --git a/src/server-dev.ts b/src/server-dev.ts index bf1cea9c95..34d7b1aec2 100644 --- a/src/server-dev.ts +++ b/src/server-dev.ts @@ -8,7 +8,7 @@ process.nextTick(async () => { createConfig({ db: { user: 'unleash_user', - password: 'passord', + password: 'some_password', host: 'localhost', port: 5432, database: 'unleash', From d73293c5762d9667571b3819efef79fa1e013629 Mon Sep 17 00:00:00 2001 From: Fredrik Oseberg Date: Tue, 9 Nov 2021 11:52:02 +0100 Subject: [PATCH 02/27] fix: add migration --- src/lib/db/index.ts | 2 + src/lib/db/user-splash-store.ts | 10 +-- src/lib/routes/admin-api/user.ts | 6 ++ src/lib/services/index.ts | 3 + src/lib/services/user-splash-service.ts | 6 +- src/lib/types/services.ts | 2 + src/lib/types/stores/user-splash-store.ts | 5 +- ...20211108130333-create-user-splash-table.js | 11 ++-- ...211109103930-add-splash-entry-for-users.js | 15 +++++ src/server-dev.ts | 2 +- src/test/fixtures/fake-user-splash-store.ts | 65 +++++++++++++++++++ src/test/fixtures/store.ts | 2 + 12 files changed, 107 insertions(+), 22 deletions(-) create mode 100644 src/migrations/20211109103930-add-splash-entry-for-users.js create mode 100644 src/test/fixtures/fake-user-splash-store.ts diff --git a/src/lib/db/index.ts b/src/lib/db/index.ts index a7d0c07d04..fbe9cec78f 100644 --- a/src/lib/db/index.ts +++ b/src/lib/db/index.ts @@ -29,6 +29,7 @@ import EnvironmentStore from './environment-store'; import FeatureTagStore from './feature-tag-store'; import { FeatureEnvironmentStore } from './feature-environment-store'; import { ClientMetricsStoreV2 } from './client-metrics-store-v2'; +import UserSplashStore from './user-splash-store'; export const createStores = ( config: IUnleashConfig, @@ -85,6 +86,7 @@ export const createStores = ( eventBus, getLogger, ), + userSplashStore: new UserSplashStore(db, eventBus, getLogger), }; }; diff --git a/src/lib/db/user-splash-store.ts b/src/lib/db/user-splash-store.ts index 77ddbc1c05..6b867ee4d7 100644 --- a/src/lib/db/user-splash-store.ts +++ b/src/lib/db/user-splash-store.ts @@ -47,10 +47,7 @@ export default class UserSplashStore implements IUserSplashStore { return userSplash.map(rowToField); } - async getSplash( - userId: number, - splashId: string, - ): Promise { + async getSplash(userId: number, splashId: string): Promise { const userSplash = await this.db .table(TABLE) .select() @@ -92,10 +89,7 @@ export default class UserSplashStore implements IUserSplashStore { return present; } - async get({ - userId, - splashId, - }: IUserSplashKey): Promise { + async get({ userId, splashId }: IUserSplashKey): Promise { return this.getSplash(userId, splashId); } diff --git a/src/lib/routes/admin-api/user.ts b/src/lib/routes/admin-api/user.ts index 6b5299311f..1d2815a9c6 100644 --- a/src/lib/routes/admin-api/user.ts +++ b/src/lib/routes/admin-api/user.ts @@ -7,6 +7,7 @@ import { IUnleashServices } from '../../types/services'; import UserService from '../../services/user-service'; import SessionService from '../../services/session-service'; import UserFeedbackService from '../../services/user-feedback-service'; +import UserSplashService from 'lib/services/user-splash-service'; interface IChangeUserRequest { password: string; @@ -22,6 +23,8 @@ class UserController extends Controller { private sessionService: SessionService; + private userSplashService: UserSplashService; + constructor( config: IUnleashConfig, { @@ -29,12 +32,14 @@ class UserController extends Controller { userService, sessionService, userFeedbackService, + userSplashService, }: Pick< IUnleashServices, | 'accessService' | 'userService' | 'sessionService' | 'userFeedbackService' + | 'userSplashService' >, ) { super(config); @@ -57,6 +62,7 @@ class UserController extends Controller { const feedback = await this.userFeedbackService.getAllUserFeedback( user, ); + //const splash = await this.userSplashService.getAllUserSplash(user); // TODO: remove this line after we remove it from db. delete user.permissions; diff --git a/src/lib/services/index.ts b/src/lib/services/index.ts index 8e39e913cb..5d3ddc3e95 100644 --- a/src/lib/services/index.ts +++ b/src/lib/services/index.ts @@ -27,6 +27,7 @@ import FeatureToggleService from './feature-toggle-service'; import EnvironmentService from './environment-service'; import FeatureTagService from './feature-tag-service'; import ProjectHealthService from './project-health-service'; +import UserSplashService from './user-splash-service'; export const createServices = ( stores: IUnleashStores, @@ -72,6 +73,7 @@ export const createServices = ( accessService, featureToggleServiceV2, ); + const userSplashService = new UserSplashService(stores, config); return { accessService, @@ -100,6 +102,7 @@ export const createServices = ( userFeedbackService, featureTagService, projectHealthService, + userSplashService, }; }; diff --git a/src/lib/services/user-splash-service.ts b/src/lib/services/user-splash-service.ts index a86b44f009..9dfb163dd2 100644 --- a/src/lib/services/user-splash-service.ts +++ b/src/lib/services/user-splash-service.ts @@ -28,14 +28,12 @@ export default class UserSplashService { return await this.userSplashStore.getAllUserSplashs(user.id); } catch (err) { this.logger.error(err); + return []; } } - async getSplash( - user_id: number, - splash_id: string, - ): Promise { + async getSplash(user_id: number, splash_id: string): Promise { return this.userSplashStore.getSplash(user_id, splash_id); } diff --git a/src/lib/types/services.ts b/src/lib/types/services.ts index b2528df9f8..52dab846bb 100644 --- a/src/lib/types/services.ts +++ b/src/lib/types/services.ts @@ -23,6 +23,7 @@ import EnvironmentService from '../services/environment-service'; import FeatureTagService from '../services/feature-tag-service'; import ProjectHealthService from '../services/project-health-service'; import ClientMetricsServiceV2 from '../services/client-metrics/client-metrics-service-v2'; +import UserSplashService from '../services/user-splash-service'; export interface IUnleashServices { accessService: AccessService; @@ -51,4 +52,5 @@ export interface IUnleashServices { userFeedbackService: UserFeedbackService; userService: UserService; versionService: VersionService; + userSplashService: UserSplashService; } diff --git a/src/lib/types/stores/user-splash-store.ts b/src/lib/types/stores/user-splash-store.ts index ebe833e823..75938981ef 100644 --- a/src/lib/types/stores/user-splash-store.ts +++ b/src/lib/types/stores/user-splash-store.ts @@ -1,7 +1,7 @@ import { Store } from './store'; export interface IUserSplash { - seen?: boolean; + seen: boolean; splashId: string; userId: number; } @@ -11,8 +11,7 @@ export interface IUserSplashKey { splashId: string; } -export interface IUserSplashStore - extends Store { +export interface IUserSplashStore extends Store { getAllUserSplashs(userId: number): Promise; getSplash(userId: number, splashId: string): Promise; updateSplash(splash: IUserSplash): Promise; diff --git a/src/migrations/20211108130333-create-user-splash-table.js b/src/migrations/20211108130333-create-user-splash-table.js index 067ec76bd3..21953415b3 100644 --- a/src/migrations/20211108130333-create-user-splash-table.js +++ b/src/migrations/20211108130333-create-user-splash-table.js @@ -8,18 +8,17 @@ exports.up = function (db, cb) { splash_id TEXT, seen BOOLEAN NOT NULL DEFAULT false, PRIMARY KEY (user_id, splash_id)); - CREATE INDEX user_splash_user_id_idx ON user_splash (user_id); - );`, + CREATE INDEX user_splash_user_id_idx ON user_splash (user_id);`, cb, ); }; exports.down = function (db, cb) { - db.runSql( - ` + db.runSql( + ` DROP INDEX user_splash_user_id_idx; DROP TABLE user_splash; `, - cb, -); + cb, + ); }; diff --git a/src/migrations/20211109103930-add-splash-entry-for-users.js b/src/migrations/20211109103930-add-splash-entry-for-users.js new file mode 100644 index 0000000000..8a34421415 --- /dev/null +++ b/src/migrations/20211109103930-add-splash-entry-for-users.js @@ -0,0 +1,15 @@ +exports.up = function (db, cb) { + db.runSql(`SELECT * FROM users`, (err, results) => { + results.rows.forEach((user) => { + db.runSql( + `INSERT INTO user_splash(splash_id, user_id, seen) VALUES (?, ?, ?)`, + ['environments', user.id, false], + ); + }); + cb(); + }); +}; + +exports.down = function (db, cb) { + db.runSql('DELETE FROM user_splash', cb); +}; diff --git a/src/server-dev.ts b/src/server-dev.ts index 34d7b1aec2..bf1cea9c95 100644 --- a/src/server-dev.ts +++ b/src/server-dev.ts @@ -8,7 +8,7 @@ process.nextTick(async () => { createConfig({ db: { user: 'unleash_user', - password: 'some_password', + password: 'passord', host: 'localhost', port: 5432, database: 'unleash', diff --git a/src/test/fixtures/fake-user-splash-store.ts b/src/test/fixtures/fake-user-splash-store.ts new file mode 100644 index 0000000000..2fb6af87b8 --- /dev/null +++ b/src/test/fixtures/fake-user-splash-store.ts @@ -0,0 +1,65 @@ +import { + IUserSplashKey, + IUserSplash, + IUserSplashStore, +} from 'lib/types/stores/user-splash-store'; + +export default class FakeUserSplashStore implements IUserSplashStore { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + getAllUserSplashs(userId: number): Promise { + return Promise.resolve([]); + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + getSplash(userId: number, splashId: string): Promise { + return Promise.resolve({ seen: false, userId: 123, splashId: 'env' }); + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + updateSplash(splash: IUserSplash): Promise { + return Promise.resolve({ seen: false, userId: 123, splashId: 'env' }); + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + exists(key: IUserSplashKey): Promise { + return Promise.resolve(false); + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + get(key: IUserSplashKey): Promise { + return Promise.resolve(undefined); + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + getAll(): Promise { + return Promise.resolve([]); + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + getAllUserFeedback(userId: number): Promise { + return Promise.resolve([]); + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + getFeedback(userId: number, feedbackId: string): Promise { + return Promise.resolve(undefined); + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + updateFeedback(feedback: IUserSplash): Promise { + return Promise.resolve(undefined); + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + delete(key: IUserSplashKey): Promise { + return Promise.resolve(undefined); + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + deleteAll(): Promise { + return Promise.resolve(undefined); + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + destroy(): void {} +} diff --git a/src/test/fixtures/store.ts b/src/test/fixtures/store.ts index 5e36e35ff0..6b6bf25d04 100644 --- a/src/test/fixtures/store.ts +++ b/src/test/fixtures/store.ts @@ -24,6 +24,7 @@ import FakeFeatureTypeStore from './fake-feature-type-store'; import FakeResetTokenStore from './fake-reset-token-store'; import FakeFeatureToggleClientStore from './fake-feature-toggle-client-store'; import FakeClientMetricsStoreV2 from './fake-client-metrics-store-v2'; +import FakeUserSplashStore from './fake-user-splash-store'; const createStores: () => IUnleashStores = () => { const db = { @@ -59,6 +60,7 @@ const createStores: () => IUnleashStores = () => { featureTypeStore: new FakeFeatureTypeStore(), resetTokenStore: new FakeResetTokenStore(), sessionStore: new FakeSessionStore(), + userSplashStore: new FakeUserSplashStore(), }; }; From cc516618a1ff1021817033232307bf352e414341 Mon Sep 17 00:00:00 2001 From: Youssef Date: Tue, 9 Nov 2021 14:13:30 +0100 Subject: [PATCH 03/27] add splash-controller and cascade migration --- .../admin-api/user-splash-controller.ts | 76 +++++++++++++++++++ ...11109123505-add-cascade-for-user-splash.js | 16 ++++ 2 files changed, 92 insertions(+) create mode 100644 src/lib/routes/admin-api/user-splash-controller.ts create mode 100644 src/migrations/20211109123505-add-cascade-for-user-splash.js diff --git a/src/lib/routes/admin-api/user-splash-controller.ts b/src/lib/routes/admin-api/user-splash-controller.ts new file mode 100644 index 0000000000..c2e9ad7b14 --- /dev/null +++ b/src/lib/routes/admin-api/user-splash-controller.ts @@ -0,0 +1,76 @@ +import { Response } from 'express'; + +import Controller from '../controller'; +import { Logger } from '../../logger'; +import { IUnleashConfig } from '../../types/option'; +import { IUnleashServices } from '../../types/services'; +import UserSplashService from '../../services/user-splash-service'; +import { IAuthRequest } from '../unleash-types'; + +interface ISplashBody { + seen: boolean; + splashId: string; +} + +class UserSplashController extends Controller { + private logger: Logger; + private userSplashService: UserSplashService; + + constructor( + config: IUnleashConfig, + { userSplashService }: Pick, + ) { + super(config); + this.logger = config.getLogger('splash-controller.ts'); + this.userSplashService = userSplashService; + + this.post('/', this.recordSplash); + this.put('/:id', this.updateSplashSettings); + } + + private async recordSplash( + req: IAuthRequest, + res: Response, + ): Promise { + const BAD_REQUEST = 400; + const { user } = req; + + const { splashId } = req.body; + + if (!splashId) { + res.status(BAD_REQUEST).json({ + error: 'splashId must be present.', + }); + return; + } + + const splash = { + ...req.body, + userId: user.id, + seen: req.body.seen || false, + }; + + const updated = await this.userSplashService.updateSplash(splash); + res.json(updated); + } + + private async updateSplashSettings( + req: IAuthRequest, + res: Response, + ): Promise { + const { user } = req; + const { id } = req.params; + + const splash = { + ...req.body, + splashId: id, + userId: user.id, + seen: req.body.seen || false, + }; + + const updated = await this.userSplashService.updateSplash(splash); + res.json(updated); + } +} + +module.exports = UserSplashController; diff --git a/src/migrations/20211109123505-add-cascade-for-user-splash.js b/src/migrations/20211109123505-add-cascade-for-user-splash.js new file mode 100644 index 0000000000..9a62b4e4e8 --- /dev/null +++ b/src/migrations/20211109123505-add-cascade-for-user-splash.js @@ -0,0 +1,16 @@ +exports.up = function (db, cb) { + db.runSql( + ` + ALTER TABLE user_splash DROP CONSTRAINT user_splash_user_id_fkey; + ALTER TABLE user_splash + ADD CONSTRAINT user_splash_user_id_fkey + FOREIGN KEY (user_id) + REFERENCES users(id) ON DELETE CASCADE; +`, + cb, + ); +}; + +exports.down = function (db, cb) { + db.runSql('', cb); +}; From 96f2514fc5619d7d33105c1c3b44e72095e3cf96 Mon Sep 17 00:00:00 2001 From: Youssef Date: Tue, 9 Nov 2021 20:39:13 +0100 Subject: [PATCH 04/27] send splash data in the user object --- src/lib/routes/admin-api/index.ts | 5 ++++ .../admin-api/user-splash-controller.ts | 1 + src/lib/routes/admin-api/user.ts | 9 ++++--- src/lib/services/user-splash-service.ts | 13 ++++++++-- src/test/fixtures/fake-user-splash-store.ts | 25 ++++--------------- 5 files changed, 28 insertions(+), 25 deletions(-) diff --git a/src/lib/routes/admin-api/index.ts b/src/lib/routes/admin-api/index.ts index 3e0edf6114..f1aa75c7fa 100644 --- a/src/lib/routes/admin-api/index.ts +++ b/src/lib/routes/admin-api/index.ts @@ -21,6 +21,7 @@ import ApiTokenController from './api-token-controller'; import UserAdminController from './user-admin'; import EmailController from './email'; import UserFeedbackController from './user-feedback-controller'; +import UserSplashController from './user-splash-controller'; import ProjectApi from './project'; import { EnvironmentsController } from './environments-controller'; @@ -92,6 +93,10 @@ class AdminApi extends Controller { '/environments', new EnvironmentsController(config, services).router, ); + this.app.use( + '/splash', + new UserSplashController(config, services).router, + ); } index(req, res) { diff --git a/src/lib/routes/admin-api/user-splash-controller.ts b/src/lib/routes/admin-api/user-splash-controller.ts index c2e9ad7b14..87815ebd3a 100644 --- a/src/lib/routes/admin-api/user-splash-controller.ts +++ b/src/lib/routes/admin-api/user-splash-controller.ts @@ -74,3 +74,4 @@ class UserSplashController extends Controller { } module.exports = UserSplashController; +export default UserSplashController; \ No newline at end of file diff --git a/src/lib/routes/admin-api/user.ts b/src/lib/routes/admin-api/user.ts index 1d2815a9c6..3e13b4db19 100644 --- a/src/lib/routes/admin-api/user.ts +++ b/src/lib/routes/admin-api/user.ts @@ -7,7 +7,7 @@ import { IUnleashServices } from '../../types/services'; import UserService from '../../services/user-service'; import SessionService from '../../services/session-service'; import UserFeedbackService from '../../services/user-feedback-service'; -import UserSplashService from 'lib/services/user-splash-service'; +import UserSplashService from '../../services/user-splash-service'; interface IChangeUserRequest { password: string; @@ -47,6 +47,7 @@ class UserController extends Controller { this.userService = userService; this.sessionService = sessionService; this.userFeedbackService = userFeedbackService; + this.userSplashService = userSplashService; this.get('/', this.getUser); this.post('/change-password', this.updateUserPass); @@ -62,12 +63,14 @@ class UserController extends Controller { const feedback = await this.userFeedbackService.getAllUserFeedback( user, ); - //const splash = await this.userSplashService.getAllUserSplash(user); + const splash = await this.userSplashService.getAllUserSplashs( + user, + ); // TODO: remove this line after we remove it from db. delete user.permissions; - return res.status(200).json({ user, permissions, feedback }).end(); + return res.status(200).json({ user, permissions, feedback, splash }).end(); } async updateUserPass( diff --git a/src/lib/services/user-splash-service.ts b/src/lib/services/user-splash-service.ts index 9dfb163dd2..65d604ef85 100644 --- a/src/lib/services/user-splash-service.ts +++ b/src/lib/services/user-splash-service.ts @@ -20,12 +20,21 @@ export default class UserSplashService { this.logger = getLogger('services/user-splash-service.js'); } - async getAllUserSplash(user: User): Promise { + async getAllUserSplashs(user: User): Promise { if (user.isAPI) { return []; } try { - return await this.userSplashStore.getAllUserSplashs(user.id); + const splashs = await ( + await this.userSplashStore.getAllUserSplashs(user.id) + ).reduce( + (splashObject, splash) => ({ + ...splashObject, + [splash.splashId]: splash.seen, + }), + {}, + ); + return splashs; } catch (err) { this.logger.error(err); diff --git a/src/test/fixtures/fake-user-splash-store.ts b/src/test/fixtures/fake-user-splash-store.ts index 2fb6af87b8..adc0775c7b 100644 --- a/src/test/fixtures/fake-user-splash-store.ts +++ b/src/test/fixtures/fake-user-splash-store.ts @@ -2,7 +2,7 @@ import { IUserSplashKey, IUserSplash, IUserSplashStore, -} from 'lib/types/stores/user-splash-store'; +} from '../../lib/types/stores/user-splash-store' export default class FakeUserSplashStore implements IUserSplashStore { // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -11,13 +11,13 @@ export default class FakeUserSplashStore implements IUserSplashStore { } // eslint-disable-next-line @typescript-eslint/no-unused-vars - getSplash(userId: number, splashId: string): Promise { - return Promise.resolve({ seen: false, userId: 123, splashId: 'env' }); + getSplash(userId: number, splashId: string): Promise { + return Promise.resolve(undefined); } // eslint-disable-next-line @typescript-eslint/no-unused-vars - updateSplash(splash: IUserSplash): Promise { - return Promise.resolve({ seen: false, userId: 123, splashId: 'env' }); + updateSplash(splash: IUserSplash): Promise { + return Promise.resolve(undefined); } // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -35,21 +35,6 @@ export default class FakeUserSplashStore implements IUserSplashStore { return Promise.resolve([]); } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - getAllUserFeedback(userId: number): Promise { - return Promise.resolve([]); - } - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - getFeedback(userId: number, feedbackId: string): Promise { - return Promise.resolve(undefined); - } - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - updateFeedback(feedback: IUserSplash): Promise { - return Promise.resolve(undefined); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars delete(key: IUserSplashKey): Promise { return Promise.resolve(undefined); From c4da3e89c5a02364e77e66dbe635a501bdb25e9a Mon Sep 17 00:00:00 2001 From: Youssef Date: Tue, 9 Nov 2021 20:55:23 +0100 Subject: [PATCH 05/27] fix: styling --- src/lib/routes/admin-api/user-splash-controller.ts | 3 ++- src/lib/routes/admin-api/user.ts | 9 +++++---- src/lib/types/stores.ts | 1 - .../20211109123505-add-cascade-for-user-splash.js | 10 +++++----- src/test/fixtures/fake-user-splash-store.ts | 6 +++--- 5 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/lib/routes/admin-api/user-splash-controller.ts b/src/lib/routes/admin-api/user-splash-controller.ts index 87815ebd3a..68872fad54 100644 --- a/src/lib/routes/admin-api/user-splash-controller.ts +++ b/src/lib/routes/admin-api/user-splash-controller.ts @@ -14,6 +14,7 @@ interface ISplashBody { class UserSplashController extends Controller { private logger: Logger; + private userSplashService: UserSplashService; constructor( @@ -74,4 +75,4 @@ class UserSplashController extends Controller { } module.exports = UserSplashController; -export default UserSplashController; \ No newline at end of file +export default UserSplashController; diff --git a/src/lib/routes/admin-api/user.ts b/src/lib/routes/admin-api/user.ts index 3e13b4db19..a0449d1b8d 100644 --- a/src/lib/routes/admin-api/user.ts +++ b/src/lib/routes/admin-api/user.ts @@ -63,14 +63,15 @@ class UserController extends Controller { const feedback = await this.userFeedbackService.getAllUserFeedback( user, ); - const splash = await this.userSplashService.getAllUserSplashs( - user, - ); + const splash = await this.userSplashService.getAllUserSplashs(user); // TODO: remove this line after we remove it from db. delete user.permissions; - return res.status(200).json({ user, permissions, feedback, splash }).end(); + return res + .status(200) + .json({ user, permissions, feedback, splash }) + .end(); } async updateUserPass( diff --git a/src/lib/types/stores.ts b/src/lib/types/stores.ts index ff09b606a5..cb92c0c44a 100644 --- a/src/lib/types/stores.ts +++ b/src/lib/types/stores.ts @@ -25,7 +25,6 @@ import { IFeatureToggleClientStore } from './stores/feature-toggle-client-store' import { IClientMetricsStoreV2 } from './stores/client-metrics-store-v2'; import { IUserSplashStore } from './stores/user-splash-store'; - export interface IUnleashStores { accessStore: IAccessStore; addonStore: IAddonStore; diff --git a/src/migrations/20211109123505-add-cascade-for-user-splash.js b/src/migrations/20211109123505-add-cascade-for-user-splash.js index 9a62b4e4e8..5f9754c440 100644 --- a/src/migrations/20211109123505-add-cascade-for-user-splash.js +++ b/src/migrations/20211109123505-add-cascade-for-user-splash.js @@ -1,16 +1,16 @@ exports.up = function (db, cb) { - db.runSql( - ` + db.runSql( + ` ALTER TABLE user_splash DROP CONSTRAINT user_splash_user_id_fkey; ALTER TABLE user_splash ADD CONSTRAINT user_splash_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE; `, - cb, - ); + cb, + ); }; exports.down = function (db, cb) { - db.runSql('', cb); + db.runSql('', cb); }; diff --git a/src/test/fixtures/fake-user-splash-store.ts b/src/test/fixtures/fake-user-splash-store.ts index adc0775c7b..5b3c6e8331 100644 --- a/src/test/fixtures/fake-user-splash-store.ts +++ b/src/test/fixtures/fake-user-splash-store.ts @@ -2,7 +2,7 @@ import { IUserSplashKey, IUserSplash, IUserSplashStore, -} from '../../lib/types/stores/user-splash-store' +} from '../../lib/types/stores/user-splash-store'; export default class FakeUserSplashStore implements IUserSplashStore { // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -11,12 +11,12 @@ export default class FakeUserSplashStore implements IUserSplashStore { } // eslint-disable-next-line @typescript-eslint/no-unused-vars - getSplash(userId: number, splashId: string): Promise { + getSplash(userId: number, splashId: string): Promise { return Promise.resolve(undefined); } // eslint-disable-next-line @typescript-eslint/no-unused-vars - updateSplash(splash: IUserSplash): Promise { + updateSplash(splash: IUserSplash): Promise { return Promise.resolve(undefined); } From db9722dccc22262da692be7e164d8401c11bd821 Mon Sep 17 00:00:00 2001 From: Youssef Date: Wed, 10 Nov 2021 11:24:01 +0100 Subject: [PATCH 06/27] add splash e2e + api tests --- src/test/e2e/api/admin/splash.e2e.test.ts | 97 +++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 src/test/e2e/api/admin/splash.e2e.test.ts diff --git a/src/test/e2e/api/admin/splash.e2e.test.ts b/src/test/e2e/api/admin/splash.e2e.test.ts new file mode 100644 index 0000000000..263d7319dd --- /dev/null +++ b/src/test/e2e/api/admin/splash.e2e.test.ts @@ -0,0 +1,97 @@ +import { Application, NextFunction, Request, Response } from 'express'; +import { setupAppWithCustomAuth } from '../../helpers/test-helper'; +import dbInit from '../../helpers/database-init'; +import getLogger from '../../../fixtures/no-logger'; +import { IUnleashConfig } from '../../../../lib/types/option'; +import { IUnleashServices } from '../../../../lib/types/services'; + +let stores; +let db; +let app; + +beforeAll(async () => { + db = await dbInit('splash_api_serial', getLogger); + stores = db.stores; + + const email = 'custom-user@mail.com'; + + const preHook = ( + application: Application, + config: IUnleashConfig, + { userService }: IUnleashServices, + ) => { + application.use( + '/api/admin/', + async (req: Request, res: Response, next: NextFunction) => { + // @ts-ignore + req.user = await userService.loginUserWithoutPassword( + email, + true, + ); + next(); + }, + ); + }; + + app = await setupAppWithCustomAuth(stores, preHook); +}); + +afterAll(async () => { + await app.destroy(); + await db.destroy(); +}); + +test('it creates splash for user', async () => { + expect.assertions(1); + + return app.request + .post('/api/admin/splash') + .send({ splashId: 'environment' }) + .set('Content-Type', 'application/json') + .expect('Content-Type', /json/) + .expect(200) + .expect((res) => { + expect(res.body.splashId).toBe('environment'); + }); +}); + +test('it gives 400 when splash is not present', async () => { + expect.assertions(1); + + return app.request + .post('/api/admin/splash') + .send({}) + .set('Content-Type', 'application/json') + .expect('Content-Type', /json/) + .expect(400) + .expect((res) => { + expect(res.body.error).toBeTruthy(); + }); +}); + +test('it updates splash for user', async () => { + expect.assertions(1); + + return app.request + .put('/api/admin/splash/environment') + .send({ seen: true }) + .set('Content-Type', 'application/json') + .expect('Content-Type', /json/) + .expect(200) + .expect((res) => { + expect(res.body.seen).toBe(true); + }); +}); + +test('it retrieves splash for user', async () => { + expect.assertions(1); + + return app.request + .get('/api/admin/user') + .set('Content-Type', 'application/json') + .expect('Content-Type', /json/) + .expect(200) + .expect((res) => { + expect(res.body.splash).toStrictEqual({ environment: true }); + }); +}); From cd38c5a01dca6a5813332149037fa05add0bd642 Mon Sep 17 00:00:00 2001 From: Youssef Date: Wed, 10 Nov 2021 11:24:44 +0100 Subject: [PATCH 07/27] add e2e splash test --- .../e2e/stores/user-splash-store.e2e.test.ts | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 src/test/e2e/stores/user-splash-store.e2e.test.ts diff --git a/src/test/e2e/stores/user-splash-store.e2e.test.ts b/src/test/e2e/stores/user-splash-store.e2e.test.ts new file mode 100644 index 0000000000..73050f2c0b --- /dev/null +++ b/src/test/e2e/stores/user-splash-store.e2e.test.ts @@ -0,0 +1,82 @@ +import { IUserSplashStore } from 'lib/types/stores/user-splash-store'; +import { IUserStore } from 'lib/types/stores/user-store'; +import dbInit from '../helpers/database-init'; +import getLogger from '../../fixtures/no-logger'; + +let stores; +let db; +let userSplashStore: IUserSplashStore; +let userStore: IUserStore; +let currentUser; + +beforeAll(async () => { + db = await dbInit('user_splash_store', getLogger); + stores = db.stores; + userSplashStore = stores.userSplashStore; + userStore = stores.userStore; + currentUser = await userStore.upsert({ email: 'me.feedback@mail.com' }); +}); + +afterAll(async () => { + await db.destroy(); +}); + +afterEach(async () => { + await userSplashStore.deleteAll(); +}); + +test('should create userSplash', async () => { + await userSplashStore.updateSplash({ + splashId: 'some-id', + userId: currentUser.id, + seen: false, + }); + const userSplashs = await userSplashStore.getAllUserSplashs(currentUser.id); + expect(userSplashs).toHaveLength(1); + expect(userSplashs[0].splashId).toBe('some-id'); +}); + +test('should get userSplash', async () => { + await userSplashStore.updateSplash({ + splashId: 'some-id', + userId: currentUser.id, + seen: false, + }); + const userSplash = await userSplashStore.getSplash( + currentUser.id, + 'some-id', + ); + expect(userSplash.splashId).toBe('some-id'); +}); + +test('should exists', async () => { + await userSplashStore.updateSplash({ + splashId: 'some-id-3', + userId: currentUser.id, + seen: false, + }); + const exists = await userSplashStore.exists({ + userId: currentUser.id, + splashId: 'some-id-3', + }); + expect(exists).toBe(true); +}); + +test('should not exists', async () => { + const exists = await userSplashStore.exists({ + userId: currentUser.id, + splashId: 'some-id-not-here', + }); + expect(exists).toBe(false); +}); + +test('should get all userSplashs', async () => { + await userSplashStore.updateSplash({ + splashId: 'some-id-2', + userId: currentUser.id, + seen: false, + }); + const userSplashs = await userSplashStore.getAll(); + expect(userSplashs).toHaveLength(1); + expect(userSplashs[0].splashId).toBe('some-id-2'); +}); From c4e56aae09da6689cd92744260f1d58d6eddfbfa Mon Sep 17 00:00:00 2001 From: Youssef Date: Fri, 12 Nov 2021 10:49:09 +0100 Subject: [PATCH 08/27] fix: remove record splash and update sql query in add-splash-entry --- .../admin-api/user-splash-controller.ts | 32 ++----------------- src/lib/services/user-splash-service.ts | 2 +- ...211109103930-add-splash-entry-for-users.js | 3 +- 3 files changed, 4 insertions(+), 33 deletions(-) diff --git a/src/lib/routes/admin-api/user-splash-controller.ts b/src/lib/routes/admin-api/user-splash-controller.ts index 68872fad54..8f01b2172e 100644 --- a/src/lib/routes/admin-api/user-splash-controller.ts +++ b/src/lib/routes/admin-api/user-splash-controller.ts @@ -25,34 +25,7 @@ class UserSplashController extends Controller { this.logger = config.getLogger('splash-controller.ts'); this.userSplashService = userSplashService; - this.post('/', this.recordSplash); - this.put('/:id', this.updateSplashSettings); - } - - private async recordSplash( - req: IAuthRequest, - res: Response, - ): Promise { - const BAD_REQUEST = 400; - const { user } = req; - - const { splashId } = req.body; - - if (!splashId) { - res.status(BAD_REQUEST).json({ - error: 'splashId must be present.', - }); - return; - } - - const splash = { - ...req.body, - userId: user.id, - seen: req.body.seen || false, - }; - - const updated = await this.userSplashService.updateSplash(splash); - res.json(updated); + this.post('/:id', this.updateSplashSettings); } private async updateSplashSettings( @@ -66,9 +39,8 @@ class UserSplashController extends Controller { ...req.body, splashId: id, userId: user.id, - seen: req.body.seen || false, + seen: true, }; - const updated = await this.userSplashService.updateSplash(splash); res.json(updated); } diff --git a/src/lib/services/user-splash-service.ts b/src/lib/services/user-splash-service.ts index 65d604ef85..0f609499d5 100644 --- a/src/lib/services/user-splash-service.ts +++ b/src/lib/services/user-splash-service.ts @@ -25,7 +25,7 @@ export default class UserSplashService { return []; } try { - const splashs = await ( + const splashs = ( await this.userSplashStore.getAllUserSplashs(user.id) ).reduce( (splashObject, splash) => ({ diff --git a/src/migrations/20211109103930-add-splash-entry-for-users.js b/src/migrations/20211109103930-add-splash-entry-for-users.js index 8a34421415..455f743e0a 100644 --- a/src/migrations/20211109103930-add-splash-entry-for-users.js +++ b/src/migrations/20211109103930-add-splash-entry-for-users.js @@ -2,8 +2,7 @@ exports.up = function (db, cb) { db.runSql(`SELECT * FROM users`, (err, results) => { results.rows.forEach((user) => { db.runSql( - `INSERT INTO user_splash(splash_id, user_id, seen) VALUES (?, ?, ?)`, - ['environments', user.id, false], + `INSERT INTO user_splash(splash_id, user_id, seen) SELECT 'environment', u.id, false FROM users u`, ); }); cb(); From fc275a6183f6fa88da1b73f0d0c8eea29c69138b Mon Sep 17 00:00:00 2001 From: Youssef Date: Fri, 12 Nov 2021 11:02:12 +0100 Subject: [PATCH 09/27] fix: update sql query in add-splash-entry --- .../20211109103930-add-splash-entry-for-users.js | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/migrations/20211109103930-add-splash-entry-for-users.js b/src/migrations/20211109103930-add-splash-entry-for-users.js index 455f743e0a..65d70586ea 100644 --- a/src/migrations/20211109103930-add-splash-entry-for-users.js +++ b/src/migrations/20211109103930-add-splash-entry-for-users.js @@ -1,12 +1,8 @@ exports.up = function (db, cb) { - db.runSql(`SELECT * FROM users`, (err, results) => { - results.rows.forEach((user) => { - db.runSql( - `INSERT INTO user_splash(splash_id, user_id, seen) SELECT 'environment', u.id, false FROM users u`, - ); - }); - cb(); - }); + db.runSql( + `INSERT INTO user_splash(splash_id, user_id, seen) SELECT 'environment', u.id, false FROM users u`, + cb, + ); }; exports.down = function (db, cb) { From e0356eff6dde9839060eb276550dd106118f0c9b Mon Sep 17 00:00:00 2001 From: Youssef Date: Fri, 12 Nov 2021 11:18:09 +0100 Subject: [PATCH 10/27] fix: update e2e test for splash --- src/test/e2e/api/admin/splash.e2e.test.ts | 31 +---------------------- 1 file changed, 1 insertion(+), 30 deletions(-) diff --git a/src/test/e2e/api/admin/splash.e2e.test.ts b/src/test/e2e/api/admin/splash.e2e.test.ts index 263d7319dd..61d0c6db26 100644 --- a/src/test/e2e/api/admin/splash.e2e.test.ts +++ b/src/test/e2e/api/admin/splash.e2e.test.ts @@ -41,40 +41,11 @@ afterAll(async () => { await db.destroy(); }); -test('it creates splash for user', async () => { - expect.assertions(1); - - return app.request - .post('/api/admin/splash') - .send({ splashId: 'environment' }) - .set('Content-Type', 'application/json') - .expect('Content-Type', /json/) - .expect(200) - .expect((res) => { - expect(res.body.splashId).toBe('environment'); - }); -}); - -test('it gives 400 when splash is not present', async () => { - expect.assertions(1); - - return app.request - .post('/api/admin/splash') - .send({}) - .set('Content-Type', 'application/json') - .expect('Content-Type', /json/) - .expect(400) - .expect((res) => { - expect(res.body.error).toBeTruthy(); - }); -}); - test('it updates splash for user', async () => { expect.assertions(1); return app.request - .put('/api/admin/splash/environment') - .send({ seen: true }) + .post('/api/admin/splash/environment') .set('Content-Type', 'application/json') .expect('Content-Type', /json/) .expect(200) From 0199d1f21154db4b58e1c14105b3605c2a06e76b Mon Sep 17 00:00:00 2001 From: Youssef Date: Fri, 12 Nov 2021 12:44:17 +0100 Subject: [PATCH 11/27] fix: remove req.body from the splash object when update --- src/lib/routes/admin-api/user-splash-controller.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/lib/routes/admin-api/user-splash-controller.ts b/src/lib/routes/admin-api/user-splash-controller.ts index 8f01b2172e..07f3b7a049 100644 --- a/src/lib/routes/admin-api/user-splash-controller.ts +++ b/src/lib/routes/admin-api/user-splash-controller.ts @@ -36,7 +36,6 @@ class UserSplashController extends Controller { const { id } = req.params; const splash = { - ...req.body, splashId: id, userId: user.id, seen: true, From 16429fcf9a91f18291b3839fb838faf91856fb50 Mon Sep 17 00:00:00 2001 From: Youssef Date: Fri, 12 Nov 2021 13:01:56 +0100 Subject: [PATCH 12/27] fix: add cascade query inside create table for splash --- .../20211108130333-create-user-splash-table.js | 5 +++-- ...20211109123505-add-cascade-for-user-splash.js | 16 ---------------- 2 files changed, 3 insertions(+), 18 deletions(-) delete mode 100644 src/migrations/20211109123505-add-cascade-for-user-splash.js diff --git a/src/migrations/20211108130333-create-user-splash-table.js b/src/migrations/20211108130333-create-user-splash-table.js index 21953415b3..38ea54e3d9 100644 --- a/src/migrations/20211108130333-create-user-splash-table.js +++ b/src/migrations/20211108130333-create-user-splash-table.js @@ -4,11 +4,12 @@ exports.up = function (db, cb) { db.runSql( ` CREATE TABLE IF NOT EXISTS user_splash - (user_id INTEGER NOT NULL references users (id), + (user_id INTEGER NOT NULL references users (id) ON DELETE CASCADE, splash_id TEXT, seen BOOLEAN NOT NULL DEFAULT false, PRIMARY KEY (user_id, splash_id)); - CREATE INDEX user_splash_user_id_idx ON user_splash (user_id);`, + CREATE INDEX user_splash_user_id_idx ON user_splash (user_id); + `, cb, ); }; diff --git a/src/migrations/20211109123505-add-cascade-for-user-splash.js b/src/migrations/20211109123505-add-cascade-for-user-splash.js deleted file mode 100644 index 5f9754c440..0000000000 --- a/src/migrations/20211109123505-add-cascade-for-user-splash.js +++ /dev/null @@ -1,16 +0,0 @@ -exports.up = function (db, cb) { - db.runSql( - ` - ALTER TABLE user_splash DROP CONSTRAINT user_splash_user_id_fkey; - ALTER TABLE user_splash - ADD CONSTRAINT user_splash_user_id_fkey - FOREIGN KEY (user_id) - REFERENCES users(id) ON DELETE CASCADE; -`, - cb, - ); -}; - -exports.down = function (db, cb) { - db.runSql('', cb); -}; From 2d03b8c61e94cad41ac5ff6aa14e735c7d14fe56 Mon Sep 17 00:00:00 2001 From: Youssef Date: Fri, 12 Nov 2021 13:19:06 +0100 Subject: [PATCH 13/27] fix: return be object instead of array --- src/lib/services/user-splash-service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/services/user-splash-service.ts b/src/lib/services/user-splash-service.ts index 0f609499d5..7d919c7dce 100644 --- a/src/lib/services/user-splash-service.ts +++ b/src/lib/services/user-splash-service.ts @@ -38,7 +38,7 @@ export default class UserSplashService { } catch (err) { this.logger.error(err); - return []; + return {}; } } From 98cdc1674f160a577b2bea5201c6d7c2a8b45e81 Mon Sep 17 00:00:00 2001 From: Thomas Heartman Date: Mon, 22 Nov 2021 16:16:38 +0100 Subject: [PATCH 14/27] docs: add initial (untested) steps on how to run the proxy locally. I haven't yet tested connecting to the `unleash:4242` address. --- website/docs/user_guide/quickstart.md | 77 ++++++++++++++++++- website/static/img/api_access_navigation.png | Bin 0 -> 83828 bytes 2 files changed, 74 insertions(+), 3 deletions(-) create mode 100644 website/static/img/api_access_navigation.png diff --git a/website/docs/user_guide/quickstart.md b/website/docs/user_guide/quickstart.md index 9fdab31479..9c1d809709 100644 --- a/website/docs/user_guide/quickstart.md +++ b/website/docs/user_guide/quickstart.md @@ -198,7 +198,7 @@ unleash.on('synchronized', () => { ## I want to run Unleash locally -### Run Unleash with Docker +### Run Unleash with Docker {#run-unleash-with-docker} The easiest way to run unleash locally is using [docker](https://www.docker.com/). @@ -214,11 +214,13 @@ docker run -e POSTGRES_PASSWORD=some_password \ 3. Start Unleash via docker: ```sh -docker run -p 4242:4242 \ +docker run --name unleash \ + -p 4242:4242 \ -e DATABASE_HOST=postgres -e DATABASE_NAME=unleash \ -e DATABASE_USERNAME=unleash_user -e DATABASE_PASSWORD=some_password \ -e DATABASE_SSL=false \ - --network unleash unleashorg/unleash-server + --network unleash unleashorg/unleash-server \ + ``` [Click here to see all options to get started locally.](deploy/getting-started.md) @@ -232,6 +234,75 @@ username: admin password: unleash4all ``` +### Run Unleash and the Unleash proxy with Docker + +Follow steps outlined in the [Run Unleash with +Docker](#run-unleash-with-docker) section to get the Unleash instance +up and running. Once you have done that you need to first get an API +key from your Unleash instance and then use that API key when starting +the Unleash proxy. + +1. Get an API key. + + To get an API key, access your Unleash instance in a web browser. + First, navigate to the API access screen. + + ![The Unleash UI showing a dropdown menu under the "Configure" menu + entry. The dropdown menu's "API Access" option is highlighted and + you're told to navigate there.](/img/api_access_navigation.png + "Navigate to the API access page.") + + Next, create an API key with these details + + - **name:** proxy-key (this can be whatever you want) + - **token type:** client + - **project:** all + - **environment:** select your preferred environment (this option is + only available in Unleash 4.3 and later) + + Copy the API key to your clipboard. You'll need it in the next step. + + :::note + + Depending on whether you have the environments feature + enabled or not, the API key will look a little different. If you + don't have environments enabled, it'll just be a 64 character long + hexadecimal string (for instance + `943ca9171e2c884c545c5d82417a655fb77cec970cc3b78a8ff87f4406b495d0`). + If you do have environments enabled, the key will be prefixed with + the project and the environment that the key is valid for. It'll use the + format `:.`, e.g. + `demo-app:production.614a75cf68bef8703aa1bd8304938a81ec871f86ea40c975468eabd6`. + + Regardless of which format your string uses, do not modify it. + + ::: + + +2. Start the Unleash proxy + + Start a container with the Unleash proxy by running the following + command. Replace `${API_KEY}` with the key you created in the + following step. + + ```sh + docker run --name unleash-proxy \ + -e UNLEASH_PROXY_SECRETS=some-secret \ + -e UNLEASH_URL='http://unleash:4242/api/' \ + -e UNLEASH_API_TOKEN='${API_KEY}' \ + -p 3000:3000 \ + unleashorg/unleash-proxy + ``` + +3. Test the proxy + + To make sure the proxy is running successfully, you can test it by + running the following command: + + ```curl + curl http://localhost:3000/proxy -H "Authorization: some-secret" + ``` + ### Create your first toggle In order to create a toggle through the UI, [you can follow this guide](create-feature-toggle.md). Once you have created your feature toggle, you are ready to connect your application using an SDK. diff --git a/website/static/img/api_access_navigation.png b/website/static/img/api_access_navigation.png new file mode 100644 index 0000000000000000000000000000000000000000..9f83317ebb1e76318db1cb0d36a4093ec7045d6c GIT binary patch literal 83828 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 P6X!X7%$Ynrhr9m+7ex&Q literal 0 HcmV?d00001 From c1e225ea9bc86b6fa4c7ac995a3ea3600cc8a4b7 Mon Sep 17 00:00:00 2001 From: Thomas Heartman Date: Tue, 23 Nov 2021 08:08:23 +0100 Subject: [PATCH 15/27] docs: fix up docker commands to have consistent formatting. Moved each option onto its own line, the last two options are always `--network` and then `--name`. --- website/docs/user_guide/quickstart.md | 41 ++++++++++++++++----------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/website/docs/user_guide/quickstart.md b/website/docs/user_guide/quickstart.md index 9c1d809709..29afb2de98 100644 --- a/website/docs/user_guide/quickstart.md +++ b/website/docs/user_guide/quickstart.md @@ -206,21 +206,28 @@ The easiest way to run unleash locally is using [docker](https://www.docker.com/ 2. Start a postgres database: ```sh -docker run -e POSTGRES_PASSWORD=some_password \ - -e POSTGRES_USER=unleash_user -e POSTGRES_DB=unleash \ - --network unleash --name postgres postgres +docker run \ + -e POSTGRES_USER=unleash_user \ + -e POSTGRES_PASSWORD=some_password \ + -e POSTGRES_DB=unleash \ + --network unleash \ + --name postgres \ + postgres ``` 3. Start Unleash via docker: ```sh -docker run --name unleash \ +docker run \ -p 4242:4242 \ - -e DATABASE_HOST=postgres -e DATABASE_NAME=unleash \ - -e DATABASE_USERNAME=unleash_user -e DATABASE_PASSWORD=some_password \ + -e DATABASE_HOST=postgres \ + -e DATABASE_NAME=unleash \ + -e DATABASE_USERNAME=unleash_user \ + -e DATABASE_PASSWORD=some_password \ -e DATABASE_SSL=false \ - --network unleash unleashorg/unleash-server \ - + --network unleash \ + --name unleash \ + unleashorg/unleash-server ``` [Click here to see all options to get started locally.](deploy/getting-started.md) @@ -268,11 +275,11 @@ the Unleash proxy. enabled or not, the API key will look a little different. If you don't have environments enabled, it'll just be a 64 character long hexadecimal string (for instance - `943ca9171e2c884c545c5d82417a655fb77cec970cc3b78a8ff87f4406b495d0`). + `be44368985f7fb3237c584ef86f3d6bdada42ddbd63a019d26955178`). If you do have environments enabled, the key will be prefixed with the project and the environment that the key is valid for. It'll use the format `:.`, e.g. - `demo-app:production.614a75cf68bef8703aa1bd8304938a81ec871f86ea40c975468eabd6`. + `demo-app:production.be44368985f7fb3237c584ef86f3d6bdada42ddbd63a019d26955178`. Regardless of which format your string uses, do not modify it. @@ -286,12 +293,14 @@ the Unleash proxy. following step. ```sh - docker run --name unleash-proxy \ - -e UNLEASH_PROXY_SECRETS=some-secret \ - -e UNLEASH_URL='http://unleash:4242/api/' \ - -e UNLEASH_API_TOKEN='${API_KEY}' \ - -p 3000:3000 \ - unleashorg/unleash-proxy + docker run \ + -e UNLEASH_PROXY_SECRETS=some-secret \ + -e UNLEASH_URL='http://unleash:4242/api/' \ + -e UNLEASH_API_TOKEN='${API_KEY}' \ + -p 3000:3000 \ + --network unleash \ + --name unleash-proxy \ + unleashorg/unleash-proxy ``` 3. Test the proxy From 7fdb53f6647f8c6b0f7b3e83db6b643b2371c10c Mon Sep 17 00:00:00 2001 From: Thomas Heartman Date: Tue, 23 Nov 2021 09:07:00 +0100 Subject: [PATCH 16/27] Docs: add a tip about docker names having to be unique. --- website/docs/user_guide/quickstart.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/website/docs/user_guide/quickstart.md b/website/docs/user_guide/quickstart.md index 29afb2de98..1d8e08de8a 100644 --- a/website/docs/user_guide/quickstart.md +++ b/website/docs/user_guide/quickstart.md @@ -202,6 +202,15 @@ unleash.on('synchronized', () => { The easiest way to run unleash locally is using [docker](https://www.docker.com/). +:::tip + +Each container that runs in your local Docker instance must have a +unique name. If you've run these commands before, you can either start +the containers again (`docker start ${CONTAINER_NAME}`) or remove them +(`docker rm ${CONTAINER_NAME}`) and run the commands again. + +::: + 1. Create a network by running `docker network create unleash` 2. Start a postgres database: From 6f062e4d66add01f3239184b0db6d807a2ef5ae6 Mon Sep 17 00:00:00 2001 From: Fredrik Oseberg Date: Tue, 23 Nov 2021 09:40:05 +0100 Subject: [PATCH 17/27] docs: add always pull to docker commands --- website/docs/user_guide/quickstart.md | 80 ++++++++++----------------- 1 file changed, 29 insertions(+), 51 deletions(-) diff --git a/website/docs/user_guide/quickstart.md b/website/docs/user_guide/quickstart.md index 1d8e08de8a..7c7e8c432d 100644 --- a/website/docs/user_guide/quickstart.md +++ b/website/docs/user_guide/quickstart.md @@ -204,10 +204,7 @@ The easiest way to run unleash locally is using [docker](https://www.docker.com/ :::tip -Each container that runs in your local Docker instance must have a -unique name. If you've run these commands before, you can either start -the containers again (`docker start ${CONTAINER_NAME}`) or remove them -(`docker rm ${CONTAINER_NAME}`) and run the commands again. +Each container that runs in your local Docker instance must have a unique name. If you've run these commands before, you can either start the containers again (`docker start ${CONTAINER_NAME}`) or remove them (`docker rm ${CONTAINER_NAME}`) and run the commands again. ::: @@ -236,7 +233,7 @@ docker run \ -e DATABASE_SSL=false \ --network unleash \ --name unleash \ - unleashorg/unleash-server + --pull=always unleashorg/unleash-server ``` [Click here to see all options to get started locally.](deploy/getting-started.md) @@ -252,74 +249,55 @@ password: unleash4all ### Run Unleash and the Unleash proxy with Docker -Follow steps outlined in the [Run Unleash with -Docker](#run-unleash-with-docker) section to get the Unleash instance -up and running. Once you have done that you need to first get an API -key from your Unleash instance and then use that API key when starting -the Unleash proxy. +Follow steps outlined in the [Run Unleash with Docker](#run-unleash-with-docker) section to get the Unleash instance up and running. Once you have done that you need to first get an API key from your Unleash instance and then use that API key when starting the Unleash proxy. 1. Get an API key. - To get an API key, access your Unleash instance in a web browser. - First, navigate to the API access screen. + To get an API key, access your Unleash instance in a web browser. First, navigate to the API access screen. ![The Unleash UI showing a dropdown menu under the "Configure" menu - entry. The dropdown menu's "API Access" option is highlighted and - you're told to navigate there.](/img/api_access_navigation.png - "Navigate to the API access page.") +entry. The dropdown menu's "API Access" option is highlighted and +you're told to navigate there.](/img/api_access_navigation.png 'Navigate to the API access page.') Next, create an API key with these details - - **name:** proxy-key (this can be whatever you want) - - **token type:** client - - **project:** all - - **environment:** select your preferred environment (this option is - only available in Unleash 4.3 and later) + - **name:** proxy-key (this can be whatever you want) + - **token type:** client + - **project:** all + - **environment:** select your preferred environment (this option is only available in Unleash 4.3 and later) - Copy the API key to your clipboard. You'll need it in the next step. + Copy the API key to your clipboard. You'll need it in the next step. :::note - Depending on whether you have the environments feature - enabled or not, the API key will look a little different. If you - don't have environments enabled, it'll just be a 64 character long - hexadecimal string (for instance - `be44368985f7fb3237c584ef86f3d6bdada42ddbd63a019d26955178`). - If you do have environments enabled, the key will be prefixed with - the project and the environment that the key is valid for. It'll use the - format `:.`, e.g. - `demo-app:production.be44368985f7fb3237c584ef86f3d6bdada42ddbd63a019d26955178`. + Depending on whether you have the environments feature enabled or not, the API key will look a little different. If you don't have environments enabled, it'll just be a 64 character long hexadecimal string (for instance `be44368985f7fb3237c584ef86f3d6bdada42ddbd63a019d26955178`). If you do have environments enabled, the key will be prefixed with the project and the environment that the key is valid for. It'll use the format `:.`, e.g. `demo-app:production.be44368985f7fb3237c584ef86f3d6bdada42ddbd63a019d26955178`. - Regardless of which format your string uses, do not modify it. - - ::: + Regardless of which format your string uses, do not modify it. + ::: 2. Start the Unleash proxy - Start a container with the Unleash proxy by running the following - command. Replace `${API_KEY}` with the key you created in the - following step. + Start a container with the Unleash proxy by running the following command. Replace `${API_KEY}` with the key you created in the following step. - ```sh - docker run \ - -e UNLEASH_PROXY_SECRETS=some-secret \ - -e UNLEASH_URL='http://unleash:4242/api/' \ - -e UNLEASH_API_TOKEN='${API_KEY}' \ - -p 3000:3000 \ - --network unleash \ - --name unleash-proxy \ - unleashorg/unleash-proxy - ``` + ```sh + docker run \ + -e UNLEASH_PROXY_SECRETS=some-secret \ + -e UNLEASH_URL='http://unleash:4242/api/' \ + -e UNLEASH_API_TOKEN='${API_KEY}' \ + -p 3000:3000 \ + --network unleash \ + --name unleash-proxy \ + --pull=always unleashorg/unleash-proxy + ``` 3. Test the proxy - To make sure the proxy is running successfully, you can test it by - running the following command: + To make sure the proxy is running successfully, you can test it by running the following command: - ```curl - curl http://localhost:3000/proxy -H "Authorization: some-secret" - ``` + ```curl + curl http://localhost:3000/proxy -H "Authorization: some-secret" + ``` ### Create your first toggle From a12250aa0a9035aa09fb0f5c21d4800649639fde Mon Sep 17 00:00:00 2001 From: Fredrik Oseberg Date: Tue, 23 Nov 2021 09:43:35 +0100 Subject: [PATCH 18/27] docs: add always pull to getting started --- website/docs/deploy/getting-started.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/website/docs/deploy/getting-started.md b/website/docs/deploy/getting-started.md index f369b547b8..6a13a1e2ee 100644 --- a/website/docs/deploy/getting-started.md +++ b/website/docs/deploy/getting-started.md @@ -57,11 +57,13 @@ docker run -p 4242:4242 \ -e DATABASE_HOST=postgres -e DATABASE_NAME=unleash \ -e DATABASE_USERNAME=unleash_user -e DATABASE_PASSWORD=some_password \ -e DATABASE_SSL=false \ - --network unleash unleashorg/unleash-server + --network unleash --pull=always unleashorg/unleash-server ``` ### Option 2 - use Docker-compose {#option-two---use-docker-compose} + **Steps:** + 1. Clone the [unleash-docker](https://github.com/Unleash/unleash-docker) repository. 2. Run `docker-compose build` in repository root folder. 3. Run `docker-compose up` in repository root folder. @@ -95,7 +97,7 @@ docker run -p 4242:4242 \ port: 4242, }, }) - .then(unleash => { + .then((unleash) => { console.log( `Unleash started on http://localhost:${unleash.app.get('port')}`, ); From aef10d1d838b9c9194e4174be4ba4dc46e0bd75b Mon Sep 17 00:00:00 2001 From: Thomas Heartman Date: Tue, 23 Nov 2021 11:15:20 +0100 Subject: [PATCH 19/27] docs: first pass at updating the feature toggle types entry. --- website/docs/advanced/feature-toggle-types.md | 34 ++++++++++++------ website/static/img/toggle_type_icons.png | Bin 0 -> 214008 bytes 2 files changed, 23 insertions(+), 11 deletions(-) create mode 100644 website/static/img/toggle_type_icons.png diff --git a/website/docs/advanced/feature-toggle-types.md b/website/docs/advanced/feature-toggle-types.md index 0122bc4d06..cacc92c233 100644 --- a/website/docs/advanced/feature-toggle-types.md +++ b/website/docs/advanced/feature-toggle-types.md @@ -5,23 +5,35 @@ title: Feature Toggle Types > This feature was introduced in _Unleash v3.5.0_. -Starting with version `3.5.0` Unleash introduces the concept of feature toggle types. The toggle types are heavily inspired by [Pete Hodgson's article on feature toggles](https://martinfowler.com/articles/feature-toggles.html). +You can use feature toggles to support different use cases, each with their own specific needs. Heavily inspired by [Pete Hodgson's article on feature toggles](https://martinfowler.com/articles/feature-toggles.html), Unleash introduced the concept of feature toggle types in version `3.5.0`. -The idea is to make it easier for teams to manage their feature toggles, if they can more clearly classify them. The classification will also help us understand the [expected feature toggle lifetime](https://www.getunleash.io/blog/feature-toggle-life-time-best-practices). Some feature toggles are meant to live for a few weeks, while we work on the new functionality, while others are of a more permanent nature. +A feature toggle's type affects only two things: +1. It gives the toggle an appropriate icon +2. The toggle's expected lifetime changes -Feature toggle types currently supported by Unleash: +Aside from this, there are no differences between the toggle types and you can always change the type of a toggle after you have created it. -- **Release** - Used to enable trunk-based development for teams practicing Continuous Delivery. _Expected lifetime 40 days_ -- **Experiment** - Used to perform multivariate or A/B testing. _Expected lifetime 40 days_ -- **Operational** - Used to control operational aspects of the system's behavior. _Expected lifetime 7 days_ -- **Kill switch** - Used to gracefully degrade system functionality. _(permanent)_ -- **Permission** - Used to change the features or product experience that certain users receive. _(permanent)_ +Classifying feature toggles by their type makes it easier for you manage them: the toggles get different icons in the toggle list and you can sort the toggles by their types. -### Deprecate a feature toggle {#deprecate-a-feature-toggle} +![Five feature toggles, each of a different type, showing the different icons that Unleash uses for each toggle type.](/img/toggle_type_icons.png "Feature toggle type icons") -Feature toggles can now also be marked as `stale`. You can think of this as a way to deprecate a feature toggle, without removing the active configuration for connected applications. This allows us to clearly signal that we should stop using the feature toggle in our applications. +A toggle's type also helps Unleash understand the [toggle's expected lifetime](https://www.getunleash.io/blog/feature-toggle-life-time-best-practices): some feature toggles are meant to live for a few weeks as you work on new functionality, while others stay in for much longer. When a feature toggle lives past its expected lifetime, Unleash will mark it as _potentially stale_. See the [technical debt section](/user_guide/technical_debt) for more information on what this means and how to handle it. -The `stale` property can utilized to help us manage "feature toggle debt" in various ways: +## Feature toggle types + +Here's the list of the feature toggle types that Unleash supports together with their intended use case and expected lifetime: + +- **Release** - Enable trunk-based development for teams practicing Continuous Delivery. _Expected lifetime 40 days_ +- **Experiment** - Perform multivariate or A/B testing. _Expected lifetime 40 days_ +- **Operational** - Control operational aspects of the system's behavior. _Expected lifetime 7 days_ +- **Kill switch** - Gracefully degrade system functionality. _(permanent)_ +- **Permission** - Change the features or product experience that certain users receive. _(permanent)_ + +## Deprecating a feature toggle {#deprecate-a-feature-toggle} + +You can mark feature toggles as `stale`. This is a way to deprecate a feature toggle without removing the active configuration for connected applications. Use this to signal that you should stop using the feature in your applications. + +The `stale` property can utilized to help us manage ["feature toggle debt"](/user_guide/technical_debt) in various ways: - Inform the developer working locally when we detect usage of a stale feature toggle. - Use it to break the build if the code contains stale feature toggles. diff --git a/website/static/img/toggle_type_icons.png b/website/static/img/toggle_type_icons.png new file mode 100644 index 0000000000000000000000000000000000000000..cbf90a5c7fb523a32c72e2a8e2c15560bfc756fe GIT binary patch literal 214008 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 literal 0 HcmV?d00001 From 5fc02a10d311ff08a0bf784a72d0328fe7969999 Mon Sep 17 00:00:00 2001 From: Thomas Heartman Date: Tue, 23 Nov 2021 11:53:23 +0100 Subject: [PATCH 20/27] docs: fix internal links. --- website/docs/advanced/feature-toggle-types.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/website/docs/advanced/feature-toggle-types.md b/website/docs/advanced/feature-toggle-types.md index cacc92c233..faaedb9ce5 100644 --- a/website/docs/advanced/feature-toggle-types.md +++ b/website/docs/advanced/feature-toggle-types.md @@ -17,7 +17,7 @@ Classifying feature toggles by their type makes it easier for you manage them: t ![Five feature toggles, each of a different type, showing the different icons that Unleash uses for each toggle type.](/img/toggle_type_icons.png "Feature toggle type icons") -A toggle's type also helps Unleash understand the [toggle's expected lifetime](https://www.getunleash.io/blog/feature-toggle-life-time-best-practices): some feature toggles are meant to live for a few weeks as you work on new functionality, while others stay in for much longer. When a feature toggle lives past its expected lifetime, Unleash will mark it as _potentially stale_. See the [technical debt section](/user_guide/technical_debt) for more information on what this means and how to handle it. +A toggle's type also helps Unleash understand the [toggle's expected lifetime](https://www.getunleash.io/blog/feature-toggle-life-time-best-practices): some feature toggles are meant to live for a few weeks as you work on new functionality, while others stay in for much longer. When a feature toggle lives past its expected lifetime, Unleash will mark it as _potentially stale_. See the [technical debt section](../user_guide/technical_debt) for more information on what this means and how to handle it. ## Feature toggle types @@ -31,9 +31,9 @@ Here's the list of the feature toggle types that Unleash supports together with ## Deprecating a feature toggle {#deprecate-a-feature-toggle} -You can mark feature toggles as `stale`. This is a way to deprecate a feature toggle without removing the active configuration for connected applications. Use this to signal that you should stop using the feature in your applications. +You can mark feature toggles as `stale`. This is a way to deprecate a feature toggle without removing the active configuration for connected applications. Use this to signal that you should stop using the feature in your applications. Stale toggles will show as stale in the ["technical debt dashboard"](../user_guide/technical_debt). -The `stale` property can utilized to help us manage ["feature toggle debt"](/user_guide/technical_debt) in various ways: +The `stale` property can utilized to help us manage in various ways: - Inform the developer working locally when we detect usage of a stale feature toggle. - Use it to break the build if the code contains stale feature toggles. From 6962f39cc1fb241bee5e2bfe3692b37e0980ffbf Mon Sep 17 00:00:00 2001 From: Thomas Heartman Date: Tue, 23 Nov 2021 11:53:34 +0100 Subject: [PATCH 21/27] docs: link to feature-flag-types from important concepts. --- website/docs/user_guide/important-concepts.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/website/docs/user_guide/important-concepts.md b/website/docs/user_guide/important-concepts.md index 064707cec1..a9c6d26622 100644 --- a/website/docs/user_guide/important-concepts.md +++ b/website/docs/user_guide/important-concepts.md @@ -21,7 +21,7 @@ Unleash comes with a set of built in strategies. [But you can also build your ow All our SDKs perform local evaluation of feature toggles, which means that they download the configuration from unleash and cache the configuration in memory in your application. This is done in order to avoid adding network latency to user interactions, making it unnoticable for users that you are using feature flagging, in addition to the added benefit that none of your data leaves your application - enforcing privacy by design. -[Read more about our unique architecture here](https://www.getunleash.io/blog/our-unique-architecture) +[Read more about our unique architecture here.](https://www.getunleash.io/blog/our-unique-architecture) ## Unleash Context @@ -31,10 +31,16 @@ Since the SDKs perform local evaluation, some of the parameters needed for evalu ## API architecture -The Unleash API is split into two. One API is for the clients connecting unleash and is located under the path /api/client, and provides access to retrieving saved feature toggle configurations, metrics and registering the application. +The Unleash API is split into two. One API is for the clients connecting unleash and is located under the path /api/client, and provides access to retrieving saved feature toggle configurations, metrics and registering the application. The second API is the admin API, which is utilised in order to control any CRUD aspect of unleash resources. The split ensures a second layer of security that ensures that in the case you should loose your client api key, attackers will only have read-only access to your feature toggle configurations. This ensures that we can have different data responses for the client API endpoints which will include less metadata, and be cached more heavily - optimising the SDK endpoints for best performance. -[Read more about unleash API here](../api) +[Read more about unleash API here.](../api) + +## Feature toggle types + +Unleash categorizes feature toggles into five distinct types. This categorization makes it easier for you to see what the purpose of a toggle is and helps Unleash with [managing technical debt](/user_guide/technical_debt). A feature toggle's type has no effect on how the toggle behaves or how you can configure it. + +[Read more about feature toggle types here.](../advanced/feature-toggle-types.md) From 99a2bae0f9067629f0fffe9b0547c2a1245eb102 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 23 Nov 2021 13:02:54 +0100 Subject: [PATCH 22/27] chore(deps): update dependency eslint-config-airbnb-typescript to v16 (#1109) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 59 ++++++++-------------------------------------------- 2 files changed, 10 insertions(+), 51 deletions(-) diff --git a/package.json b/package.json index 2fa0cbcb71..c794de6dad 100644 --- a/package.json +++ b/package.json @@ -137,7 +137,7 @@ "del-cli": "4.0.1", "eslint": "8.3.0", "eslint-config-airbnb-base": "15.0.0", - "eslint-config-airbnb-typescript": "15.0.0", + "eslint-config-airbnb-typescript": "16.0.0", "eslint-config-prettier": "8.3.0", "eslint-plugin-import": "2.25.3", "eslint-plugin-prettier": "4.0.0", diff --git a/yarn.lock b/yarn.lock index 31430e8333..5c7323f75f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2335,29 +2335,6 @@ errorhandler@^1.5.1: accepts "~1.3.7" escape-html "~1.0.3" -es-abstract@^1.18.2: - version "1.18.5" - resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz" - integrity sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - get-intrinsic "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.2" - internal-slot "^1.0.3" - is-callable "^1.2.3" - is-negative-zero "^2.0.1" - is-regex "^1.1.3" - is-string "^1.0.6" - object-inspect "^1.11.0" - object-keys "^1.1.1" - object.assign "^4.1.2" - string.prototype.trimend "^1.0.4" - string.prototype.trimstart "^1.0.4" - unbox-primitive "^1.0.1" - es-abstract@^1.19.0, es-abstract@^1.19.1: version "1.19.1" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" @@ -2466,7 +2443,7 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" -eslint-config-airbnb-base@15.0.0: +eslint-config-airbnb-base@15.0.0, eslint-config-airbnb-base@^15.0.0: version "15.0.0" resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz#6b09add90ac79c2f8d723a2580e07f3925afd236" integrity sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig== @@ -2476,21 +2453,12 @@ eslint-config-airbnb-base@15.0.0: object.entries "^1.1.5" semver "^6.3.0" -eslint-config-airbnb-base@^14.2.1: - version "14.2.1" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz#8a2eb38455dc5a312550193b319cdaeef042cd1e" - integrity sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA== +eslint-config-airbnb-typescript@16.0.0: + version "16.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-16.0.0.tgz#75007e27d5a7fb75530721f48197817c1d2ad4d1" + integrity sha512-qDOyD0YYZo5Us1YvOnWig2Ly/+IlQKmMZpnqKnJgVtHdK8SkjaSyVBHKbD41dEaQxk8vRVGBC94PuR2ceSwbLQ== dependencies: - confusing-browser-globals "^1.0.10" - object.assign "^4.1.2" - object.entries "^1.1.2" - -eslint-config-airbnb-typescript@15.0.0: - version "15.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-15.0.0.tgz#c88007b3cca5dd0f47125420ca5e8f6efac418fd" - integrity sha512-DTWGwqytbTnB8kSKtmkrGkRf3xwTs2l15shSH0w/3Img47AQwCCrIA/ON/Uj0XXBxP31LHyEItPXeuH3mqCNLA== - dependencies: - eslint-config-airbnb-base "^14.2.1" + eslint-config-airbnb-base "^15.0.0" eslint-config-prettier@8.3.0: version "8.3.0" @@ -3635,7 +3603,7 @@ is-buffer@^1.1.5: resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-callable@^1.1.4, is-callable@^1.2.3, is-callable@^1.2.4: +is-callable@^1.1.4, is-callable@^1.2.4: version "1.2.4" resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz" integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== @@ -3824,7 +3792,7 @@ is-promise@^2.2.2: resolved "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz" integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== -is-regex@^1.1.3, is-regex@^1.1.4: +is-regex@^1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== @@ -3854,7 +3822,7 @@ is-stream@^2.0.0: resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-string@^1.0.5, is-string@^1.0.6, is-string@^1.0.7: +is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== @@ -5274,15 +5242,6 @@ object.defaults@^1.1.0: for-own "^1.0.0" isobject "^3.0.0" -object.entries@^1.1.2: - version "1.1.4" - resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.4.tgz" - integrity sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.18.2" - object.entries@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" From c7c4ad99631d6ac4be791d8be3a03b9600310cd9 Mon Sep 17 00:00:00 2001 From: Thomas Heartman Date: Tue, 23 Nov 2021 13:36:08 +0100 Subject: [PATCH 23/27] docs: touch up the section on deprecating feature toggles. --- website/docs/advanced/feature-toggle-types.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/website/docs/advanced/feature-toggle-types.md b/website/docs/advanced/feature-toggle-types.md index faaedb9ce5..33392018b8 100644 --- a/website/docs/advanced/feature-toggle-types.md +++ b/website/docs/advanced/feature-toggle-types.md @@ -29,12 +29,14 @@ Here's the list of the feature toggle types that Unleash supports together with - **Kill switch** - Gracefully degrade system functionality. _(permanent)_ - **Permission** - Change the features or product experience that certain users receive. _(permanent)_ -## Deprecating a feature toggle {#deprecate-a-feature-toggle} +## Deprecating feature toggles {#deprecate-a-feature-toggle} You can mark feature toggles as `stale`. This is a way to deprecate a feature toggle without removing the active configuration for connected applications. Use this to signal that you should stop using the feature in your applications. Stale toggles will show as stale in the ["technical debt dashboard"](../user_guide/technical_debt). -The `stale` property can utilized to help us manage in various ways: +When you mark a toggle as stale, Unleash will emit an event. You can use [an addon](https://docs.getunleash.io/addons/index) to integrate this with your systems, by for instance posting a message in a Slack channel. -- Inform the developer working locally when we detect usage of a stale feature toggle. -- Use it to break the build if the code contains stale feature toggles. -- Send automatic PR to remove usage of completed toggles. +Additionally, with some extra work, you can also use the `stale` property to: + +- Inform a developers that a toggle is stale _while_ they're developing. +- Break a project build if the code contains stale feature toggles. +- Send automatic PRs to remove usage of toggles that have served their purpose. From 7056d516b492078eb94473544b423b7c07d74798 Mon Sep 17 00:00:00 2001 From: Thomas Heartman Date: Tue, 23 Nov 2021 14:18:35 +0100 Subject: [PATCH 24/27] fix: image inclusion and alt text syntax was wrong. Turns out the image description needed to be wrapped in an extra pair of square brackets and that quotes must be escaped or removed. --- website/docs/user_guide/quickstart.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/website/docs/user_guide/quickstart.md b/website/docs/user_guide/quickstart.md index 7c7e8c432d..a975312a3b 100644 --- a/website/docs/user_guide/quickstart.md +++ b/website/docs/user_guide/quickstart.md @@ -255,9 +255,9 @@ Follow steps outlined in the [Run Unleash with Docker](#run-unleash-with-docker) To get an API key, access your Unleash instance in a web browser. First, navigate to the API access screen. - ![The Unleash UI showing a dropdown menu under the "Configure" menu -entry. The dropdown menu's "API Access" option is highlighted and -you're told to navigate there.](/img/api_access_navigation.png 'Navigate to the API access page.') + [![The Unleash UI showing a dropdown menu under the Configure menu +entry. The dropdown menu's API Access option is highlighted and +you're told to navigate there.]](/img/api_access_navigation.png 'Navigate to the API access page.') Next, create an API key with these details From 1848d8d4ebaa4400c2ac638923b3351562f7379c Mon Sep 17 00:00:00 2001 From: Christopher Kolstad Date: Tue, 23 Nov 2021 15:19:59 +0100 Subject: [PATCH 25/27] task: add a workflow that validates docs for PRs (#1123) --- .github/workflows/build_doc_prs.yaml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .github/workflows/build_doc_prs.yaml diff --git a/.github/workflows/build_doc_prs.yaml b/.github/workflows/build_doc_prs.yaml new file mode 100644 index 0000000000..c332f67003 --- /dev/null +++ b/.github/workflows/build_doc_prs.yaml @@ -0,0 +1,17 @@ +name: PR -> Build Docs + +on: + pull_request: + paths: + - website/** + +jobs: + validate: + + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: setup git config + run: | + # Build the site + cd website && yarn && yarn build From df742279a5eb3780f6c5c5aa7ab6af9b1a765d68 Mon Sep 17 00:00:00 2001 From: Thomas Heartman Date: Wed, 24 Nov 2021 08:33:31 +0100 Subject: [PATCH 26/27] Apply suggestions from code review Co-authored-by: Christopher Kolstad --- website/docs/advanced/feature-toggle-types.md | 4 ++-- website/docs/user_guide/important-concepts.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/website/docs/advanced/feature-toggle-types.md b/website/docs/advanced/feature-toggle-types.md index 33392018b8..1b58fff828 100644 --- a/website/docs/advanced/feature-toggle-types.md +++ b/website/docs/advanced/feature-toggle-types.md @@ -33,10 +33,10 @@ Here's the list of the feature toggle types that Unleash supports together with You can mark feature toggles as `stale`. This is a way to deprecate a feature toggle without removing the active configuration for connected applications. Use this to signal that you should stop using the feature in your applications. Stale toggles will show as stale in the ["technical debt dashboard"](../user_guide/technical_debt). -When you mark a toggle as stale, Unleash will emit an event. You can use [an addon](https://docs.getunleash.io/addons/index) to integrate this with your systems, by for instance posting a message in a Slack channel. +When you mark a toggle as stale, Unleash will emit an event. You can use [an addon](https://docs.getunleash.io/addons/index) to integrate this with your systems, for instance to post a message in a Slack channel. Additionally, with some extra work, you can also use the `stale` property to: -- Inform a developers that a toggle is stale _while_ they're developing. +- Inform developers that a toggle is stale _while_ they're developing. - Break a project build if the code contains stale feature toggles. - Send automatic PRs to remove usage of toggles that have served their purpose. diff --git a/website/docs/user_guide/important-concepts.md b/website/docs/user_guide/important-concepts.md index a9c6d26622..7e8783df9b 100644 --- a/website/docs/user_guide/important-concepts.md +++ b/website/docs/user_guide/important-concepts.md @@ -31,7 +31,7 @@ Since the SDKs perform local evaluation, some of the parameters needed for evalu ## API architecture -The Unleash API is split into two. One API is for the clients connecting unleash and is located under the path /api/client, and provides access to retrieving saved feature toggle configurations, metrics and registering the application. +The Unleash API is split into two. One API is for the clients connecting to unleash. It is located under the path /api/client. This provides access to retrieving saved feature toggle configurations, metrics and registering the application. The second API is the admin API, which is utilised in order to control any CRUD aspect of unleash resources. The split ensures a second layer of security that ensures that in the case you should loose your client api key, attackers will only have read-only access to your feature toggle configurations. From 6c6001619ce2fbcb4664f9346b1729d4974186db Mon Sep 17 00:00:00 2001 From: Christopher Kolstad Date: Wed, 24 Nov 2021 13:08:04 +0100 Subject: [PATCH 27/27] Feat/variant api (#1119) Add a new .../:feature/variants API This adds - `GET /api/admin/projects/:projectId/features/:featureName/variants` which returns ```json { version: '1', variants: IVariant[] } ``` - `PATCH /api/admin/projects/:projectId/features/:featureName/variants` which accepts a json patch set and updates the feature's variants field and then returns ```json { version: '1', variants: IVariant[] } ``` - `PUT /api/admin/projects/:projectId/features/:featureName/variants` which accepts a IVariant[] and overwrites the current variants list for the feature defined in :featureName and returns ```json { version: '1', variants: IVariant[] } - This also makes sure the total weight of all variants is == 1000 - Validates that there is at least 1 'variable' variant if there are variants - Validates that 'fix' variants total weight can't exceed 1000 - Adds tests for all these invariants. Co-authored-by: Simon Hornby --- .github/workflows/build_doc_prs.yaml | 2 +- src/lib/db/feature-toggle-store.ts | 25 + src/lib/routes/admin-api/project/index.ts | 2 + src/lib/routes/admin-api/project/variants.ts | 78 +++ src/lib/schema/feature-schema.ts | 2 + src/lib/services/feature-toggle-service.ts | 74 +- src/lib/types/model.ts | 5 +- src/lib/types/stores/feature-toggle-store.ts | 7 +- .../e2e/api/admin/client-metrics.e2e.test.ts | 4 +- .../api/admin/project/variants.e2e.test.ts | 645 ++++++++++++++++++ .../fixtures/fake-feature-toggle-store.ts | 20 +- .../docs/api/admin/feature-toggles-api-v2.md | 99 ++- 12 files changed, 954 insertions(+), 9 deletions(-) create mode 100644 src/lib/routes/admin-api/project/variants.ts create mode 100644 src/test/e2e/api/admin/project/variants.e2e.test.ts diff --git a/.github/workflows/build_doc_prs.yaml b/.github/workflows/build_doc_prs.yaml index c332f67003..88a3ac5fa1 100644 --- a/.github/workflows/build_doc_prs.yaml +++ b/.github/workflows/build_doc_prs.yaml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - name: setup git config + - name: Build docs run: | # Build the site cd website && yarn && yarn build diff --git a/src/lib/db/feature-toggle-store.ts b/src/lib/db/feature-toggle-store.ts index 7d4414195f..a9d5bb0fbc 100644 --- a/src/lib/db/feature-toggle-store.ts +++ b/src/lib/db/feature-toggle-store.ts @@ -167,6 +167,13 @@ export default class FeatureToggleStore implements IFeatureToggleStore { }; } + rowToVariants(row: FeaturesTable): IVariant[] { + if (!row) { + throw new NotFoundError('No feature toggle found'); + } + return (row.variants as unknown as IVariant[]) || []; + } + dtoToRow(project: string, data: FeatureToggleDTO): FeaturesTable { const row = { name: data.name, @@ -232,6 +239,24 @@ export default class FeatureToggleStore implements IFeatureToggleStore { .returning(FEATURE_COLUMNS); return this.rowToFeature(row[0]); } + + async getVariants(featureName: string): Promise { + const row = await this.db(TABLE) + .select('variants') + .where({ name: featureName }); + return this.rowToVariants(row[0]); + } + + async saveVariants( + featureName: string, + newVariants: IVariant[], + ): Promise { + const row = await this.db(TABLE) + .update({ variants: JSON.stringify(newVariants) }) + .where({ name: featureName }) + .returning(FEATURE_COLUMNS); + return this.rowToFeature(row[0]); + } } module.exports = FeatureToggleStore; diff --git a/src/lib/routes/admin-api/project/index.ts b/src/lib/routes/admin-api/project/index.ts index 22f982fbe7..10f54fe765 100644 --- a/src/lib/routes/admin-api/project/index.ts +++ b/src/lib/routes/admin-api/project/index.ts @@ -6,6 +6,7 @@ import ProjectFeaturesController from './features'; import EnvironmentsController from './environments'; import ProjectHealthReport from './health-report'; import ProjectService from '../../../services/project-service'; +import VariantsController from './variants'; export default class ProjectApi extends Controller { private projectService: ProjectService; @@ -17,6 +18,7 @@ export default class ProjectApi extends Controller { this.use('/', new ProjectFeaturesController(config, services).router); this.use('/', new EnvironmentsController(config, services).router); this.use('/', new ProjectHealthReport(config, services).router); + this.use('/', new VariantsController(config, services).router); } async getProjects(req: Request, res: Response): Promise { diff --git a/src/lib/routes/admin-api/project/variants.ts b/src/lib/routes/admin-api/project/variants.ts new file mode 100644 index 0000000000..cc88c303ff --- /dev/null +++ b/src/lib/routes/admin-api/project/variants.ts @@ -0,0 +1,78 @@ +import FeatureToggleService from '../../../services/feature-toggle-service'; +import { Logger } from '../../../logger'; +import Controller from '../../controller'; +import { IUnleashConfig } from '../../../types/option'; +import { IUnleashServices } from '../../../types'; +import { Request, Response } from 'express'; +import { Operation } from 'fast-json-patch'; +import { UPDATE_FEATURE } from '../../../types/permissions'; +import { IVariant } from '../../../types/model'; + +const PREFIX = '/:projectId/features/:featureName/variants'; + +interface FeatureParams extends ProjectParam { + featureName: string; +} + +interface ProjectParam { + projectId: string; +} + +export default class VariantsController extends Controller { + private logger: Logger; + + private featureService: FeatureToggleService; + + constructor( + config: IUnleashConfig, + { + featureToggleService, + }: Pick, + ) { + super(config); + this.logger = config.getLogger('admin-api/project/variants.ts'); + this.featureService = featureToggleService; + this.get(PREFIX, this.getVariants); + this.patch(PREFIX, this.patchVariants, UPDATE_FEATURE); + this.put(PREFIX, this.overwriteVariants, UPDATE_FEATURE); + } + + async getVariants( + req: Request, + res: Response, + ): Promise { + const { featureName } = req.params; + const variants = await this.featureService.getVariants(featureName); + res.status(200).json({ version: '1', variants }); + } + + async patchVariants( + req: Request, + res: Response, + ): Promise { + const { featureName } = req.params; + const updatedFeature = await this.featureService.updateVariants( + featureName, + req.body, + ); + res.status(200).json({ + version: '1', + variants: updatedFeature.variants, + }); + } + + async overwriteVariants( + req: Request, + res: Response, + ): Promise { + const { featureName } = req.params; + const updatedFeature = await this.featureService.saveVariants( + featureName, + req.body, + ); + res.status(200).json({ + version: '1', + variants: updatedFeature.variants, + }); + } +} diff --git a/src/lib/schema/feature-schema.ts b/src/lib/schema/feature-schema.ts index 8a1b14cd54..4ea4e1b6c5 100644 --- a/src/lib/schema/feature-schema.ts +++ b/src/lib/schema/feature-schema.ts @@ -42,6 +42,8 @@ export const variantsSchema = joi.object().keys({ ), }); +export const variantsArraySchema = joi.array().min(0).items(variantsSchema); + export const featureMetadataSchema = joi .object() .keys({ diff --git a/src/lib/services/feature-toggle-service.ts b/src/lib/services/feature-toggle-service.ts index 5aae84b36d..2dcd774823 100644 --- a/src/lib/services/feature-toggle-service.ts +++ b/src/lib/services/feature-toggle-service.ts @@ -5,7 +5,11 @@ import BadDataError from '../error/bad-data-error'; import NameExistsError from '../error/name-exists-error'; import InvalidOperationError from '../error/invalid-operation-error'; import { FOREIGN_KEY_VIOLATION } from '../error/db-error'; -import { featureMetadataSchema, nameSchema } from '../schema/feature-schema'; +import { + featureMetadataSchema, + nameSchema, + variantsArraySchema, +} from '../schema/feature-schema'; import { FeatureArchivedEvent, FeatureChangeProjectEvent, @@ -40,6 +44,8 @@ import { IFeatureStrategy, IFeatureToggleQuery, IStrategyConfig, + IVariant, + WeightType, } from '../types/model'; import { IFeatureEnvironmentStore } from '../types/stores/feature-environment-store'; import { IFeatureToggleClientStore } from '../types/stores/feature-toggle-client-store'; @@ -389,6 +395,15 @@ class FeatureToggleService { ); } + /** + * GET /api/admin/projects/:project/features/:featureName/variants + * @param featureName + * @return The list of variants + */ + async getVariants(featureName: string): Promise { + return this.featureToggleStore.getVariants(featureName); + } + async getFeatureMetadata(featureName: string): Promise { return this.featureToggleStore.get(featureName); } @@ -882,6 +897,63 @@ class FeatureToggleService { newProjectId, ); } + + async updateVariants( + featureName: string, + newVariants: Operation[], + ): Promise { + const oldVariants = await this.getVariants(featureName); + const { newDocument } = await applyPatch(oldVariants, newVariants); + return this.saveVariants(featureName, newDocument); + } + + async saveVariants( + featureName: string, + newVariants: IVariant[], + ): Promise { + await variantsArraySchema.validateAsync(newVariants); + const fixedVariants = this.fixVariantWeights(newVariants); + return this.featureToggleStore.saveVariants(featureName, fixedVariants); + } + + fixVariantWeights(variants: IVariant[]): IVariant[] { + let variableVariants = variants.filter((x) => { + return x.weightType === WeightType.VARIABLE; + }); + + if (variants.length > 0 && variableVariants.length === 0) { + throw new BadDataError( + 'There must be at least one "variable" variant', + ); + } + + let fixedVariants = variants.filter((x) => { + return x.weightType === WeightType.FIX; + }); + + let fixedWeights = fixedVariants.reduce((a, v) => a + v.weight, 0); + + if (fixedWeights > 1000) { + throw new BadDataError( + 'The traffic distribution total must equal 100%', + ); + } + + let averageWeight = Math.floor( + (1000 - fixedWeights) / variableVariants.length, + ); + let remainder = (1000 - fixedWeights) % variableVariants.length; + + variableVariants = variableVariants.map((x) => { + x.weight = averageWeight; + if (remainder > 0) { + x.weight += 1; + remainder--; + } + return x; + }); + return variableVariants.concat(fixedVariants); + } } export default FeatureToggleService; diff --git a/src/lib/types/model.ts b/src/lib/types/model.ts index f19a8c9746..495beb746d 100644 --- a/src/lib/types/model.ts +++ b/src/lib/types/model.ts @@ -8,7 +8,10 @@ export interface IConstraint { operator: string; values: string[]; } - +export enum WeightType { + VARIABLE = 'variable', + FIX = 'fix', +} export interface IStrategyConfig { id?: string; name: string; diff --git a/src/lib/types/stores/feature-toggle-store.ts b/src/lib/types/stores/feature-toggle-store.ts index edbd732653..f950813fd0 100644 --- a/src/lib/types/stores/feature-toggle-store.ts +++ b/src/lib/types/stores/feature-toggle-store.ts @@ -1,4 +1,4 @@ -import { FeatureToggle, FeatureToggleDTO } from '../model'; +import { FeatureToggle, FeatureToggleDTO, IVariant } from '../model'; import { Store } from './store'; export interface IFeatureToggleQuery { @@ -16,4 +16,9 @@ export interface IFeatureToggleStore extends Store { archive(featureName: string): Promise; revive(featureName: string): Promise; getAll(query?: Partial): Promise; + getVariants(featureName: string): Promise; + saveVariants( + featureName: string, + newVariants: IVariant[], + ): Promise; } diff --git a/src/test/e2e/api/admin/client-metrics.e2e.test.ts b/src/test/e2e/api/admin/client-metrics.e2e.test.ts index f9f2ad7680..61ddef37fb 100644 --- a/src/test/e2e/api/admin/client-metrics.e2e.test.ts +++ b/src/test/e2e/api/admin/client-metrics.e2e.test.ts @@ -173,7 +173,7 @@ test('should return toggle summary', async () => { test('should only include last hour of metrics return toggle summary', async () => { const now = new Date(); - const dateOneHourAgo = subHours(now, 1); + const dateTwoHoursAgo = subHours(now, 2); const metrics: IClientMetricsEnv[] = [ { featureName: 'demo', @@ -211,7 +211,7 @@ test('should only include last hour of metrics return toggle summary', async () featureName: 'demo', appName: 'backend-api', environment: 'test', - timestamp: dateOneHourAgo, + timestamp: dateTwoHoursAgo, yes: 55, no: 55, }, diff --git a/src/test/e2e/api/admin/project/variants.e2e.test.ts b/src/test/e2e/api/admin/project/variants.e2e.test.ts new file mode 100644 index 0000000000..de39df76d0 --- /dev/null +++ b/src/test/e2e/api/admin/project/variants.e2e.test.ts @@ -0,0 +1,645 @@ +import { IUnleashTest, setupApp } from '../../../helpers/test-helper'; +import dbInit, { ITestDb } from '../../../helpers/database-init'; +import getLogger from '../../../../fixtures/no-logger'; +import * as jsonpatch from 'fast-json-patch'; +import { IVariant, WeightType } from '../../../../../lib/types/model'; + +let app: IUnleashTest; +let db: ITestDb; + +beforeAll(async () => { + db = await dbInit('project_feature_variants_api_serial', getLogger); + app = await setupApp(db.stores); +}); + +afterAll(async () => { + await app.destroy(); + await db.destroy(); +}); + +test('Can get variants for a feature', async () => { + const featureName = 'feature-variants'; + const variantName = 'fancy-variant'; + await db.stores.featureToggleStore.create('default', { + name: featureName, + variants: [ + { + name: variantName, + stickiness: 'default', + weight: 1000, + weightType: WeightType.VARIABLE, + }, + ], + }); + await app.request + .get(`/api/admin/projects/default/features/${featureName}/variants`) + .expect(200) + .expect((res) => { + expect(res.body.version).toBe('1'); + expect(res.body.variants).toHaveLength(1); + expect(res.body.variants[0].name).toBe(variantName); + }); +}); + +test('Trying to do operations on a non-existing feature yields 404', async () => { + await app.request + .get( + '/api/admin/projects/default/features/non-existing-feature/variants', + ) + .expect(404); + const variants = [ + { + name: 'variant-put-overwrites', + stickiness: 'default', + weight: 1000, + weightType: WeightType.VARIABLE, + }, + ]; + await app.request + .put('/api/admin/projects/default/features/${featureName}/variants') + .send(variants) + .expect(404); + + const newVariants: IVariant[] = []; + const observer = jsonpatch.observe(newVariants); + newVariants.push({ + name: 'variant1', + stickiness: 'default', + weight: 700, + weightType: WeightType.VARIABLE, + }); + let patch = jsonpatch.generate(observer); + await app.request + .patch('/api/admin/projects/default/features/${featureName}/variants') + .send(patch) + .expect(404); +}); + +test('Can patch variants for a feature and get a response of new variant', async () => { + const featureName = 'feature-variants-patch'; + const variantName = 'fancy-variant-patch'; + const expectedVariantName = 'not-so-cool-variant-name'; + const variants = [ + { + name: variantName, + stickiness: 'default', + weight: 1000, + weightType: WeightType.VARIABLE, + }, + ]; + + await db.stores.featureToggleStore.create('default', { + name: featureName, + variants, + }); + + const observer = jsonpatch.observe(variants); + variants[0].name = expectedVariantName; + const patch = jsonpatch.generate(observer); + + await app.request + .patch(`/api/admin/projects/default/features/${featureName}/variants`) + .send(patch) + .expect(200) + .expect((res) => { + expect(res.body.version).toBe('1'); + expect(res.body.variants).toHaveLength(1); + expect(res.body.variants[0].name).toBe(expectedVariantName); + }); +}); + +test('Can add variant for a feature', async () => { + const featureName = 'feature-variants-patch-add'; + const variantName = 'fancy-variant-patch'; + const expectedVariantName = 'not-so-cool-variant-name'; + const variants = [ + { + name: variantName, + stickiness: 'default', + weight: 1000, + weightType: WeightType.VARIABLE, + }, + ]; + + await db.stores.featureToggleStore.create('default', { + name: featureName, + variants, + }); + + const observer = jsonpatch.observe(variants); + variants.push({ + name: expectedVariantName, + stickiness: 'default', + weight: 1000, + weightType: WeightType.VARIABLE, + }); + const patch = jsonpatch.generate(observer); + await app.request + .patch(`/api/admin/projects/default/features/${featureName}/variants`) + .send(patch) + .expect(200); + + await app.request + .get(`/api/admin/projects/default/features/${featureName}/variants`) + .expect((res) => { + expect(res.body.version).toBe('1'); + expect(res.body.variants).toHaveLength(2); + expect( + res.body.variants.find((x) => x.name === expectedVariantName), + ).toBeTruthy(); + expect( + res.body.variants.find((x) => x.name === variantName), + ).toBeTruthy(); + }); +}); + +test('Can remove variant for a feature', async () => { + const featureName = 'feature-variants-patch-remove'; + const variantName = 'fancy-variant-patch'; + const variants = [ + { + name: variantName, + stickiness: 'default', + weight: 1000, + weightType: WeightType.VARIABLE, + }, + ]; + + await db.stores.featureToggleStore.create('default', { + name: featureName, + variants, + }); + + const observer = jsonpatch.observe(variants); + variants.pop(); + const patch = jsonpatch.generate(observer); + + await app.request + .patch(`/api/admin/projects/default/features/${featureName}/variants`) + .send(patch) + .expect(200); + + await app.request + .get(`/api/admin/projects/default/features/${featureName}/variants`) + .expect((res) => { + expect(res.body.version).toBe('1'); + expect(res.body.variants).toHaveLength(0); + }); +}); + +test('PUT overwrites current variant on feature', async () => { + const featureName = 'variant-put-overwrites'; + const variantName = 'overwriting-for-fun'; + const variants = [ + { + name: variantName, + stickiness: 'default', + weight: 1000, + weightType: WeightType.VARIABLE, + }, + ]; + await db.stores.featureToggleStore.create('default', { + name: featureName, + variants, + }); + + const newVariants: IVariant[] = [ + { + name: 'variant1', + stickiness: 'default', + weight: 250, + weightType: WeightType.FIX, + }, + { + name: 'variant2', + stickiness: 'default', + weight: 375, + weightType: WeightType.VARIABLE, + }, + { + name: 'variant3', + stickiness: 'default', + weight: 450, + weightType: WeightType.VARIABLE, + }, + ]; + await app.request + .put(`/api/admin/projects/default/features/${featureName}/variants`) + .send(newVariants) + .expect(200) + .expect((res) => { + expect(res.body.variants).toHaveLength(3); + }); + await app.request + .get(`/api/admin/projects/default/features/${featureName}/variants`) + .expect(200) + .expect((res) => { + expect(res.body.variants).toHaveLength(3); + expect(res.body.variants.reduce((a, v) => a + v.weight, 0)).toEqual( + 1000, + ); + }); +}); + +test('PUTing an invalid variant throws 400 exception', async () => { + const featureName = 'variants-validation-feature'; + await db.stores.featureToggleStore.create('default', { + name: featureName, + }); + + const invalidJson = [ + { + name: 'variant', + weight: 500, + weightType: 'party', + }, + ]; + await app.request + .put(`/api/admin/projects/default/features/${featureName}/variants`) + .send(invalidJson) + .expect(400) + .expect((res) => { + expect(res.body.details).toHaveLength(1); + expect(res.body.details[0].message).toMatch( + /.*weightType\" must be one of/, + ); + }); +}); + +test('Invalid variant in PATCH also throws 400 exception', async () => { + const featureName = 'patch-validation-feature'; + await db.stores.featureToggleStore.create('default', { + name: featureName, + }); + + const invalidPatch = `[{ + "op": "add", + "path": "/1", + "value": { + "name": "not-so-cool-variant-name", + "stickiness": "default", + "weight": 2000, + "weightType": "variable" + } + }]`; + + await app.request + .patch(`/api/admin/projects/default/features/${featureName}/variants`) + .set('Content-Type', 'application/json') + .send(invalidPatch) + .expect(400) + .expect((res) => { + expect(res.body.details).toHaveLength(1); + expect(res.body.details[0].message).toMatch( + /.*weight\" must be less than or equal to 1000/, + ); + }); +}); + +test('PATCHING with all variable weightTypes forces weights to sum to no less than 1000 minus the number of variable variants', async () => { + const featureName = 'variants-validation-with-all-variable-weights'; + await db.stores.featureToggleStore.create('default', { + name: featureName, + }); + + const newVariants: IVariant[] = []; + + const observer = jsonpatch.observe(newVariants); + newVariants.push({ + name: 'variant1', + stickiness: 'default', + weight: 700, + weightType: WeightType.VARIABLE, + }); + let patch = jsonpatch.generate(observer); + + await app.request + .patch(`/api/admin/projects/default/features/${featureName}/variants`) + .send(patch) + .expect(200) + .expect((res) => { + expect(res.body.variants).toHaveLength(1); + expect(res.body.variants[0].weight).toEqual(1000); + }); + + newVariants.push({ + name: 'variant2', + stickiness: 'default', + weight: 700, + weightType: WeightType.VARIABLE, + }); + + patch = jsonpatch.generate(observer); + + await app.request + .patch(`/api/admin/projects/default/features/${featureName}/variants`) + .send(patch) + .expect(200) + .expect((res) => { + expect(res.body.variants).toHaveLength(2); + expect( + res.body.variants.every((x) => x.weight === 500), + ).toBeTruthy(); + }); + + newVariants.push({ + name: 'variant3', + stickiness: 'default', + weight: 700, + weightType: WeightType.VARIABLE, + }); + + patch = jsonpatch.generate(observer); + + await app.request + .patch(`/api/admin/projects/default/features/${featureName}/variants`) + .send(patch) + .expect(200) + .expect((res) => { + res.body.variants.sort((v, other) => other.weight - v.weight); + expect(res.body.variants).toHaveLength(3); + expect(res.body.variants[0].weight).toBe(334); + expect(res.body.variants[1].weight).toBe(333); + expect(res.body.variants[2].weight).toBe(333); + }); + + newVariants.push({ + name: 'variant4', + stickiness: 'default', + weight: 700, + weightType: WeightType.VARIABLE, + }); + + patch = jsonpatch.generate(observer); + + await app.request + .patch(`/api/admin/projects/default/features/${featureName}/variants`) + .send(patch) + .expect(200) + .expect((res) => { + expect(res.body.variants).toHaveLength(4); + expect( + res.body.variants.every((x) => x.weight === 250), + ).toBeTruthy(); + }); +}); + +test('PATCHING with no variable variants fails with 400', async () => { + const featureName = 'variants-validation-with-no-variable-weights'; + await db.stores.featureToggleStore.create('default', { + name: featureName, + }); + + const newVariants: IVariant[] = []; + + const observer = jsonpatch.observe(newVariants); + newVariants.push({ + name: 'variant1', + stickiness: 'default', + weight: 900, + weightType: WeightType.FIX, + }); + + const patch = jsonpatch.generate(observer); + await app.request + .patch(`/api/admin/projects/default/features/${featureName}/variants`) + .send(patch) + .expect(400) + .expect((res) => { + expect(res.body.details).toHaveLength(1); + expect(res.body.details[0].message).toEqual( + 'There must be at least one "variable" variant', + ); + }); +}); + +test('Patching with a fixed variant and variable variants splits remaining weight among variable variants', async () => { + const featureName = 'variants-fixed-and-variable'; + await db.stores.featureToggleStore.create('default', { + name: featureName, + }); + + const newVariants: IVariant[] = []; + const observer = jsonpatch.observe(newVariants); + newVariants.push({ + name: 'variant1', + stickiness: 'default', + weight: 900, + weightType: WeightType.FIX, + }); + newVariants.push({ + name: 'variant2', + stickiness: 'default', + weight: 20, + weightType: WeightType.VARIABLE, + }); + newVariants.push({ + name: 'variant3', + stickiness: 'default', + weight: 123, + weightType: WeightType.VARIABLE, + }); + newVariants.push({ + name: 'variant4', + stickiness: 'default', + weight: 123, + weightType: WeightType.VARIABLE, + }); + newVariants.push({ + name: 'variant5', + stickiness: 'default', + weight: 123, + weightType: WeightType.VARIABLE, + }); + newVariants.push({ + name: 'variant6', + stickiness: 'default', + weight: 123, + weightType: WeightType.VARIABLE, + }); + newVariants.push({ + name: 'variant7', + stickiness: 'default', + weight: 123, + weightType: WeightType.VARIABLE, + }); + + const patch = jsonpatch.generate(observer); + await app.request + .patch(`/api/admin/projects/default/features/${featureName}/variants`) + .send(patch) + .expect(200); + + await app.request + .get(`/api/admin/projects/default/features/${featureName}/variants`) + .expect(200) + .expect((res) => { + let body = res.body; + expect(body.variants).toHaveLength(7); + expect( + body.variants.reduce((total, v) => total + v.weight, 0), + ).toEqual(1000); + body.variants.sort((a, b) => b.weight - a.weight); + expect( + body.variants.find((v) => v.name === 'variant1').weight, + ).toEqual(900); + expect( + body.variants.find((v) => v.name === 'variant2').weight, + ).toEqual(17); + expect( + body.variants.find((v) => v.name === 'variant3').weight, + ).toEqual(17); + expect( + body.variants.find((v) => v.name === 'variant4').weight, + ).toEqual(17); + expect( + body.variants.find((v) => v.name === 'variant5').weight, + ).toEqual(17); + expect( + body.variants.find((v) => v.name === 'variant6').weight, + ).toEqual(16); + expect( + body.variants.find((v) => v.name === 'variant7').weight, + ).toEqual(16); + }); +}); + +test('Multiple fixed variants gets added together to decide how much weight variable variants should get', async () => { + const featureName = 'variants-multiple-fixed-and-variable'; + await db.stores.featureToggleStore.create('default', { + name: featureName, + }); + + const newVariants: IVariant[] = []; + + const observer = jsonpatch.observe(newVariants); + newVariants.push({ + name: 'variant1', + stickiness: 'default', + weight: 600, + weightType: WeightType.FIX, + }); + newVariants.push({ + name: 'variant2', + stickiness: 'default', + weight: 350, + weightType: WeightType.FIX, + }); + newVariants.push({ + name: 'variant3', + stickiness: 'default', + weight: 350, + weightType: WeightType.VARIABLE, + }); + + const patch = jsonpatch.generate(observer); + await app.request + .patch(`/api/admin/projects/default/features/${featureName}/variants`) + .send(patch) + .expect(200); + await app.request + .get(`/api/admin/projects/default/features/${featureName}/variants`) + .expect(200) + .expect((res) => { + let body = res.body; + expect(body.variants).toHaveLength(3); + expect( + body.variants.find((v) => v.name === 'variant3').weight, + ).toEqual(50); + }); +}); + +test('If sum of fixed variant weight exceed 1000 fails with 400', async () => { + const featureName = 'variants-fixed-weight-over-1000'; + await db.stores.featureToggleStore.create('default', { + name: featureName, + }); + + const newVariants: IVariant[] = []; + + const observer = jsonpatch.observe(newVariants); + newVariants.push({ + name: 'variant1', + stickiness: 'default', + weight: 900, + weightType: WeightType.FIX, + }); + newVariants.push({ + name: 'variant2', + stickiness: 'default', + weight: 900, + weightType: WeightType.FIX, + }); + newVariants.push({ + name: 'variant3', + stickiness: 'default', + weight: 350, + weightType: WeightType.VARIABLE, + }); + + const patch = jsonpatch.generate(observer); + await app.request + .patch(`/api/admin/projects/default/features/${featureName}/variants`) + .send(patch) + .expect(400) + .expect((res) => { + expect(res.body.details).toHaveLength(1); + expect(res.body.details[0].message).toEqual( + 'The traffic distribution total must equal 100%', + ); + }); +}); + +test('If sum of fixed variant weight equals 1000 variable variants gets weight 0', async () => { + const featureName = 'variants-fixed-weight-equals-1000-no-variable-weight'; + await db.stores.featureToggleStore.create('default', { + name: featureName, + }); + + const newVariants: IVariant[] = []; + + const observer = jsonpatch.observe(newVariants); + newVariants.push({ + name: 'variant1', + stickiness: 'default', + weight: 900, + weightType: WeightType.FIX, + }); + newVariants.push({ + name: 'variant2', + stickiness: 'default', + weight: 100, + weightType: WeightType.FIX, + }); + newVariants.push({ + name: 'variant3', + stickiness: 'default', + weight: 350, + weightType: WeightType.VARIABLE, + }); + newVariants.push({ + name: 'variant4', + stickiness: 'default', + weight: 350, + weightType: WeightType.VARIABLE, + }); + + const patch = jsonpatch.generate(observer); + await app.request + .patch(`/api/admin/projects/default/features/${featureName}/variants`) + .send(patch) + .expect(200); + await app.request + .get(`/api/admin/projects/default/features/${featureName}/variants`) + .expect(200) + .expect((res) => { + let body = res.body; + expect(body.variants).toHaveLength(4); + expect( + body.variants.find((v) => v.name === 'variant3').weight, + ).toEqual(0); + expect( + body.variants.find((v) => v.name === 'variant4').weight, + ).toEqual(0); + }); +}); diff --git a/src/test/fixtures/fake-feature-toggle-store.ts b/src/test/fixtures/fake-feature-toggle-store.ts index 9b3926e09e..143168314c 100644 --- a/src/test/fixtures/fake-feature-toggle-store.ts +++ b/src/test/fixtures/fake-feature-toggle-store.ts @@ -2,7 +2,11 @@ import { IFeatureToggleQuery, IFeatureToggleStore, } from '../../lib/types/stores/feature-toggle-store'; -import { FeatureToggle, FeatureToggleDTO } from '../../lib/types/model'; +import { + FeatureToggle, + FeatureToggleDTO, + IVariant, +} from '../../lib/types/model'; import NotFoundError from '../../lib/error/notfound-error'; export default class FakeFeatureToggleStore implements IFeatureToggleStore { @@ -123,4 +127,18 @@ export default class FakeFeatureToggleStore implements IFeatureToggleStore { } }); } + + async getVariants(featureName: string): Promise { + const feature = await this.get(featureName); + return feature.variants; + } + + async saveVariants( + featureName: string, + newVariants: IVariant[], + ): Promise { + const feature = await this.get(featureName); + feature.variants = newVariants; + return feature; + } } diff --git a/website/docs/api/admin/feature-toggles-api-v2.md b/website/docs/api/admin/feature-toggles-api-v2.md index 41cdfcd855..3785a6a027 100644 --- a/website/docs/api/admin/feature-toggles-api-v2.md +++ b/website/docs/api/admin/feature-toggles-api-v2.md @@ -9,7 +9,7 @@ title: /api/admin/projects/:projectId In this document we will guide you on how you can work with feature toggles and their configuration. Please remember the following details: - All feature toggles exists _inside a project_. -- A feature toggles exists _across all environments_. +- A feature toggle exists _across all environments_. - A feature toggle can take different configuration, activation strategies, per environment. TODO: Need to explain the following in a bit more details: @@ -505,4 +505,99 @@ Transfer-Encoding: chunked Possible Errors: -- _409 Conflict_ - You can not enable the environment before it has strategies. \ No newline at end of file +- _409 Conflict_ - You can not enable the environment before it has strategies. + +## Feature Variants + +### Put variants for Feature Toggle {#update-variants} + +This overwrites the current variants for the feature toggle specified in the :featureName parameter. +The backend will validate the input for the following invariants + +* If there are variants, there needs to be at least one variant with `weightType: variable` +* The sum of the weights of variants with `weightType: fix` must be below 1000 (< 1000) + +The backend will also distribute remaining weight up to 1000 after adding the variants with `weightType: fix` together amongst the variants of `weightType: variable` + +**Example Query** +```bash +echo '[ + { + "name": "variant1", + "weightType": "fix", + "weight": 650 + }, + { + "name": "variant2", + "weightType": "variable", + "weight": 123 + } +]' | \ +http PUT http://localhost:4242/api/admin/projects/default/features/demo/variants Authorization:$KEY +``` + +**Example response:** + +```sh +HTTP/1.1 200 OK +Access-Control-Allow-Origin: * +Connection: keep-alive +Date: Tue, 23 Nov 2021 08:46:32 GMT +Keep-Alive: timeout=60 +Transfer-Encoding: chunked +Content-Type: application/json; charset=utf-8 + +{ + "version": "1", + "variants": [ + { + "name": "variant2", + "weightType": "variable", + "weight": 350 + }, + { + "name": "variant1", + "weightType": "fix", + "weight": 650 + } + ] +} +``` + +### PATCH variants for a feature toggle + +**Example Query** + +```sh +echo '[{"op": "add", "path": "/1", "value": { + "name": "new-variant", + "weightType": "fix", + "weight": 200 +}}]' | \ +http PATCH http://localhost:4242/api/admin/projects/default/features/demo/variants Authorization:$KEY +``` + +** Example Response ** +```json +{ + "version": "1", + "variants": [ + { + "name": "variant2", + "weightType": "variable", + "weight": 150 + }, + { + "name": "new-variant", + "weightType": "fix", + "weight": 200 + }, + { + "name": "variant1", + "weightType": "fix", + "weight": 650 + } + ] +} +``` +