Source

api/course/CourseCollection.methods.ts

import { CallPromiseMixin } from 'meteor/didericis:callpromise-mixin';
import { ValidatedMethod } from 'meteor/mdg:validated-method';
import _ from 'lodash';
import { Courses } from './CourseCollection';
import { CourseInstances } from './CourseInstanceCollection';
import { AcademicTerms } from '../academic-term/AcademicTermCollection';
import { nextAcademicTerm } from '../academic-term/AcademicTermUtilities';
import { RadGradProperties } from '../radgrad/RadGradProperties';

/**
 * Returns an array with two elements: a string with the shortName of the academicTerm, and an integer indicating the
 * current planned enrollment for the course in that academicTerm.
 * @param courseID The ID of the course.
 * @param termID The ID of the academicTerm.
 * @memberOf api/course
 */
function getEnrollmentData(courseID, termID) {
  const academicTermShortName = AcademicTerms.getShortName(termID);
  const enrollment = CourseInstances.getCollection().find({ termID, courseID }).count();
  return [academicTermShortName, enrollment];
}

/**
 * Given a courseID, returns enrollment data for the upcoming 9 academicTerms.
 * The returned data is an object with fields courseID and enrollmentData.
 * CourseID is the course ID.
 * EnrollmentData is an array of arrays. Each interior array is a tuple: a string containing the shortname and an
 * integer indicating the enrollment data.
 * @memberOf api/course
 * @example
 * { courseID: 'xghuyf2132q3',
 *   enrollmentData: [['Sp19', 0], ['Su19', 1], ['Fa19', 5],
 *                    ['Sp20', 25], ['Su20', 2], ['Fa20', 0],
 *                    ['Sp21', 1], ['Su21', 0], ['Fa21', 1]]
 * }
 */
export const getFutureEnrollmentMethod = new ValidatedMethod({
  name: 'CourseCollection.getFutureEnrollment',
  mixins: [CallPromiseMixin],
  validate: null,
  run(courseID) {
    // Throw error if an invalid courseID is passed.
    Courses.assertDefined(courseID);
    // Create an array of the upcoming 9 academicTerms after the current academicTerm.
    let academicTermDoc = AcademicTerms.getCurrentAcademicTermDoc();
    let termsPerYear = 3;
    if (RadGradProperties.getQuarterSystem()) {
      termsPerYear = 4;
    }
    const academicTermList = [];
    for (let i = 0; i < 3 * termsPerYear; i++) {
      academicTermDoc = nextAcademicTerm(academicTermDoc);
      academicTermList.push(academicTermDoc);
    }
    // Map over these academicTerms and return a new list that includes the enrollment data for this course and academicTerm.
    const enrollmentData = _.map(academicTermList, (doc) => getEnrollmentData(courseID, AcademicTerms.getID(doc)));
    return { courseID, enrollmentData };
  },
});