UNPKG

unleash-server

Version:

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

208 lines • 10.5 kB
import Controller from '../../routes/controller.js'; import { NONE, serializeDates, } from '../../types/index.js'; import ProjectFeaturesController from '../feature-toggle/feature-toggle-controller.js'; import ProjectEnvironmentsController from '../project-environments/project-environments-controller.js'; import ProjectHealthReport from '../../routes/admin-api/project/health-report.js'; import VariantsController from '../../routes/admin-api/project/variants.js'; import { createResponseSchema, outdatedSdksSchema, projectDoraMetricsSchema, projectOverviewSchema, projectsSchema, } from '../../openapi/index.js'; import { getStandardResponses } from '../../openapi/util/standard-responses.js'; import { ProjectApiTokenController } from '../../routes/admin-api/project/api-token.js'; import ProjectArchiveController from '../../routes/admin-api/project/project-archive.js'; import DependentFeaturesController from '../dependent-features/dependent-features-controller.js'; import { projectApplicationsSchema, } from '../../openapi/spec/project-applications-schema.js'; import { projectApplicationsQueryParameters } from '../../openapi/spec/project-applications-query-parameters.js'; import { normalizeQueryParams } from '../feature-search/search-utils.js'; import ProjectInsightsController from '../project-insights/project-insights-controller.js'; import FeatureLifecycleController from '../feature-lifecycle/feature-lifecycle-controller.js'; import { projectFlagCreatorsSchema, } from '../../openapi/spec/project-flag-creators-schema.js'; import ProjectStatusController from '../project-status/project-status-controller.js'; import FeatureLinkController from '../feature-links/feature-link-controller.js'; export default class ProjectController extends Controller { constructor(config, services, _db) { super(config); this.projectService = services.projectService; this.clientInstanceService = services.clientInstanceService; this.openApiService = services.openApiService; this.flagResolver = config.flagResolver; this.route({ path: '', method: 'get', handler: this.getProjects, permission: NONE, middleware: [ this.openApiService.validPath({ tags: ['Projects'], operationId: 'getProjects', summary: 'Get a list of all projects.', description: 'This endpoint returns an list of all the projects in the Unleash instance.', parameters: [ { name: 'archived', in: 'query', required: false, schema: { type: 'boolean', }, }, ], responses: { 200: createResponseSchema('projectsSchema'), ...getStandardResponses(401, 403), }, }), ], }); this.route({ method: 'get', path: '/:projectId/overview', handler: this.getProjectOverview, permission: NONE, middleware: [ this.openApiService.validPath({ tags: ['Projects'], operationId: 'getProjectOverview', summary: 'Get an overview of a project.', description: 'This endpoint returns an overview of the specified projects stats, project health, number of members, which environments are configured, and the features types in the project.', responses: { 200: createResponseSchema('projectOverviewSchema'), ...getStandardResponses(401, 403, 404), }, }), ], }); /** @deprecated use project insights instead */ this.route({ method: 'get', path: '/:projectId/dora', handler: this.getProjectDora, permission: NONE, middleware: [ this.openApiService.validPath({ deprecated: true, tags: ['Projects'], operationId: 'getProjectDora', summary: 'Get an overview project dora metrics.', description: 'This endpoint returns an overview of the specified dora metrics', responses: { 200: createResponseSchema('projectDoraMetricsSchema'), ...getStandardResponses(401, 403, 404), }, }), ], }); this.route({ method: 'get', path: '/:projectId/applications', handler: this.getProjectApplications, permission: NONE, middleware: [ this.openApiService.validPath({ tags: ['Projects'], operationId: 'getProjectApplications', summary: 'Get a list of all applications for a project.', description: 'This endpoint returns an list of all the applications for a project.', parameters: [...projectApplicationsQueryParameters], responses: { 200: createResponseSchema('projectApplicationsSchema'), ...getStandardResponses(401, 403, 404), }, }), ], }); this.route({ method: 'get', path: '/:projectId/flag-creators', handler: this.getProjectFlagCreators, permission: NONE, middleware: [ this.openApiService.validPath({ tags: ['Projects'], operationId: 'getProjectFlagCreators', summary: 'Get a list of all flag creators for a project.', description: 'This endpoint returns every user who created a flag in the project.', responses: { 200: createResponseSchema('projectFlagCreatorsSchema'), ...getStandardResponses(401, 403, 404), }, }), ], }); this.route({ method: 'get', path: '/:projectId/sdks/outdated', handler: this.getOutdatedProjectSdks, permission: NONE, middleware: [ this.openApiService.validPath({ tags: ['Projects'], operationId: 'getOutdatedProjectSdks', summary: 'Get outdated project SDKs', description: 'Returns a list of the outdated SDKS with the applications using them.', responses: { 200: createResponseSchema('outdatedSdksSchema'), ...getStandardResponses(404), }, }), ], }); this.use('/', new ProjectFeaturesController(config, services).router); this.use('/', new DependentFeaturesController(config, services).router); this.use('/', new ProjectEnvironmentsController(config, services).router); this.use('/', new ProjectHealthReport(config, services).router); this.use('/', new VariantsController(config, services).router); this.use('/', new ProjectApiTokenController(config, services).router); this.use('/', new ProjectArchiveController(config, services).router); this.use('/', new ProjectInsightsController(config, services).router); this.use('/', new ProjectStatusController(config, services).router); this.use('/', new FeatureLifecycleController(config, services).router); this.use('/', new FeatureLinkController(config, services).router); } async getProjects(req, res) { const { user } = req; const projects = await this.projectService.getProjects({ id: 'default', }, user.id); const projectsWithOwners = await this.projectService.addOwnersToProjects(projects); this.openApiService.respondWithValidation(200, res, projectsSchema.$id, { version: 1, projects: serializeDates(projectsWithOwners) }); } async getProjectOverview(req, res) { const { projectId } = req.params; const { archived } = req.query; const { user } = req; const overview = await this.projectService.getProjectOverview(projectId, archived, user.id); this.openApiService.respondWithValidation(200, res, projectOverviewSchema.$id, serializeDates(overview)); } /** @deprecated use projectInsights instead */ async getProjectDora(req, res) { const { projectId } = req.params; const dora = await this.projectService.getDoraMetrics(projectId); this.openApiService.respondWithValidation(200, res, projectDoraMetricsSchema.$id, dora); } async getProjectApplications(req, res) { const { projectId } = req.params; const { normalizedQuery, normalizedSortOrder, normalizedOffset, normalizedLimit, } = normalizeQueryParams(req.query, { limitDefault: 50, maxLimit: 100, }); const applications = await this.projectService.getApplications({ searchParams: normalizedQuery, project: projectId, offset: normalizedOffset, limit: normalizedLimit, sortBy: req.query.sortBy, sortOrder: normalizedSortOrder, }); this.openApiService.respondWithValidation(200, res, projectApplicationsSchema.$id, serializeDates(applications)); } async getProjectFlagCreators(req, res) { const { projectId } = req.params; const flagCreators = await this.projectService.getProjectFlagCreators(projectId); this.openApiService.respondWithValidation(200, res, projectFlagCreatorsSchema.$id, serializeDates(flagCreators)); } async getOutdatedProjectSdks(req, res) { const { projectId } = req.params; const outdatedSdks = await this.clientInstanceService.getOutdatedSdksByProject(projectId); this.openApiService.respondWithValidation(200, res, outdatedSdksSchema.$id, { sdks: outdatedSdks }); } } //# sourceMappingURL=project-controller.js.map