unleash-server
Version:
Unleash is an enterprise ready feature flag service. It provides different strategies for handling feature flags.
91 lines • 3.79 kB
JavaScript
import Controller from '../../routes/controller.js';
import { NONE, serializeDates, } from '../../types/index.js';
import { createResponseSchema, getStandardResponses, searchFeaturesSchema, } from '../../openapi/index.js';
import { featureSearchQueryParameters, } from '../../openapi/spec/feature-search-query-parameters.js';
import { normalizeQueryParams } from './search-utils.js';
import { anonymise } from '../../util/index.js';
export default class FeatureSearchController extends Controller {
constructor(config, { openApiService, featureSearchService }) {
super(config);
this.openApiService = openApiService;
this.flagResolver = config.flagResolver;
this.featureSearchService = featureSearchService;
this.logger = config.getLogger('/feature-search/feature-search-controller.ts');
this.route({
method: 'get',
path: '',
handler: this.searchFeatures,
permission: NONE,
middleware: [
openApiService.validPath({
tags: ['Search'],
summary: 'Search and filter features',
description: 'Search and filter by selected fields.',
operationId: 'searchFeatures',
// top level array needs to be mutable according to openapi library
parameters: [...featureSearchQueryParameters],
responses: {
200: createResponseSchema('searchFeaturesSchema'),
...getStandardResponses(401, 403, 404),
},
}),
],
});
}
maybeAnonymise(features) {
if (this.flagResolver.isEnabled('anonymiseEventLog')) {
return features.map((feature) => ({
...feature,
createdBy: {
...feature.createdBy,
name: anonymise(feature.createdBy.name),
},
}));
}
return features;
}
async searchFeatures(req, res) {
const { query, project, type, tag, segment, createdAt, createdBy, state, status, lifecycle, favoritesFirst, archived, sortBy, lastSeenAt, } = req.query;
const userId = req.user.id;
const { normalizedQuery, normalizedSortOrder, normalizedOffset, normalizedLimit, } = normalizeQueryParams({
query,
offset: req.query.offset,
limit: req.query.limit,
sortOrder: req.query.sortOrder,
}, {
limitDefault: 50,
maxLimit: 100,
});
const normalizedStatus = status
?.map((tag) => tag.split(':'))
.filter((tag) => tag.length === 2 &&
['enabled', 'disabled'].includes(tag[1]));
const normalizedFavoritesFirst = favoritesFirst === 'true';
const normalizedArchived = archived === 'IS:true';
const { features, total } = await this.featureSearchService.search({
searchParams: normalizedQuery,
project,
type,
userId,
tag,
segment,
state,
createdAt,
createdBy,
sortBy,
lifecycle,
lastSeenAt,
status: normalizedStatus,
offset: normalizedOffset,
limit: normalizedLimit,
sortOrder: normalizedSortOrder,
favoritesFirst: normalizedFavoritesFirst,
archived: normalizedArchived,
});
this.openApiService.respondWithValidation(200, res, searchFeaturesSchema.$id, serializeDates({
features: this.maybeAnonymise(features),
total,
}));
}
}
//# sourceMappingURL=feature-search-controller.js.map