import { TareaModel } from "./models/tareaModel.js";
/**
* Crea una nueva tarea en la base de datos
*
* @async
* @function create
* @param {Object} data - Datos de la tarea a crear
* @returns {Promise<Object>} La tarea creada
*/
async function create(data) {
return await new TareaModel(data).save();
}
/**
* Lista todas las tereas ordenadas por nombre de forma descendente
*
* @async
* @function list
* @return {Promise<Array<Object>>} Lista de tareas ordenada.
*/
async function list() {
return await TareaModel.find().sort({ nombre: "desc" }).exec();
}
/**
* Lista las tareas de un tablero filtradas por el valor de la prioridad
*
* @async
* @function listByPriority
* @param {string} tablero - Identificador del tablero
* @param {string} priority - Prioridad para filtrar
* @return {Promise<Array<Object>>} Lista de tareas de un tablero con una prioridad determinada
*/
async function listByPriority(tablero, priority) {
return await TareaModel.find({ tablero: tablero, prioridad: priority }).exec();
}
/**
* Lista las tareas de un tablero filtradas por el valor del estado
*
* @async
* @function listByState
* @param {string} tablero - Identificador del tablero
* @param {string} state - Estado para filtrar
* @return {Promise<Array<Object>>} Lista de tareas de un tablero con un estado determinado
*/
async function listByState(tablero, state) {
return await TareaModel.find({ tablero: tablero, estado: state }).exec()
}
/**
* Lista las tareas de un tablero filtradas por una fecha límite
*
* @async
* @function listByLimitDate
* @param {string} tablero - Identificador del tablero
* @param {date} date - Fecha límite para filtrar
* @return {Promise<Array<Object>>} Lista de tareas de un tablero con una fecha límite menor a la fecha pasada
*/
async function listByLimitDate(tablero, date) {
return await TareaModel.find({ tablero: tablero, fechaLimite: { $lte: date } }).exec();
}
/**
* Lista las tareas de un tablero filtradas por el usuario asignado
*
* @async
* @function listByUserAsigned
* @param {string} tablero - Identificador del tablero
* @param {string} id - Usuario asignado para filtrar
* @return {Promise<Array<Object>>} Lista de tareas de un tablero con un usuario asignado
*/
async function listByUserAsigned(tablero, id) {
return await TareaModel.find({ tablero: tablero, asignadoA: id }).exec();
}
/**
* Obtiene una tarea por su ID.
*
* @async
* @function getOne
* @param {string} id - ID único de la tarea.
* @returns {Promise<Object|null>} La tarea encontrada o null si no existe.
*/
async function getOne(id) {
const params = { _id: id };
return await TareaModel.findOne(params).exec();
}
/**
* Elimina una tarea por su ID.
*
* @async
* @function remove
* @param {string} id - ID único de la tarea a eliminar.
* @returns {Promise<Object|null>} La tarea eliminada o null si no existe.
*/
async function remove(id) {
return await TareaModel.findOneAndDelete({ _id: id }).exec();
}
/**
* Actualiza la tarea por su ID con los datos proporcionados.
*
* @async
* @function update
* @param {string} id - ID único de la tarea a actualizar.
* @param {Object} data - Datos de la tarea a actualizar.
* @returns {Promise<Object|null>} La tarea actualizada o null si no existe.
*/
async function update(id, data) {
return await TareaModel.findOneAndUpdate({ _id: id }, data, { new: true, runValidators: true }).exec();
}
/**
* Repositorio de tareas que contiene las operaciones principales sobre la base de datos
*
* @namespace tareasRepository
* @property {Function} create - Crea una tarea nueva
* @property {Function} list - Lista todas las tareas
* @property {Function} listByPriority - Lista las tareas de un tablero filtrando por su prioridad
* @property {Function} listByState - Lista las tareas de un tablero filtrando por su estado
* @property {Function} listByLimitDate - Lista las tareas de un tablero filtrando por su fecha límite
* @property {Function} listByUserAsigned - Lista las tareas de un tablero filtrando por su usuario asignado
* @property {Function} getOne - Obtiene una tarea por su ID
* @property {Function} remove - Elimina una tarea por su ID
* @property {Function} update - Actualiza una tarea por su ID
*/
export const tareasRepository = {
create,
list,
listByPriority,
listByState,
listByLimitDate,
listByUserAsigned,
getOne,
remove,
update,
}