UNPKG

@sourceloop/ctrl-plane-subscription-service

Version:

Subscription management microservice for SaaS control plane.

198 lines 7.97 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PlanFeaturesController = void 0; const tslib_1 = require("tslib"); const loopback4_authorization_1 = require("loopback4-authorization"); const permissions_1 = require("../permissions"); const loopback4_authentication_1 = require("loopback4-authentication"); const rest_1 = require("@loopback/rest"); const core_1 = require("@sourceloop/core"); const models_1 = require("../models"); const feature_toggle_service_1 = require("@sourceloop/feature-toggle-service"); const repository_1 = require("@loopback/repository"); const repositories_1 = require("../repositories"); const basePath = 'plans/{id}/features'; let PlanFeaturesController = class PlanFeaturesController { constructor(planRepository, featureValuesRepository, featureRepository) { this.planRepository = planRepository; this.featureValuesRepository = featureValuesRepository; this.featureRepository = featureRepository; } async getPlanFeatures(id) { const plan = await this.planRepository.findById(id, { fields: ['id', 'name', 'tier', 'size'], }); const allFeatures = await this.featureRepository.find({ fields: [ 'id', 'key', 'name', 'description', 'type', 'defaultValue', 'metadata', ], }); const features = []; const featureValuesThePlanHas = await this.featureValuesRepository.find({ where: { strategyEntityId: id, }, fields: [ 'id', 'featureKey', 'value', 'status', 'strategyEntityId', 'strategyKey', ], }); for (const featDefinition of allFeatures) { features.push({ ...featDefinition, value: featureValuesThePlanHas.find(e => e.featureKey === featDefinition.id), }); } return { ...plan, features: features, }; } async setPlanFeatures(id, featureValues) { const values = featureValues.map(e => { e.strategyEntityId = id; e.strategyKey = 'Plan'; return e; }); return this.featureValuesRepository.createAll(values); } async updatePlanFeatures(id, featureValues) { const updatedFeatures = []; for (const featureValue of featureValues) { if (!featureValue.id) { throw new Error('Feature value ID is required for update'); } // Ensure the feature value belongs to the specified plan const existingFeatureValue = await this.featureValuesRepository.findOne({ where: { id: featureValue.id, strategyEntityId: id, strategyKey: 'Plan', }, }); if (!existingFeatureValue) { throw new Error(`Feature value with ID ${featureValue.id} not found for this plan`); } // Update the feature value await this.featureValuesRepository.updateById(featureValue.id, featureValue); // Fetch the updated feature value const updatedFeatureValue = await this.featureValuesRepository.findById(featureValue.id); updatedFeatures.push(updatedFeatureValue); } return updatedFeatures; } }; exports.PlanFeaturesController = PlanFeaturesController; tslib_1.__decorate([ (0, loopback4_authorization_1.authorize)({ permissions: [permissions_1.PermissionKey.ViewPlanFeatures], }), (0, loopback4_authentication_1.authenticate)("bearer" /* STRATEGY.BEARER */, { passReqToCallback: true, }), (0, rest_1.get)(basePath, { security: core_1.OPERATION_SECURITY_SPEC, responses: { [200 /* STATUS_CODE.OK */]: { description: 'Plan Features Retrieved', content: { 'application/json': { schema: { ...(0, rest_1.getModelSchemaRef)(models_1.Plan), ...(0, rest_1.getModelSchemaRef)(feature_toggle_service_1.FeatureValues), }, }, }, }, }, }), tslib_1.__param(0, rest_1.param.path.string('id')), tslib_1.__metadata("design:type", Function), tslib_1.__metadata("design:paramtypes", [String]), tslib_1.__metadata("design:returntype", Promise) ], PlanFeaturesController.prototype, "getPlanFeatures", null); tslib_1.__decorate([ (0, loopback4_authorization_1.authorize)({ permissions: [permissions_1.PermissionKey.AddPlanFeatures], }), (0, loopback4_authentication_1.authenticate)("bearer" /* STRATEGY.BEARER */, { passReqToCallback: true, }), (0, rest_1.post)(basePath, { security: core_1.OPERATION_SECURITY_SPEC, responses: { [200 /* STATUS_CODE.OK */]: { description: 'Plan Features Created', content: { 'application/json': { schema: { ...(0, rest_1.getModelSchemaRef)(feature_toggle_service_1.FeatureValues), }, }, }, }, }, }), tslib_1.__param(0, rest_1.param.path.string('id')), tslib_1.__param(1, (0, rest_1.requestBody)()), tslib_1.__metadata("design:type", Function), tslib_1.__metadata("design:paramtypes", [String, Array]), tslib_1.__metadata("design:returntype", Promise) ], PlanFeaturesController.prototype, "setPlanFeatures", null); tslib_1.__decorate([ (0, loopback4_authorization_1.authorize)({ permissions: [permissions_1.PermissionKey.UpdatePlanFeatures], }), (0, loopback4_authentication_1.authenticate)("bearer" /* STRATEGY.BEARER */, { passReqToCallback: true, }), (0, rest_1.patch)(basePath, { security: core_1.OPERATION_SECURITY_SPEC, responses: { [200 /* STATUS_CODE.OK */]: { description: 'Plan Features Updated', content: { 'application/json': { schema: { type: 'array', items: (0, rest_1.getModelSchemaRef)(feature_toggle_service_1.FeatureValues), }, }, }, }, }, }), tslib_1.__param(0, rest_1.param.path.string('id')), tslib_1.__param(1, (0, rest_1.requestBody)({ content: { 'application/json': { schema: { type: 'array', items: (0, rest_1.getModelSchemaRef)(feature_toggle_service_1.FeatureValues, { partial: true }), }, }, }, })), tslib_1.__metadata("design:type", Function), tslib_1.__metadata("design:paramtypes", [String, Array]), tslib_1.__metadata("design:returntype", Promise) ], PlanFeaturesController.prototype, "updatePlanFeatures", null); exports.PlanFeaturesController = PlanFeaturesController = tslib_1.__decorate([ tslib_1.__param(0, (0, repository_1.repository)(repositories_1.PlanRepository)), tslib_1.__param(1, (0, repository_1.repository)(feature_toggle_service_1.FeatureValuesRepository)), tslib_1.__param(2, (0, repository_1.repository)(feature_toggle_service_1.FeatureRepository)), tslib_1.__metadata("design:paramtypes", [repositories_1.PlanRepository, feature_toggle_service_1.FeatureValuesRepository, feature_toggle_service_1.FeatureRepository]) ], PlanFeaturesController); //# sourceMappingURL=plan-features.controller.js.map