init
This commit is contained in:
108
worklenz-backend/src/controllers/task-recurring-controller.ts
Normal file
108
worklenz-backend/src/controllers/task-recurring-controller.ts
Normal file
@@ -0,0 +1,108 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user