Home Reference Source Repository

component/Actions/courseActions.js

import {firebaseApp,firebaseAuth,firebaseDb, firebaseStorage} from '../Firebase'

/**
 * converts json into an array
 * @param {object} json - pushes object into array
 * @returns {list} arr - Returns array of json objects
 */
function jsonToArray(json){
        var arr = [];
        for (var prop in json) {
            arr.push(json[prop]);
        }
        return arr
    }


/**
 * adds purchasers to coursePurchasers
 * @param {object} info, courseID - information on course and purchaser id
 * @throws {object} err - Returns an error if failed to fetch from database.
 * @returns {object} dispatch 
 */
export function addCoursePurchaser(info, courseID) {
    return function(dispatch) {
        dispatch({type: "ADDING_PURCHASER"})

        var purchasers = []
        if (info.coursePurchasers != null) {
            for (var count=0; count<info.coursePurchasers.length; count++) {
                // just keep unique purchasers 
                var unique = true
                for (var i=0; i<purchasers.length; i++) {
                    if (info.coursePurchasers[count] == purchasers[i]) {
                        unique = false
                    }
                }
                if (unique) {
                    purchasers.push(info.coursePurchasers[count])
                }
            }
        }

        var unique = true
        for (var count=0; count<purchasers.length; count++) {
            if (info.purchaserToAdd == purchasers[count]) {
                unique = false
            } 
        }
        if (unique) {
            purchasers.push(info.purchaserToAdd)
        }

        firebaseDb.ref('Course/' + courseID).set({
            courseDescription: info.courseDescription,
            courseID: info.courseID,
            courseName: info.courseName,
            courseVendorEmail: info.courseVendorEmail,
            courseVideoId: info.courseVideoId,
            coursePurchasers: purchasers
        }).then((data) => {
            dispatch({type: "UPDATE_COURSE_FULFILLED"})
        }).catch((err) => {
            dispatch({type: "UPDATE_COURSE_REJECTED", payload: err.code})
        })
    }
}

/**
 * Grabs the courses from the course child in the database.
 * @returns {object} courses - Returns the object of courses.
 * @throws {object} err - Returns an error if failed to fetch from database.
 */
export function fetchCourseList() {
    return function(dispatch) {
        dispatch({type: "UPLOAD_COURSE"})
        firebaseDb.ref('Course/' + course.name).set(course)
            .then((data) => {
                dispatch({type: "UPLOAD_COURSE_FULFILLED"})
            })
            .catch((err) => {
                dispatch({type: "UPLOAD_COURSE_REJECTED", payload: err.code})
            })
                        
    }
}

/**
 * Upload a course into the database.
 * @param {object} course - object containing course info
 * @returns {object} courses - Returns the object of courses.
 * @throws {object} err - Returns an error if failed to fetch from database.
 */
export function uploadCourse(course) {
    return function(dispatch) {
        dispatch({type: "UPLOAD_COURSE"})
        var pushID = generatePushID()
        course.courseID = pushID
        course.courseFiles = ['0']


        firebaseDb.ref('Course/'+course.courseID).set(course)
            .then((data) => {
                dispatch({type: "UPLOAD_COURSE_FULFILLED"})
            })
            .catch((err) => {
                dispatch({type: "UPLOAD_COURSE_REJECTED", payload: err.code})
            })
                        
    }
}

/**
 * updates course
 * @param {object} course, courseID - information on course
 * @throws {object} err - Returns an error if failed to fetch from database.
 * @returns {object} dispatch 
 */
export function updateCourse(course,courseID) {
    return function(dispatch) {
        dispatch({type: "UPDATE_COURSE"})
        

        firebaseDb.ref('Course/'+courseID).set(course)
            .then((data) => {
                dispatch({type: "UPDATE_COURSE_FULFILLED"})
            })
            .catch((err) => {
                dispatch({type: "UPDATE_COURSE_REJECTED", payload: err.code})
            })
                        
    }
}

/**
 * upload course files
 * @param {object} course, courseID, fileObj - information on course and selected file
 * @throws {object} err - Returns an error if failed to fetch from database.
 * @returns {object} dispatch 
 */
export function uploadCourseFiles(courseID,coursePrev,fileObj) {
    return function(dispatch) {
        dispatch({type:"UPLOAD_COURSE_FILES"})
        firebaseStorage.child(courseID+'/'+fileObj.fileName).put(fileObj.file,fileObj.metadata)
            .then((snapshot) =>{
                var url = snapshot.metadata.downloadURLs[0];
                var tempList = coursePrev.courseFiles;
                if(tempList[0]=='0'){
                    var courseFiles = [url]
                }else{
                    var courseFiles = [...tempList,url]
                }
                if(coursePrev.coursePurchasers!=null){
                firebaseDb.ref('Course/'+courseID).set({
                    courseDescription:coursePrev.courseDescription,
                    courseID:coursePrev.courseID,
                    courseName:coursePrev.courseName,
                    courseVendorEmail:coursePrev.courseVendorEmail,
                    courseVideoId:coursePrev.courseVideoId,
                    coursePurchasers:coursePrev.coursePurchasers,
                    courseFiles:courseFiles
                });
                }else{
                firebaseDb.ref('Course/'+courseID).set({
                    courseDescription:coursePrev.courseDescription,
                    courseID:coursePrev.courseID,
                    courseName:coursePrev.courseName,
                    courseVendorEmail:coursePrev.courseVendorEmail,
                    courseVideoId:coursePrev.courseVideoId,
                    courseFiles:courseFiles
                    });
                }
            
                dispatch({type:"UPLOAD_COURSE_FILES_FULFILLED"})
            }).catch((err) => {
                dispatch({type: "UPLOAD_COURSE_FILES_REJECTED", payload:err})
            })
    }
}   
    
/*------not using yet-----*/
export function uploadCourseDetail(user,fileObj) {
    return function(dispatch) {
        dispatch({type: "UPLOAD_COURSE_DETAIL"})
        firebaseStorage.child(user.email+fileObj.fileName).put(fileObj.file,fileObj.metadata)
            .then((snapshot) =>{
            //use then() to avoid asynchronous case
            url = snapshot.metadata.downloadURLs[0];
            document.getElementById('linkbox').innerHTML = '<a href="' + url + '">Click For File</a>';
            dispatch({type: "UPLOAD_COURSE_DETAIL_FULFILLED"})
            }).catch((err) => {
                dispatch({type: "UPLOAD_COURSE_DETAIL_REJECTED", payload: err})
            })
    }
}


/**
 * Grabs the vendor courses from the Vendor Course in the database.
 * @param {object} email - object containing email
 * @returns {object} currentVendorCourseList - Returns the object of courses.
 * @throws {object} err - Returns an error if failed to fetch from database.
 */

export function fetchVendorCourse(email) {
    return function(dispatch) {
        dispatch({type: "FETCH_VENDORS_COURSE"})
        firebaseDb.ref('Course').orderByChild('courseVendorEmail').equalTo(email).on("value",function(snapshot){
            dispatch({type:"FETCH_VENDORS_COURSE_FULFILLED",payload:snapshot.val()})
        },function(errorObject){
            dispatch({type:"FETCH_VENDORS_COURSE_REJECTED",payload:errorObject.code})
        })
    }
}

/**
 * Grabs the courses from the CourseList in the database.
 * @returns {object} courseList - Returns the object of courseList.
 * @throws {object} err - Returns an error if failed to fetch from database.
 */
export function fetchCourse() {
    return function(dispatch) {
        dispatch({type: "FETCH_COURSE"})
        firebaseDb.ref('Course').on("value",function(snapshot){
            dispatch({type:"FETCH_COURSE_FULFILLED",payload:jsonToArray(snapshot.val())})
        },function(errorObject){
            dispatch({type:"FETCH_COURSE_REJECTED",payload:errorObject.code})
        })
    }
}

/**
 * Grabs the courseName from the Course in the database.
 * @param {object} courseName - Object containing course names
 * @returns {object} aCourseName - Returns the object aCourseName
 * @throws {object} err - Returns an error if failed to fetch from database.
 */
export function fetchACourse(courseName) {
    return function(dispatch) {
        dispatch({type: "FETCH_A_COURSE"})
        firebaseDb.ref('Course').orderByChild('courseName').equalTo(courseName).on("value",function(snapshot){
            if (snapshot.val()){
                dispatch({type:"FETCH_A_COURSE_FULFILLED",payload:jsonToArray(snapshot.val())[0]})
            }else{
                dispatch({type:"FETCH_A_COURSE_REJECTED",payload:"payload is null"})
            }
        },function(errorObject){
            dispatch({type:"FETCH_A_COURSE_REJECTED",payload:errorObject.code})
        })
    }
}

/**
 * Saves a course to the database.
 * @param {object} courseName - Object containing course names
 * @returns {object} courseName - Returns the object containing course names.
 * @throws {object} err - Returns an error if failed to fetch from database.
 */
export function saveACourse(courseName) {
    return function(dispatch) {
        dispatch({type: "SAVE_A_COURSE",payload: courseName})
    }
}

/**
 * Sort the course by name.
 * @param {object} courseList - Object containing course list
 * @returns {object} number - Returns the value that decides sorting method.
 */
export function sortByName(courseList) {
    return function(dispatch) {
        courseList.sort(function(a, b){
             var nameA=a.courseName.toLowerCase(), nameB=b.courseName.toLowerCase();
             if (nameA < nameB) //sort string ascending
              return -1;
             if (nameA > nameB)
              return 1;
             return 0; //default return value (no sorting)
        })
        dispatch({type: "SORT_LIST",payload: courseList})
    }
}

/**
 * Sort the course by vendor's email.
 * @param {object} courseList - Object containing course list
 * @returns {object} number - Returns the value that decides sorting method.
 */
export function sortByVendorEmail(courseList) {
    return function(dispatch) {
        courseList.sort(function(a, b){
             var nameA=a.courseVendorEmail.toLowerCase(), nameB=b.courseVendorEmail.toLowerCase();
             if (nameA < nameB) //sort string ascending
              return -1;
             if (nameA > nameB)
              return 1;
             return 0; //default return value (no sorting)
        })
        dispatch({type: "SORT_LIST",payload: courseList})
    }
}