Skip to content

Commit

Permalink
fix: ensure that param values from /api/admin/features are strings (#…
Browse files Browse the repository at this point in the history
…1761)

* refactor: improve parameter value string casting

* fix: ensure that param values from /api/admin/features are strings
  • Loading branch information
olav authored and sighphyre committed Jun 29, 2022
1 parent 95b3f34 commit 97d6b3d
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 11 deletions.
13 changes: 3 additions & 10 deletions src/lib/db/feature-strategy-store.ts
Expand Up @@ -15,6 +15,8 @@ import {
} from '../types/model';
import { IFeatureStrategiesStore } from '../types/stores/feature-strategies-store';
import { PartialSome } from '../types/partial';
import { ensureStringValue } from '../util/ensureStringValue';
import { mapValues } from '../util/map-values';

const COLUMNS = [
'id',
Expand Down Expand Up @@ -53,23 +55,14 @@ interface IFeatureStrategiesTable {
created_at?: Date;
}

function ensureStringValues(data: object): { [key: string]: string } {
const stringEntries = Object.entries(data).map(([key, value]) => [
key,
String(value),
]);

return Object.fromEntries(stringEntries);
}

function mapRow(row: IFeatureStrategiesTable): IFeatureStrategy {
return {
id: row.id,
featureName: row.feature_name,
projectId: row.project_name,
environment: row.environment,
strategyName: row.strategy_name,
parameters: ensureStringValues(row.parameters),
parameters: mapValues(row.parameters || {}, ensureStringValue),
constraints: (row.constraints as unknown as IConstraint[]) || [],
createdAt: row.created_at,
sortOrder: row.sort_order,
Expand Down
4 changes: 3 additions & 1 deletion src/lib/db/feature-toggle-client-store.ts
Expand Up @@ -11,6 +11,8 @@ import { IFeatureToggleClientStore } from '../types/stores/feature-toggle-client
import { DEFAULT_ENV } from '../util/constants';
import { PartialDeep } from '../types/partial';
import EventEmitter from 'events';
import { ensureStringValue } from '../util/ensureStringValue';
import { mapValues } from '../util/map-values';

export interface FeaturesTable {
name: string;
Expand Down Expand Up @@ -180,7 +182,7 @@ export default class FeatureToggleClientStore
id: row.strategy_id,
name: row.strategy_name,
constraints: row.constraints || [],
parameters: row.parameters,
parameters: mapValues(row.parameters || {}, ensureStringValue),
};
}

Expand Down
16 changes: 16 additions & 0 deletions src/lib/util/ensureStringValue.test.ts
@@ -0,0 +1,16 @@
import { ensureStringValue } from './ensureStringValue';

test('ensureStringValue', () => {
expect(ensureStringValue(null)).toEqual('');
expect(ensureStringValue(undefined)).toEqual('');
expect(ensureStringValue('null')).toEqual('null');
expect(ensureStringValue('undefined')).toEqual('undefined');

expect(ensureStringValue('')).toEqual('');
expect(ensureStringValue('a')).toEqual('a');
expect(ensureStringValue(0)).toEqual('0');
expect(ensureStringValue(true)).toEqual('true');

expect(ensureStringValue({})).toEqual('{}');
expect(ensureStringValue({ b: 1 })).toEqual('{"b":1}');
});
13 changes: 13 additions & 0 deletions src/lib/util/ensureStringValue.ts
@@ -0,0 +1,13 @@
import { isDefined } from './isDefined';

export function ensureStringValue(value: unknown): string {
if (!isDefined(value)) {
return '';
}

if (typeof value === 'object') {
return JSON.stringify(value);
}

return String(value);
}

0 comments on commit 97d6b3d

Please sign in to comment.