UNPKG

unleash-server

Version:

Unleash is an enterprise ready feature flag service. It provides different strategies for handling feature flags.

91 lines 3.79 kB
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