Source

api/interfaces/Absence.js

/**
 * @module Absence
 * @category API
 * @subcategory Interfaces
 * @author Alexis L. <alexis.lecomte@supinfo.com>
 */

import sequelize from "../sequelizeLoader.js";
import { APIResp, APIError } from "../../global/global.js";
import {Op} from "sequelize";

/**
 * Sequelize models
 * @const
 * @name models
 * @type {Object<Sequelize.models>}
 */
const { models } = sequelize;

/**
 * @typedef {Object} NewAbsence
 *
 * @property {number} user_id
 * @property {Date|string} start_date
 * @property {Date|string} end_date
 */
/**
 * @typedef {Object} AbsencesFilters
 *
 * @property {array<number>} userIDs
 * @property {array<number>} campusIDs
 * @property {array<number>} years
 */

/*****************************************************
 * CRUD Methods
 *****************************************************/

/* ---- CREATE ---------------------------------- */
/**
 * Add a new absence to a user
 * @function
 * @async
 *
 * @param {NewAbsence} newAbsence
 * @throws {APIError}
 * @return {Promise<APIResp>}
 */
const add = async (newAbsence) => {
	const processedAbsence = newAbsence;

	// Check if the new absence match the model
	const model = models.absence.build(processedAbsence);

	try {
		await model.validate({ skip: ["absence_id"] });
	} catch (err) {
		// TODO: Adapt the system
		throw new APIError(400, "error", Object.values(err));
	}

	// Add to the database
	const absence = await models.absence.create(processedAbsence);

	return new APIResp(200).setData({ absenceID: absence.absence_id });
};

/* ---- READ ------------------------------------ */
/**
 * Get all absences
 * @function
 * @async
 *
 * @param {AbsencesFilters} filters
 * @return {Promise<APIResp>}
 */
const getAll = async filters => {
	const usableFilters = {};
	if (filters) {
		if (filters.userIDs) {
			usableFilters.user_id = { [Op.in]: filters.userIDs };
		}
		if (filters.campusIDs) {
			usableFilters["$user.campus.campus_id$"] = { [Op.in]: filters.campusIDs };
		}
		if (filters.years) {
			usableFilters["$user.study.current_level$"] = { [Op.in]: filters.years };
		}
	}

	const absences = await models.absence.findAll({
		include: [{
			model: models.user,
			as: "user",
			required: true,
			include: [{
				model: models.study,
				as: "study",
				required: false,
			}, {
				model: models.campus,
				as: "campus",
				required: false,
			}],
		}],
		where: usableFilters,
	});

	return new APIResp(200).setData({ absences });
};
/**
 * Get all absences of a user
 * @function
 * @async
 *
 * @param {number} userID
 * @return {Promise<APIResp>}
 */
const getByUserID = async (userID) => {
	const absences = await models.absence.findAll({
		where: { user_id: userID },
	});

	return new APIResp(200).setData({ absences });
};

/* ---- UPDATE ---------------------------------- */
/* ---- DELETE ---------------------------------- */

/*****************************************************
 * Export
 *****************************************************/

const Absence = {
	add,					// CREATE
	getAll,					// READ
	getByUserID,
};
export default Absence;