assets and tier plans revamp

Signed-off-by: Kenneth Obsequio <k80308392@gmail.com>
This commit is contained in:
2026-08-01 17:44:25 +08:00
parent 39c3c4566b
commit cae958b5d5
41 changed files with 1271 additions and 165 deletions
+24
View File
@@ -0,0 +1,24 @@
/***********************************************************************************************************************************************************************
* File Name: plan_lessons.mdl.js
* Type of Program: Model
* Description: Junction table — links standalone Lessons to a specific tier plan.
* UNIQUE on lesson_id enforces one lesson belongs to one plan only.
* Mirrors plan_courses.mdl.js — bundling/display only, not an
* access-control mechanism (see canAccessLesson).
* Author: Kenneth Obsequio (@lash0000)
* Date Created: Aug. 1, 2026
***********************************************************************************************************************************************************************/
const { DataTypes } = require('sequelize');
const sequelize = require('../../config/db.config');
const mdl_PlanLessons = sequelize.define('PlanLesson', {
id: { type: DataTypes.BIGINT, primaryKey: true, autoIncrement: true },
plan_id: { type: DataTypes.BIGINT, allowNull: false },
lesson_id: { type: DataTypes.BIGINT, allowNull: false },
}, {
tableName: 'plan_lessons',
timestamps: true,
paranoid: false,
});
module.exports = mdl_PlanLessons;
+24
View File
@@ -0,0 +1,24 @@
/***********************************************************************************************************************************************************************
* File Name: plan_units.mdl.js
* Type of Program: Model
* Description: Junction table — links standalone Units to a specific tier plan.
* UNIQUE on unit_id enforces one unit belongs to one plan only.
* Mirrors plan_courses.mdl.js — bundling/display only, not an
* access-control mechanism (see canAccessUnit).
* Author: Kenneth Obsequio (@lash0000)
* Date Created: Aug. 1, 2026
***********************************************************************************************************************************************************************/
const { DataTypes } = require('sequelize');
const sequelize = require('../../config/db.config');
const mdl_PlanUnits = sequelize.define('PlanUnit', {
id: { type: DataTypes.BIGINT, primaryKey: true, autoIncrement: true },
plan_id: { type: DataTypes.BIGINT, allowNull: false },
unit_id: { type: DataTypes.BIGINT, allowNull: false },
}, {
tableName: 'plan_units',
timestamps: true,
paranoid: false,
});
module.exports = mdl_PlanUnits;
+42
View File
@@ -4,10 +4,14 @@ const mdl_TierPlans = require('./tier_plans.mdl');
const mdl_UserTiers = require('./user_tiers.mdl');
const mdl_Payments = require('./payments.mdl');
const mdl_PlanCourses = require('./plan_courses.mdl');
const mdl_PlanUnits = require('./plan_units.mdl');
const mdl_PlanLessons = require('./plan_lessons.mdl');
const mdl_PlanPolicies = require('./plan_policies.mdl');
const mdl_SystemBadges = require('../system_badges/system_badges.mdl');
const Asset = require('../assets/assets.mdl');
const { Course } = require('../courses/courses.mdl');
const Unit = require('../courses/units.mdl');
const Lesson = require('../courses/lessons.mdl');
// ─── TierCategory ─────────────────────────────────────────────────────────────
mdl_TierCategories.belongsTo(Asset, { foreignKey: 'badge_asset_id', as: 'badgeAsset' });
@@ -45,6 +49,42 @@ mdl_PlanCourses.belongsTo(Course, { foreignKey: 'course_id', as: 'course'
Course.hasOne(mdl_PlanCourses, { as: 'planCourse', foreignKey: 'course_id' });
mdl_TierPlans.hasMany(mdl_PlanCourses, { as: 'planCourses', foreignKey: 'plan_id' });
// ─── Plan ↔ Units ─────────────────────────────────────────────────────────────
mdl_TierPlans.belongsToMany(Unit, {
through: mdl_PlanUnits,
foreignKey: 'plan_id',
otherKey: 'unit_id',
as: 'units',
});
Unit.belongsToMany(mdl_TierPlans, {
through: mdl_PlanUnits,
foreignKey: 'unit_id',
otherKey: 'plan_id',
as: 'plans',
});
mdl_PlanUnits.belongsTo(mdl_TierPlans, { foreignKey: 'plan_id', as: 'plan' });
mdl_PlanUnits.belongsTo(Unit, { foreignKey: 'unit_id', as: 'unit' });
Unit.hasOne(mdl_PlanUnits, { as: 'planUnit', foreignKey: 'unit_id' });
mdl_TierPlans.hasMany(mdl_PlanUnits, { as: 'planUnits', foreignKey: 'plan_id' });
// ─── Plan ↔ Lessons ───────────────────────────────────────────────────────────
mdl_TierPlans.belongsToMany(Lesson, {
through: mdl_PlanLessons,
foreignKey: 'plan_id',
otherKey: 'lesson_id',
as: 'lessons',
});
Lesson.belongsToMany(mdl_TierPlans, {
through: mdl_PlanLessons,
foreignKey: 'lesson_id',
otherKey: 'plan_id',
as: 'plans',
});
mdl_PlanLessons.belongsTo(mdl_TierPlans, { foreignKey: 'plan_id', as: 'plan' });
mdl_PlanLessons.belongsTo(Lesson, { foreignKey: 'lesson_id', as: 'lesson' });
Lesson.hasOne(mdl_PlanLessons, { as: 'planLesson', foreignKey: 'lesson_id' });
mdl_TierPlans.hasMany(mdl_PlanLessons, { as: 'planLessons', foreignKey: 'plan_id' });
// ─── UserTier → Plan ──────────────────────────────────────────────────────────
mdl_UserTiers.belongsTo(mdl_TierPlans, { foreignKey: 'plan_id', as: 'plan' });
mdl_TierPlans.hasMany(mdl_UserTiers, { foreignKey: 'plan_id', as: 'userTiers' });
@@ -62,6 +102,8 @@ module.exports = {
mdl_UserTiers,
mdl_Payments,
mdl_PlanCourses,
mdl_PlanUnits,
mdl_PlanLessons,
mdl_PlanPolicies,
mdl_SystemBadges,
};