LMS/E-Learning-Backend-main/app/controllers/video.controller.js
2025-09-01 19:37:35 +05:30

233 lines
11 KiB
JavaScript

const db = require("../models");
const API = require('../helper/API_Response');
const db_helper = require("../helper/db_helper");
const helper = require("../helper/helper");
const { MindMap, StudyMaterial, Practiceque, Practicetest, Video, Flashcard, Domain, Subdomain, Topic, Certificate, Cource } = require("../models");
exports.by_cource = async (req, res) => {
const input = await helper.decryptRequest(req.body.data);
var is_change_certi = false;
const domains = await Domain.findAll({
attributes: ['id', 'domin_name'],
where: {
status: 0,
certi_id: input.c_id
}
});
const cert = await Certificate.findAll({
attributes: ['id', 'certificate_name', 'short_name'],
where: {
status: 0,
id: input.c_id
}
});
var dom = [];
var i = 0;
while (i < domains.length) {
const subdomains = await db.sequelize.query("select id,subdomain_name,domain_number from subdomains where status=0 and d_id=" + domains[i].id + " ORDER BY 1*SUBSTRING_INDEX(domain_number, '.', 1) ASC,1*SUBSTRING_INDEX(domain_number, '.', -1) ASC")
.then(function (data) {
return Array.from(new Set(data[0]));
});
var subdom = [];
var j = 0;
while (j < subdomains.length) {
const all = await db.sequelize.query("select * from videos where status=0 and find_in_set(" + subdomains[j].id + ",sd_id) order by sr_number desc")
.then(function (data) {
return Array.from(new Set(data[0]));
});
if (all.length > 0) {
let vid = [];
for (let v = 0; v < all.length; v++) {
var already = await db_helper.selectByWhere('VideoMindView', { type_id: all[v].id, type: "VIDEO", cohort_id: input.cohort_id, user_id: input.user_id });
vid.push({
"id": all[v].id,
"sd_id": subdomains[j].id,
"d_id": domains[i].id,
"video_link": all[v].video_link,
"transcript_link": all[v].transcript_link,
"video_title": all[v].video_title,
"video_thumbnil": all[v].video_thumbnil,
"type": all[v].type,
"video_type": all[v].video_type,
"duration": all[v].duration,
"video_lesson_link_144p": all[v].video_lesson_link_144p,
"video_lesson_link_240p": all[v].video_lesson_link_240p,
"video_lesson_link_360p": all[v].video_lesson_link_360p,
"video_lesson_link_480p": all[v].video_lesson_link_480p,
"video_lesson_link_720p": all[v].video_lesson_link_720p,
"viewed": already.length > 0 ? (already[0].is_completed == 1 ? true : false) : false,
"view_percent": already.length > 0 ? already[0].view_percent : 0, //all[v].viewed_users.includes(input.user_id),
"chapters": all[v].chapters ? JSON.parse(all[v].chapters) : [],
"is_change_certi": is_change_certi
})
}
subdom.push({ "id": subdomains[j].id, "subdomain_name": subdomains[j].subdomain_name, "domain_number": subdomains[j].domain_number, "Videos": vid });
}
j++;
}
if (subdom.length > 0) {
dom.push({ "id": domains[i].id, "domin_name": domains[i].domin_name, "SubDomains": subdom });
}
i++;
}
let result = { "Certificates": cert, "Domains": dom };
res.status(200).send(API._200(await result));
};
exports.noteadd = async (req, res) => {
const input = await helper.decryptRequest(req.body.data);
const data = await db_helper.selectByWhere('VideoNotes', { 'user_id': input.user_id, 'video_id': input.video_id })
if (data.length > 0) {
input["id"] = data[0].id;
res.status(200).send(API._200(await db_helper.update('VideoNotes', input)));
} else {
res.status(200).send(API._200(await db_helper.addData('VideoNotes', input)));
}
};
exports.noteby_user = async (req, res) => {
const input = await helper.decryptRequest(req.body.data);
res.status(200).send(API._200(await db_helper.selectByWhere('VideoNotes', { 'user_id': input.id, 'notes_type': input.notes_type, 'video_id': input.video_id })));
};
exports.search = async (req, res) => {
const input = await helper.decryptRequest(req.body.data);
const flashcard = await Flashcard.findAll({
where: {
status: 0,
certi_id: input.certi_id
},
include: [{
model: Domain,
attributes: ['id', 'domin_name']
}, {
model: Subdomain,
attributes: ['id', 'subdomain_name']
}, {
model: Topic,
attributes: ['id', 'topic_name']
}, {
model: Certificate,
attributes: ['id', 'certificate_name']
}, {
model: Cource,
attributes: ['id', 'course_name']
}]
});
const all = await db.sequelize.query("select mm.id,mm.topic_id,mm.bkp_sd_id,mm.video_title,mm.video_thumbnil,certificate,domain,CONCAT('[',GROUP_CONCAT(DISTINCT subdomain),']')subdomain,CONCAT('[',GROUP_CONCAT(DISTINCT topics),']')topics from videos mm left join (select GROUP_CONCAT(CONCAT_ws('','{\"id\":', id,',\"certificate_name\":\"', certificate_name),'\"}' order by id) certificate,id from certificates group by id) c on mm.certi_id=c.id left join (select GROUP_CONCAT(CONCAT_ws('','{\"id\":', id,',\"domin_name\":\"', domin_name),'\"}' order by id) domain,id from domains group by id) d on d.id=mm.d_id left join (select GROUP_CONCAT(CONCAT_ws('','{\"id\":', id,',\"subdomain_name\":\"', subdomain_name),'\"}'order by id)subdomain,d_id,id from subdomains group by id) sd on find_in_set(sd.id,mm.sd_id)>0 and sd.d_id=mm.d_id left join (select GROUP_CONCAT(CONCAT_ws('','{\"id\":', id,',\"topic_name\":\"', topic_name),'\"}' order by id)topics,id from topics group by id)top on find_in_set(top.id,mm.topic_id)>0 where mm.status=0 group by mm.id;")
.then(function (data) {
return Array.from(new Set(data[0]));
});
for (let i = 0; i < all.length; i++) {
all[i].certificate = JSON.parse(all[i].certificate);
all[i].domain = JSON.parse(all[i].domain);
all[i].subdomain = JSON.parse(all[i].subdomain);
all[i].topics = JSON.parse(all[i].topics);
all[i].topic_id = all[i].topic_id ? all[i].topic_id.split(",") : [];
all[i].bkp_sd_id = all[i].bkp_sd_id ? all[i].bkp_sd_id.split(",") : [];
// all[i].sd_id = all[i].sd_id ? all[i].sd_id.split(",") : [];
}
const practiceque = await Practiceque.findAll({
where: {
status: 0,
certi_id: input.certi_id
},
include: [{
model: Domain,
attributes: ['id', 'domin_name']
}, {
model: Subdomain,
attributes: ['id', 'subdomain_name']
}, {
model: Topic,
attributes: ['id', 'topic_name']
}, {
model: Practicetest,
attributes: ['id', 'practice_name']
}]
});
const maps = await db.sequelize.query(`select mm.id,mm.thumbnail_link,mm.video_link,mm.name,mm.bkp_sd_id,mm.topic_id,mm.sd_id,GROUP_CONCAT(CONCAT_ws('','{\"id\":', c.id,',\"certificate_name\":\"', certificate_name),'\"}' )certificate,GROUP_CONCAT(CONCAT_ws('','{\"id\":', d.id,',\"domin_name\":\"', domin_name),'\"}' )domain,GROUP_CONCAT(CONCAT_ws('','{\"id\":', sd.id,',\"subdomain_name\":\"', subdomain_name),'\"}')subdomain from mind_maps mm left join certificates c on mm.certi_id=c.id left join domains d on d.id=mm.d_id left join subdomains sd on sd.id=mm.sd_id and sd.d_id=mm.d_id where mm.certi_id=${input.certi_id} and mm.status=0 group by mm.id`)
.then(function (data) {
return Array.from(new Set(data[0]));
});
if (maps.length > 0) {
for (let i = 0; i < maps.length; i++) {
maps[i].certificate = JSON.parse(maps[i].certificate);
maps[i].domain = JSON.parse(maps[i].domain);
maps[i].subdomain = JSON.parse(maps[i].subdomain);
maps[i].topic_id = maps[i].topic_id != "" ? maps[i].topic_id.split(",") : [];
maps[i].bkp_sd_id = maps[i].bkp_sd_id != "" ? maps[i].bkp_sd_id.split(",") : [];
maps[i].sd_id = maps[i].sd_id != "" ? maps[i].sd_id.split(",") : [];
}
}
const study = await StudyMaterial.findAll({
where: {
certi_id: input.certi_id,
status: 0
}
});
const data = [];
data.push({ 'FlashCards': flashcard, 'Videos': all, 'PracticeQuestions': practiceque, "MindMaps": maps, "Study": study })
res.status(200).send(API._200(await data));
};
exports.update_view = async (req, res) => {
const input = await helper.decryptRequest(req.body.data);
var already = await db_helper.selectByWhere('VideoMindView', { type_id: input.type_id, type: "VIDEO", cohort_id: input.cohort_id, user_id: input.user_id });
if (already.length <= 0)
return API._200(await db_helper.addData('VideoMindView', input));
else {
if (parseInt(input.view_percent) >= parseInt(already[0].view_percent)) {
input['id'] = already[0].id;
res.status(200).send(API._200(await db_helper.update('VideoMindView', input)));
}
else {
res.status(200).send(API._200(await db_helper.selectByWhere('VideoMindView', { type_id: input.type_id, type: "VIDEO", cohort_id: input.cohort_id, user_id: input.user_id })));
}
}
};
exports.add = async (req, res) => {
const input = await helper.decryptRequest(req.body.data);
res.status(200).send(API._200(await db_helper.addData('Video', input)));
};
exports.all = async (req, res) => {
const all = await db.sequelize.query("select mm.*,certificate,domain,CONCAT('[',GROUP_CONCAT(DISTINCT subdomain),']')subdomain,CONCAT('[',GROUP_CONCAT(DISTINCT topics),']')topics from videos mm left join (select GROUP_CONCAT(CONCAT_ws('','{\"id\":', id,',\"certificate_name\":\"', certificate_name),'\"}' order by id) certificate,id from certificates group by id) c on mm.certi_id=c.id left join (select GROUP_CONCAT(CONCAT_ws('','{\"id\":', id,',\"domin_name\":\"', domin_name),'\"}' order by id) domain,id from domains group by id) d on d.id=mm.d_id left join (select GROUP_CONCAT(CONCAT_ws('','{\"id\":', id,',\"subdomain_name\":\"', subdomain_name),'\"}'order by id)subdomain,d_id,id from subdomains group by id) sd on find_in_set(sd.id,mm.sd_id)>0 and sd.d_id=mm.d_id left join (select GROUP_CONCAT(CONCAT_ws('','{\"id\":', id,',\"topic_name\":\"', topic_name),'\"}' order by id)topics,id from topics group by id)top on find_in_set(top.id,mm.topic_id)>0 where mm.status=0 group by mm.id;")
.then(function (data) {
return Array.from(new Set(data[0]));
});
if (all.length == 0) {
res.status(200).send(API._200([]));
}
const allnotes = await db_helper.allData('VideoNotes');
for (let i = 0; i < all.length; i++) {
all[i].certificate = JSON.parse(all[i].certificate);
all[i].domain = JSON.parse(all[i].domain);
all[i].subdomain = JSON.parse(all[i].subdomain);
all[i].topics = JSON.parse(all[i].topics);
all[i].topic_id = all[i].topic_id ? all[i].topic_id.split(",") : [];
all[i].bkp_sd_id = all[i].bkp_sd_id ? all[i].bkp_sd_id.split(",") : [];
all[i].sd_id = all[i].sd_id ? all[i].sd_id.toString().split(",") : [];
all[i].notes = allnotes.filter((res) => res.video_id == all[i].id);
}
res.status(200).send(API._200(await all));
};
exports.delete = async (req, res) => {
const input = await helper.decryptRequest(req.body.data);
res.status(200).send(API._200(await db_helper.statusChange('Video', input.id)));
};
exports.update = async (req, res) => {
const input = await helper.decryptRequest(req.body.data);
res.status(200).send(API._200(await db_helper.update('Video', input)));
};
exports.save_rearrange = async (req, res) => {
const input = await helper.decryptRequest(req.body.data);
let data = input.videos;
let response = [];
for (let i = 0; i < data.length; i++) {
response = await db_helper.update('Video', data[i])
}
res.status(200).send(API._200(await response));
};