diff --git a/controllers/admin/tiers.controller.js b/controllers/admin/tiers.controller.js index 8e7ea20..f60e3cb 100644 --- a/controllers/admin/tiers.controller.js +++ b/controllers/admin/tiers.controller.js @@ -145,7 +145,7 @@ exports.updatePlan = async (req, res) => { const plan = await mdl_TierPlans.findByPk(req.params.id); if (!plan) return R.error(res, 'Plan not found.', 404); - const allowed = ['label', 'description', 'features', 'price', 'currency', 'is_active', 'status', 'tier_category_id']; + const allowed = ['label', 'description', 'features', 'price', 'currency', 'is_active', 'is_recommended', 'status', 'tier_category_id']; const updates = {}; for (const k of allowed) { if (req.body[k] !== undefined) updates[k] = req.body[k]; diff --git a/controllers/client/tiers.controller.js b/controllers/client/tiers.controller.js index ad832de..a92c7b5 100644 --- a/controllers/client/tiers.controller.js +++ b/controllers/client/tiers.controller.js @@ -153,7 +153,7 @@ exports.getPlans = async (req, res) => { const plans = await mdl_TierPlans.findAll({ where: { status: 'published' }, order: [['tier', 'ASC'], ['duration_days', 'ASC']], - attributes: ['plan_id', 'tier', 'label', 'description', 'features', 'duration_days', 'duration_unit', 'price', 'currency', 'is_active'], + attributes: ['plan_id', 'tier', 'label', 'description', 'features', 'duration_days', 'duration_unit', 'price', 'currency', 'is_active', 'is_recommended'], include: [ { model: Course, diff --git a/database/migrations/20270101000093-add-tier-plans-is-recommended.js b/database/migrations/20270101000093-add-tier-plans-is-recommended.js new file mode 100644 index 0000000..e44ad5f --- /dev/null +++ b/database/migrations/20270101000093-add-tier-plans-is-recommended.js @@ -0,0 +1,15 @@ +'use strict'; + +module.exports = { + async up(queryInterface, Sequelize) { + await queryInterface.addColumn('tier_plans', 'is_recommended', { + type: Sequelize.BOOLEAN, + allowNull: false, + defaultValue: false, + }); + }, + + async down(queryInterface) { + await queryInterface.removeColumn('tier_plans', 'is_recommended'); + }, +}; diff --git a/models/tiers/tier_plans.mdl.js b/models/tiers/tier_plans.mdl.js index 7c59543..7092eb0 100644 --- a/models/tiers/tier_plans.mdl.js +++ b/models/tiers/tier_plans.mdl.js @@ -21,6 +21,7 @@ const mdl_TierPlans = sequelize.define('TierPlan', { price: { type: DataTypes.DECIMAL(10, 2), allowNull: false, label: 'Price' }, currency: { type: DataTypes.CHAR(3), allowNull: false, defaultValue: 'USD', label: 'Currency' }, is_active: { type: DataTypes.BOOLEAN, allowNull: false, defaultValue: true, label: 'Active' }, + is_recommended: { type: DataTypes.BOOLEAN, allowNull: false, defaultValue: false, label: 'Recommended', comment: 'Highlights this plan with the "Recommended for you" banner on the client Plans page.' }, status: { type: DataTypes.ENUM('draft', 'published'), allowNull: false, defaultValue: 'draft', label: 'Status', hidden: false, filterable: true }, createdBy: { type: DataTypes.BIGINT, allowNull: true }, updatedBy: { type: DataTypes.BIGINT, allowNull: true },