127 lines
3.9 KiB
TypeScript
127 lines
3.9 KiB
TypeScript
import {Server, Socket} from "socket.io";
|
|
import db from "../../config/db";
|
|
import WorklenzControllerBase from "../../controllers/worklenz-controller-base";
|
|
import {NotificationsService} from "../../services/notifications/notifications.service";
|
|
import {getColor} from "../../shared/utils";
|
|
import {SocketEvents} from "../events";
|
|
|
|
import {getLoggedInUserIdFromSocket, log_error, notifyProjectUpdates} from "../util";
|
|
import {logMemberAssignment} from "../../services/activity-logs/activity-logs.service";
|
|
|
|
export interface ITaskAssignee {
|
|
team_member_id?: string;
|
|
project_member_id?: string;
|
|
name?: string;
|
|
avatar_url?: string;
|
|
user_id?: string;
|
|
}
|
|
|
|
export async function getAssignees(taskId: string): Promise<ITaskAssignee[]> {
|
|
const result1 = await db.query("SELECT get_task_assignees($1) AS assignees;", [taskId]);
|
|
const [d] = result1.rows;
|
|
const assignees = d.assignees || [];
|
|
|
|
assignees.forEach((a: any) => a.color_code = getColor(a.name));
|
|
|
|
return assignees;
|
|
}
|
|
|
|
export async function getTeamMembers(teamId: string) {
|
|
const result = await db.query("SELECT get_team_members($1, NULL) AS members;", [teamId]);
|
|
const [data] = result.rows;
|
|
return data?.members || [];
|
|
}
|
|
|
|
export async function runAssignOrRemove(data: any, isAssignment = false) {
|
|
const q = isAssignment
|
|
? "SELECT create_task_assignee($1, $2, $3, $4) AS data;"
|
|
: `SELECT remove_task_assignee($1, $2, $3) AS data;`;
|
|
|
|
const params = isAssignment
|
|
? [data.team_member_id, data.project_id, data.task_id, data.reporter_id]
|
|
: [data.task_id, data.team_member_id, data.project_id];
|
|
|
|
const result = await db.query(q, params);
|
|
const [assignment] = result.rows;
|
|
|
|
return assignment.data as {
|
|
user_id: string;
|
|
team_id: string;
|
|
task_id?: string;
|
|
project_member_id?: string;
|
|
team_member_id?: string;
|
|
} || null;
|
|
}
|
|
|
|
export async function on_quick_assign_or_remove(_io: Server, socket: Socket, data?: string) {
|
|
try {
|
|
const body = JSON.parse(data as string);
|
|
const isAssign = body.mode == 0;
|
|
const userId = getLoggedInUserIdFromSocket(socket);
|
|
|
|
const assignment = await runAssignOrRemove(body, isAssign);
|
|
const assignees = await getAssignees(body.task_id);
|
|
const members = await getTeamMembers(body.team_id);
|
|
// for inline display
|
|
const names = WorklenzControllerBase.createTagList(assignees);
|
|
|
|
const type = isAssign ? "ASSIGN" : "UNASSIGN";
|
|
|
|
logMemberAssignment({
|
|
task_id: body.task_id,
|
|
socket,
|
|
new_value: body.team_member_id,
|
|
old_value: null,
|
|
assign_type: type
|
|
});
|
|
|
|
if (userId !== assignment.user_id) {
|
|
NotificationsService.createTaskUpdate(
|
|
type,
|
|
userId as string,
|
|
body.task_id,
|
|
assignment.user_id,
|
|
assignment.team_id
|
|
);
|
|
|
|
}
|
|
notifyProjectUpdates(socket, body.task_id);
|
|
const res = {id: body.task_id, parent_task: body.parent_task, members, assignees, names, mode: body.mode, team_member_id: body.team_member_id};
|
|
socket.emit(SocketEvents.QUICK_ASSIGNEES_UPDATE.toString(), res);
|
|
return;
|
|
} catch (error) {
|
|
log_error(error);
|
|
}
|
|
|
|
socket.emit(SocketEvents.QUICK_ASSIGNEES_UPDATE.toString(), null);
|
|
}
|
|
|
|
export async function assignMemberIfNot(taskId: string, userId: string, teamId: string, io: Server, socket: Socket) {
|
|
try {
|
|
const q = `
|
|
SELECT
|
|
team_member_id,
|
|
(SELECT project_id FROM tasks WHERE id = $1) as project_id,
|
|
(SELECT parent_task_id FROM tasks WHERE id = $1) as parent_task_id
|
|
FROM team_member_info_view WHERE user_id = $2 AND team_id = $3
|
|
`;
|
|
|
|
const result = await db.query(q, [taskId, userId, teamId]);
|
|
const [data] = result.rows;
|
|
|
|
const body = {
|
|
team_member_id: data.team_member_id,
|
|
project_id: data.project_id,
|
|
task_id: taskId,
|
|
reporter_id: userId,
|
|
mode: 0,
|
|
parent_task: data.parent_task_id
|
|
};
|
|
|
|
await on_quick_assign_or_remove(io, socket, JSON.stringify(body));
|
|
|
|
} catch (e) {
|
|
log_error(e);
|
|
}
|
|
}
|