Skip to content

Commit

Permalink
Added functionality for research logging in cloud functions for vari…
Browse files Browse the repository at this point in the history
…ables such as correct responses, responsetime etc
  • Loading branch information
vishwesh-D-kumar committed Mar 15, 2022
1 parent b0525b3 commit ef06816
Showing 1 changed file with 212 additions and 4 deletions.
216 changes: 212 additions & 4 deletions App/functions/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ const admin = require('firebase-admin');
const functions = require('firebase-functions');
const nodemailer = require('nodemailer');
const moment = require('moment');
const url = 'https://testfortls.firebaseio.com/';
const url = 'https://alt-development-42a78-default-rtdb.firebaseio.com/';

const transporter = nodemailer.createTransport({
host: functions.config().mailingsystem.host,
Expand Down Expand Up @@ -512,6 +512,7 @@ async function QuizResponseMailer(
endTime,
email,
) {

const correctAnswer =
answer === '*'
? 'N/A'
Expand Down Expand Up @@ -609,7 +610,7 @@ async function getAllStudentsforMail(passCode, startTime, endTime) {
let email = keys['userName'];
let ID = keys['userID'];
let name = keys['name'] === undefined ? 'N/A' : keys['name'];
const val = { Name: name, Email: email, Answer: answer };
const val = { Name: name, Email: email, Answer: answer,responseTime : temp1-temp };
// if (vlist.includes(ID)) {
a[ID] = val;
b.push(ID);
Expand All @@ -631,6 +632,7 @@ async function getAllStudentsforMail(passCode, startTime, endTime) {
Name: student['name'],
Email: student['email'],
Answer: 'N/A',
responseTime:0
};
final.push(val);
}
Expand Down Expand Up @@ -1051,6 +1053,199 @@ async function deleteFacultyHelper(facultyID) {
return Promise.all(coursesToRemove);
}
}
function quizHash(startTime,date){
return
}
async function quizResearchLogger(
list,
answer,
errorRate,
type,
passCode,
quizNumber,
startTime,
endTime,
email,){
//
curr_time = moment.utc()
// console.log(curr_time)
// console.log(answer)
console.log(list)
db_ref = admin
.app()
.database(url)
.ref('InternalDb/Lectures/')
// getting lecture timings

// finding which class is going on currently

timings = await db_ref.orderByChild('passCode').equalTo(passCode).once('value')
timings = timings.val()
if (!timings) {return}

// console.log(timings)
// console.log(curr_time.day())
var starTime = null;
var endTime = null;
var lecNo = null;
for (const [key, value] of Object.entries(timings)) {
//
// console.log(value['day']+' '+curr_time.day())
if (value['day']==curr_time.day()){
console.log(key, value);
startTime = value['startTime']
endTime = value['endTime']

}
}
startTime = moment.utc(curr_time.format('DD/MM/YYYY')+' ' + startTime,'DD/MM/YYYY HH:mm:ss')
endTime = moment.utc(curr_time.format('DD/MM/YYYY')+' ' + startTime,'DD/MM/YYYY HH:mm:ss')
// console.log('func ends')
// Making a table : stud_email-starTime-passCode
// iterating over all responses
await Promise.all(list.map(async(student)=> {
// student = list[i]
const grade = autoGrader(student.Answer,answer,errorRate,type)

// getting reference
reference = await admin
.app()
.database(url)
// check if exists
db_ref = await admin
.app()
.database(url)
.ref('InternalDb/StudentResearch/')
snapshot = await db_ref.orderByChild('email-startTime-passCode').equalTo(student.Email + '-'+ startTime.format('DD/MM/YYYY HH:mm:ss') + '-' +passCode).once('value')
if (!snapshot.val()){

await db_ref.push({
'email':student.Email,
'passCode': passCode,
'startTime': startTime.format('DD/MM/YYYY HH:mm:ss'),
'attempted_quizzes': student.Answer=='N/A'?0:1,
'not_attempted_quizzes':student.Answer=='N/A'?1:0,
'correct_quizzes': grade=='1' ? 1 : 0,
'feedbacks_attended':0,
'responseTime':student.responseTime ,
'email-startTime-passCode':student.Email + '-'+ startTime.format('DD/MM/YYYY HH:mm:ss') + '-' +passCode
})
}
else{
entries = Object.entries(snapshot.val());
[key,value] = entries[0];

await db_ref.child(key)
.update({'attempted_quizzes':student.Answer=='N/A'?value['attempted_quizzes']:value['attempted_quizzes']+1,
'correct_quizzes':grade=='1'?value['correct_quizzes']+ 1 : value['correct_quizzes'],
'responseTime':value['responseTime'] + student.responseTime,
'not_attempted_quizzes':student.Answer=='N/A'?value['not_attempted_quizzes']+1:value['not_attempted_quizzes']},(error) => {if(error){console.log(error)}})
}





})
)}
async function feedbackResearchLogger(
passCode,
startTime,
endTime){
list = await admin
.app()
.database(url)
.ref('InternalDb/FeedbackResponse/')
.orderByChild('passCode')
.equalTo(passCode)
.once('value')
.then(async snapshot => {
let list = [];
snapshot.forEach(data => {
const keys = Object(data.val());
const temp = moment(startTime, 'DD/MM/YYYY HH:mm:ss');
const temp1 = moment(keys['timestamp'], 'DD/MM/YYYY HH:mm:ss');
const temp2 = moment(endTime, 'DD/MM/YYYY HH:mm:ss');

// if (temp1 <= temp2 && temp1 >= temp) {
// list[keys['responses']] += 1;
// }

if (temp1 <= temp2 && temp1 >= temp) {
list.push({Email:keys['userName']})
}
} );
return list
})
console.log(list)

curr_time = moment.utc()
db_ref = admin
.app()
.database(url)
.ref('InternalDb/Lectures/')
timings = await db_ref.orderByChild('passCode').equalTo(passCode).once('value')
timings = timings.val()
if (!timings) {return}

console.log(timings)
console.log(curr_time.day())
var starTime = null;
var endTime = null;
var lecNo = null;
for (const [key, value] of Object.entries(timings)) {
//
console.log(value['day']+' '+curr_time.day())
if (value['day']==curr_time.day()){
console.log(key, value);
startTime = value['startTime']
endTime = value['endTime']

}
}
startTime = moment.utc(curr_time.format('DD/MM/YYYY')+' ' + startTime,'DD/MM/YYYY HH:mm:ss')
endTime = moment.utc(curr_time.format('DD/MM/YYYY')+' ' + startTime,'DD/MM/YYYY HH:mm:ss')
console.log('func ends')
await Promise.all(list.map(async(student)=> {
// student = list[i]

// getting reference
reference = await admin
.app()
.database(url)
// check if exists
db_ref = await admin
.app()
.database(url)
.ref('InternalDb/StudentResearch/')
snapshot = await db_ref.orderByChild('email-startTime-passCode').equalTo(student.Email + '-'+ startTime.format('DD/MM/YYYY HH:mm:ss') + '-' +passCode).once('value')
if (!snapshot.val()){

await db_ref.push({
'email':student.Email,
'passCode': passCode,
'startTime': startTime.format('DD/MM/YYYY HH:mm:ss'),
'attempted_quizzes': 0,
'not_attempted_quizzes':0,
'correct_quizzes': 0,
'feedbacks_attended':1,
'responseTime':0 ,
'email-startTime-passCode':student.Email + '-'+ startTime.format('DD/MM/YYYY HH:mm:ss') + '-' +passCode
})
}
else{
entries = Object.entries(snapshot.val());
[key,value] = entries[0];
// console.log(key)
// console.log(value)
// console.log('Feedback attended by key '+ key)
await db_ref.child(key)
.update({'feedbacks_attended':value['feedbacks_attended']+1},(error) => {if(error){console.log(error)}})

}
}))
}


exports.mailingSystem = functions.https.onCall(async (data, context) => {
if (!context.auth) {
Expand All @@ -1071,12 +1266,21 @@ exports.mailingSystem = functions.https.onCall(async (data, context) => {
.ref('InternalDb/KBC/' + coursequizurl)
.once('value')
.then(async snapshot => {
value = snapshot.val();
const value = snapshot.val();
const data = await getAllStudentsforMail(
passCode,
value['startTime'],
value['endTime'],
);
await quizResearchLogger(data,
value['correctAnswer'],
value['errorRate'],
value['quizType'],
value['passCode'],
value['questionCount'],
value['startTime'],
value['endTime'],
email,)
return await QuizResponseMailer(
data,
value['correctAnswer'],
Expand All @@ -1100,7 +1304,7 @@ exports.mailingSystem = functions.https.onCall(async (data, context) => {
.ref('InternalDb/Feedback/' + coursefburl)
.once('value')
.then(async snapshot => {
value = snapshot.val();
const value = snapshot.val();
const keys = Object(snapshot.val());
type = '0';
if ('kind' in keys) {
Expand All @@ -1112,6 +1316,10 @@ exports.mailingSystem = functions.https.onCall(async (data, context) => {
value['endTime'],
type,
);
await feedbackResearchLogger(
passCode,
value['startTime'],
value['endTime'])
return await FeedbackResponseMailer(
data,
passCode,
Expand Down

1 comment on commit ef06816

@vishwesh-D-kumar
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Points to be noted

  • New Database tables added
  • StudentResearchTable added. Each entry corresponds to entry of student,lecture
  • Lectures table added. UI remaining, currently expects lecture tmings of prof to be given. Currently matching timings by day only , functionality for multiple classes a day also needed.
  • Current data added manually in the form of
  • // db_ref.push({'passCode':'kyu873gm',"startTime":"04:00:00","endTime":"06:00:00","day":0}) // db_ref.push({'passCode':'kyu873gm',"startTime":"04:00:00","endTime":"06:00:00","day":2}) // db_ref.push({'passCode':'kyu873gm',"startTime":"04:00:00","endTime":"06:00:00","day":5})
  • Db url changed to alt-dev for dev purposes
  • Index added to rules for alt-dev : StudentResearchTable (email-startTime-passCode)

Please sign in to comment.