Files
worklenz/worklenz-backend/src/controllers/task-recurring-controller.ts
chamikaJ 8825b0410a init
2025-04-17 18:28:54 +05:30

108 lines
4.3 KiB
TypeScript

import db from "../config/db";
import WorklenzControllerBase from "./worklenz-controller-base";
import HandleExceptions from "../decorators/handle-exceptions";
import { IWorkLenzRequest } from "../interfaces/worklenz-request";
import { IWorkLenzResponse } from "../interfaces/worklenz-response";
import { ServerResponse } from "../models/server-response";
import { calculateNextEndDate, log_error } from "../shared/utils";
export default class TaskRecurringController extends WorklenzControllerBase {
@HandleExceptions()
public static async getById(req: IWorkLenzRequest, res: IWorkLenzResponse): Promise<IWorkLenzResponse> {
const { id } = req.params;
const q = `SELECT id,
schedule_type,
days_of_week,
date_of_month,
day_of_month,
week_of_month,
interval_days,
interval_weeks,
interval_months,
created_at
FROM task_recurring_schedules WHERE id = $1;`;
const result = await db.query(q, [id]);
const [data] = result.rows;
return res.status(200).send(new ServerResponse(true, data));
}
private static async insertTaskRecurringTemplate(taskId: string, scheduleId: string) {
const q = `SELECT create_recurring_task_template($1, $2);`;
await db.query(q, [taskId, scheduleId]);
}
@HandleExceptions()
public static async createTaskSchedule(taskId: string) {
const q = `INSERT INTO task_recurring_schedules (schedule_type) VALUES ('daily') RETURNING id, schedule_type;`;
const result = await db.query(q, []);
const [data] = result.rows;
const updateQ = `UPDATE tasks SET schedule_id = $1 WHERE id = $2;`;
await db.query(updateQ, [data.id, taskId]);
await TaskRecurringController.insertTaskRecurringTemplate(taskId, data.id);
return data;
}
@HandleExceptions()
public static async removeTaskSchedule(scheduleId: string) {
const deleteQ = `DELETE FROM task_recurring_schedules WHERE id = $1;`;
await db.query(deleteQ, [scheduleId]);
}
@HandleExceptions()
public static async updateSchedule(req: IWorkLenzRequest, res: IWorkLenzResponse): Promise<IWorkLenzResponse> {
const { id } = req.params;
const { schedule_type, days_of_week, day_of_month, week_of_month, interval_days, interval_weeks, interval_months, date_of_month } = req.body;
const deleteQ = `UPDATE task_recurring_schedules
SET schedule_type = $1,
days_of_week = $2,
date_of_month = $3,
day_of_month = $4,
week_of_month = $5,
interval_days = $6,
interval_weeks = $7,
interval_months = $8
WHERE id = $9;`;
await db.query(deleteQ, [schedule_type, days_of_week, date_of_month, day_of_month, week_of_month, interval_days, interval_weeks, interval_months, id]);
return res.status(200).send(new ServerResponse(true, null));
}
// Function to create the next task in the recurring schedule
private static async createNextRecurringTask(scheduleId: string, lastTask: any, taskTemplate: any) {
try {
const q = "SELECT * FROM task_recurring_schedules WHERE id = $1";
const { rows: schedules } = await db.query(q, [scheduleId]);
if (schedules.length === 0) {
log_error("No schedule found");
return;
}
const [schedule] = schedules;
// Define the next start date based on the schedule
const nextStartDate = calculateNextEndDate(schedule, lastTask.start_date);
const result = await db.query(
`INSERT INTO tasks (name, start_date, end_date, priority_id, project_id, reporter_id, description, total_minutes, status_id, schedule_id)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15) RETURNING id;`,
[
taskTemplate.name, nextStartDate, null, taskTemplate.priority_id,
lastTask.project_id, lastTask.reporter_id, taskTemplate.description,
0, taskTemplate.status_id, scheduleId
]
);
const [data] = result.rows;
log_error(`Next task created with id: ${data.id}`);
} catch (error) {
log_error("Error creating next recurring task:", error);
}
}
}