1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-03-09 00:18:26 +01:00
unleash.unleash/src/lib/features/feature-search/feature-search-controller.ts

95 lines
3.1 KiB
TypeScript
Raw Normal View History

2023-10-25 10:50:59 +02:00
import { Response } from 'express';
import Controller from '../../routes/controller';
import { FeatureSearchService, OpenApiService } from '../../services';
2023-10-25 10:50:59 +02:00
import {
IFlagResolver,
2023-10-26 17:20:57 +02:00
ITag,
2023-10-25 10:50:59 +02:00
IUnleashConfig,
IUnleashServices,
NONE,
} from '../../types';
import { Logger } from '../../logger';
import { createResponseSchema, getStandardResponses } from '../../openapi';
import { IAuthRequest } from '../../routes/unleash-types';
import { InvalidOperationError } from '../../error';
import {
FeatureSearchQueryParameters,
featureSearchQueryParameters,
} from '../../openapi/spec/feature-search-query-parameters';
2023-10-25 10:50:59 +02:00
const PATH = '/features';
type FeatureSearchServices = Pick<
IUnleashServices,
'openApiService' | 'featureSearchService'
>;
2023-10-25 10:50:59 +02:00
export default class FeatureSearchController extends Controller {
private openApiService: OpenApiService;
private flagResolver: IFlagResolver;
private featureSearchService: FeatureSearchService;
2023-10-25 10:50:59 +02:00
private readonly logger: Logger;
constructor(
config: IUnleashConfig,
{ openApiService, featureSearchService }: FeatureSearchServices,
2023-10-25 10:50:59 +02:00
) {
super(config);
this.openApiService = openApiService;
this.flagResolver = config.flagResolver;
this.featureSearchService = featureSearchService;
2023-10-25 10:50:59 +02:00
this.logger = config.getLogger(
'/feature-search/feature-search-controller.ts',
);
this.route({
method: 'get',
path: 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',
2023-10-26 10:05:47 +02:00
// top level array needs to be mutable according to openapi library
parameters: [...featureSearchQueryParameters],
2023-10-25 10:50:59 +02:00
responses: {
200: createResponseSchema('searchFeaturesSchema'),
...getStandardResponses(401, 403, 404),
},
}),
],
});
}
async searchFeatures(
req: IAuthRequest<any, any, any, FeatureSearchQueryParameters>,
2023-10-25 10:50:59 +02:00
res: Response,
): Promise<void> {
if (this.config.flagResolver.isEnabled('featureSearchAPI')) {
2023-10-26 17:20:57 +02:00
const { query, projectId, type, tag } = req.query;
2023-10-26 15:29:30 +02:00
const userId = req.user.id;
2023-10-26 17:20:57 +02:00
const normalizedTag = tag
?.map((tag) => tag.split(':'))
.filter((tag) => tag.length === 2);
const features = await this.featureSearchService.search({
query,
projectId,
2023-10-26 15:29:30 +02:00
type,
userId,
2023-10-26 17:20:57 +02:00
tag: normalizedTag,
});
res.json({ features });
2023-10-25 10:50:59 +02:00
} else {
throw new InvalidOperationError(
'Feature Search API is not enabled',
);
}
}
}