Initial commit: Angular frontend and Expressjs backend
This commit is contained in:
@@ -0,0 +1,206 @@
|
||||
import db from "../../config/db";
|
||||
import { IActivityLog, IActivityLogAttributeTypes, IActivityLogChangeType } from "./interfaces";
|
||||
import { log_error } from "../../shared/utils";
|
||||
import moment from "moment";
|
||||
import { getLoggedInUserIdFromSocket } from "../../socket.io/util";
|
||||
|
||||
export async function insertToActivityLogs(activityLog: IActivityLog) {
|
||||
try {
|
||||
const {
|
||||
task_id,
|
||||
attribute_type,
|
||||
user_id,
|
||||
log_type,
|
||||
old_value,
|
||||
new_value,
|
||||
next_string
|
||||
} = activityLog;
|
||||
|
||||
const q = `
|
||||
INSERT INTO task_activity_logs (task_id, team_id, attribute_type, user_id, log_type, old_value, new_value, next_string, project_id)
|
||||
VALUES (
|
||||
$1,
|
||||
(SELECT team_id FROM projects WHERE id = (SELECT project_id FROM tasks WHERE tasks.id = $1)),
|
||||
$2,
|
||||
$3,
|
||||
$4,
|
||||
$5,
|
||||
$6,
|
||||
$7,
|
||||
(SELECT project_id FROM tasks WHERE tasks.id = $1));
|
||||
`;
|
||||
await db.query(q, [task_id, attribute_type, user_id, log_type, old_value, new_value, next_string]);
|
||||
} catch (e) {
|
||||
log_error(e);
|
||||
}
|
||||
}
|
||||
|
||||
export async function getTaskDetails(task_id: string, column: string) {
|
||||
try {
|
||||
const q = `SELECT ${column}
|
||||
FROM tasks
|
||||
WHERE id = $1;`;
|
||||
const result = await db.query(q, [task_id]);
|
||||
const [data] = result.rows;
|
||||
return data;
|
||||
} catch (e) {
|
||||
log_error(e);
|
||||
}
|
||||
}
|
||||
|
||||
export async function getTaskPhaseDetails(task_id: string) {
|
||||
try {
|
||||
const q = `SELECT phase_id FROM task_phase WHERE task_id = $1`;
|
||||
const result = await db.query(q, [task_id]);
|
||||
const [data] = result.rows;
|
||||
return data ? data : {phase_id: null};
|
||||
} catch (e) {
|
||||
log_error(e);
|
||||
}
|
||||
}
|
||||
|
||||
export async function logStartDateChange(activityLog: IActivityLog) {
|
||||
const { task_id, new_value, old_value } = activityLog;
|
||||
|
||||
if (!task_id || !activityLog.socket) return;
|
||||
if (!(moment(old_value).isSame(moment(new_value), "date"))) {
|
||||
activityLog.user_id = getLoggedInUserIdFromSocket(activityLog.socket);
|
||||
activityLog.log_type = IActivityLogChangeType.UPDATE;
|
||||
activityLog.attribute_type = IActivityLogAttributeTypes.START_DATE;
|
||||
activityLog.new_value = activityLog.new_value ? moment(activityLog.new_value).format("YYYY-MM-DD") : null;
|
||||
activityLog.old_value = activityLog.old_value ? moment(activityLog.old_value).format("YYYY-MM-DD") : null;
|
||||
|
||||
insertToActivityLogs(activityLog);
|
||||
}
|
||||
}
|
||||
|
||||
export async function logEndDateChange(activityLog: IActivityLog) {
|
||||
const { task_id, new_value, old_value } = activityLog;
|
||||
|
||||
if (!task_id || !activityLog.socket) return;
|
||||
if (!(moment(old_value).isSame(moment(new_value), "date"))) {
|
||||
activityLog.user_id = getLoggedInUserIdFromSocket(activityLog.socket);
|
||||
activityLog.log_type = IActivityLogChangeType.UPDATE;
|
||||
activityLog.attribute_type = IActivityLogAttributeTypes.END_DATE;
|
||||
activityLog.new_value = activityLog.new_value ? moment(activityLog.new_value).format("YYYY-MM-DD") : null;
|
||||
activityLog.old_value = activityLog.old_value ? moment(activityLog.old_value).format("YYYY-MM-DD") : null;
|
||||
|
||||
insertToActivityLogs(activityLog);
|
||||
}
|
||||
}
|
||||
|
||||
export async function logNameChange(activityLog: IActivityLog) {
|
||||
const { task_id, new_value, old_value } = activityLog;
|
||||
|
||||
if (!task_id || !activityLog.socket) return;
|
||||
if (old_value !== new_value) {
|
||||
activityLog.user_id = getLoggedInUserIdFromSocket(activityLog.socket);
|
||||
activityLog.log_type = IActivityLogChangeType.UPDATE;
|
||||
activityLog.attribute_type = IActivityLogAttributeTypes.NAME;
|
||||
|
||||
insertToActivityLogs(activityLog);
|
||||
}
|
||||
}
|
||||
|
||||
export async function logTotalMinutes(activityLog: IActivityLog) {
|
||||
const { task_id, new_value, old_value } = activityLog;
|
||||
|
||||
if (!task_id || !activityLog.socket) return;
|
||||
if (old_value !== new_value) {
|
||||
activityLog.user_id = getLoggedInUserIdFromSocket(activityLog.socket);
|
||||
activityLog.log_type = IActivityLogChangeType.UPDATE;
|
||||
activityLog.attribute_type = IActivityLogAttributeTypes.ESTIMATION;
|
||||
|
||||
insertToActivityLogs(activityLog);
|
||||
}
|
||||
}
|
||||
|
||||
export async function logMemberAssignment(activityLog: IActivityLog) {
|
||||
const { task_id, new_value, old_value } = activityLog;
|
||||
|
||||
const q = `SELECT user_id, name
|
||||
FROM team_member_info_view
|
||||
WHERE team_member_id = $1;`;
|
||||
const result = await db.query(q, [new_value]);
|
||||
const [data] = result.rows;
|
||||
|
||||
if (!task_id || !activityLog.socket) return;
|
||||
if (old_value !== new_value) {
|
||||
activityLog.new_value = data.user_id || null;
|
||||
activityLog.user_id = getLoggedInUserIdFromSocket(activityLog.socket);
|
||||
activityLog.log_type = activityLog.assign_type === "ASSIGN" ? IActivityLogChangeType.ASSIGN : IActivityLogChangeType.UNASSIGN;
|
||||
activityLog.attribute_type = IActivityLogAttributeTypes.ASSIGNEES;
|
||||
activityLog.next_string = data.name || null;
|
||||
|
||||
insertToActivityLogs(activityLog);
|
||||
}
|
||||
}
|
||||
|
||||
export async function logLabelsUpdate(activityLog: IActivityLog) {
|
||||
const { task_id, new_value, old_value } = activityLog;
|
||||
|
||||
const q = `SELECT EXISTS(SELECT task_id FROM task_labels WHERE task_id = $1 AND label_id = $2)`;
|
||||
const result = await db.query(q, [task_id, new_value]);
|
||||
const [data] = result.rows;
|
||||
activityLog.log_type = data.exists ? IActivityLogChangeType.CREATE : IActivityLogChangeType.DELETE;
|
||||
|
||||
if (!task_id || !activityLog.socket) return;
|
||||
if (old_value !== new_value) {
|
||||
activityLog.user_id = getLoggedInUserIdFromSocket(activityLog.socket);
|
||||
activityLog.attribute_type = IActivityLogAttributeTypes.LABEL;
|
||||
|
||||
insertToActivityLogs(activityLog);
|
||||
}
|
||||
}
|
||||
|
||||
export async function logStatusChange(activityLog: IActivityLog) {
|
||||
const { task_id, new_value, old_value } = activityLog;
|
||||
|
||||
if (!task_id || !activityLog.socket) return;
|
||||
if (old_value !== new_value) {
|
||||
activityLog.user_id = getLoggedInUserIdFromSocket(activityLog.socket);
|
||||
activityLog.attribute_type = IActivityLogAttributeTypes.STATUS;
|
||||
activityLog.log_type = IActivityLogChangeType.UPDATE;
|
||||
|
||||
insertToActivityLogs(activityLog);
|
||||
}
|
||||
}
|
||||
|
||||
export async function logPriorityChange(activityLog: IActivityLog) {
|
||||
const { task_id, new_value, old_value } = activityLog;
|
||||
|
||||
if (!task_id || !activityLog.socket) return;
|
||||
if (old_value !== new_value) {
|
||||
activityLog.user_id = getLoggedInUserIdFromSocket(activityLog.socket);
|
||||
activityLog.attribute_type = IActivityLogAttributeTypes.PRIORITY;
|
||||
activityLog.log_type = IActivityLogChangeType.UPDATE;
|
||||
|
||||
insertToActivityLogs(activityLog);
|
||||
}
|
||||
}
|
||||
|
||||
export async function logDescriptionChange(activityLog: IActivityLog) {
|
||||
const { task_id, new_value, old_value } = activityLog;
|
||||
|
||||
if (!task_id || !activityLog.socket) return;
|
||||
if (old_value !== new_value) {
|
||||
activityLog.user_id = getLoggedInUserIdFromSocket(activityLog.socket);
|
||||
activityLog.attribute_type = IActivityLogAttributeTypes.DESCRIPTION;
|
||||
activityLog.log_type = IActivityLogChangeType.UPDATE;
|
||||
|
||||
insertToActivityLogs(activityLog);
|
||||
}
|
||||
}
|
||||
|
||||
export async function logPhaseChange(activityLog: IActivityLog) {
|
||||
const { task_id, new_value, old_value } = activityLog;
|
||||
if (!task_id || !activityLog.socket) return;
|
||||
|
||||
if (old_value !== new_value) {
|
||||
activityLog.user_id = getLoggedInUserIdFromSocket(activityLog.socket);
|
||||
activityLog.attribute_type = IActivityLogAttributeTypes.PHASE;
|
||||
activityLog.log_type = IActivityLogChangeType.UPDATE;
|
||||
|
||||
insertToActivityLogs(activityLog);
|
||||
}
|
||||
}
|
||||
40
worklenz-backend/src/services/activity-logs/interfaces.ts
Normal file
40
worklenz-backend/src/services/activity-logs/interfaces.ts
Normal file
@@ -0,0 +1,40 @@
|
||||
import { Socket } from "socket.io";
|
||||
|
||||
export interface IActivityLog {
|
||||
task_id?: string;
|
||||
team_id?: string;
|
||||
attribute_type?: string;
|
||||
user_id?: string | null;
|
||||
log_type?: string;
|
||||
old_value?: string | null;
|
||||
new_value?: string | null;
|
||||
assign_type?: string | null;
|
||||
change_type?: string | null;
|
||||
socket?: Socket;
|
||||
prev_string?: string | null;
|
||||
next_string?: string | null;
|
||||
}
|
||||
|
||||
export enum IActivityLogAttributeTypes {
|
||||
NAME = "name",
|
||||
STATUS = "status",
|
||||
ASSIGNEES = "assignee",
|
||||
END_DATE = "end_date",
|
||||
START_DATE = "start_date",
|
||||
PRIORITY = "priority",
|
||||
ESTIMATION = "estimation",
|
||||
LABEL = "label",
|
||||
DESCRIPTION = "description",
|
||||
ATTACHMENT = "attachment",
|
||||
COMMENT = "comment",
|
||||
ARCHIVE = "archive",
|
||||
PHASE = "phase",
|
||||
}
|
||||
|
||||
export enum IActivityLogChangeType {
|
||||
CREATE = "create",
|
||||
UPDATE = "update",
|
||||
DELETE = "delete",
|
||||
ASSIGN = "assign",
|
||||
UNASSIGN = "unassign",
|
||||
}
|
||||
Reference in New Issue
Block a user