Files
worklenz/worklenz-backend/src/controllers/notification-controller.ts

152 lines
5.4 KiB
TypeScript

import {IWorkLenzRequest} from "../interfaces/worklenz-request";
import {IWorkLenzResponse} from "../interfaces/worklenz-response";
import db from "../config/db";
import {ServerResponse} from "../models/server-response";
import WorklenzControllerBase from "./worklenz-controller-base";
import HandleExceptions from "../decorators/handle-exceptions";
import {getColor} from "../shared/utils";
export default class NotificationController extends WorklenzControllerBase {
@HandleExceptions()
public static async get(req: IWorkLenzRequest, res: IWorkLenzResponse): Promise<IWorkLenzResponse> {
const q = `
SELECT un.id,
un.message,
un.created_at,
un.read,
(SELECT name FROM teams WHERE id = un.team_id) AS team,
(SELECT name FROM projects WHERE id = t.project_id) AS project,
(SELECT color_code FROM projects WHERE id = t.project_id) AS color,
t.project_id,
t.id AS task_id,
un.team_id
FROM user_notifications un
LEFT JOIN tasks t ON un.task_id = t.id
WHERE user_id = $1
AND read = $2
ORDER BY created_at DESC
LIMIT 100;
`;
const result = await db.query(q, [req.user?.id, req.query.filter === "Read"]);
for (const item of result.rows) {
item.team_color = getColor(item.team_name);
item.url = item.project_id ? `/worklenz/projects/${item.project_id}` : null;
item.params = {task: item.task_id, tab: "tasks-list"};
}
return res.status(200).send(new ServerResponse(true, result.rows));
}
@HandleExceptions()
public static async getSettings(req: IWorkLenzRequest, res: IWorkLenzResponse): Promise<IWorkLenzResponse> {
const q = `
SELECT email_notifications_enabled, popup_notifications_enabled, show_unread_items_count, daily_digest_enabled
FROM notification_settings
WHERE user_id = $1
AND team_id = $2;
`;
const result = await db.query(q, [req.user?.id, req.user?.team_id]);
const [data] = result.rows;
const settings = {
email_notifications_enabled: !!data?.email_notifications_enabled,
popup_notifications_enabled: !!data?.popup_notifications_enabled,
show_unread_items_count: !!data?.show_unread_items_count,
daily_digest_enabled: !!data?.daily_digest_enabled
};
return res.status(200).send(new ServerResponse(true, settings));
}
@HandleExceptions()
public static async getUnreadCount(req: IWorkLenzRequest, res: IWorkLenzResponse): Promise<IWorkLenzResponse> {
const q = `
SELECT COALESCE(COUNT(*)::INTEGER, 0) AS notifications_count,
(SELECT COALESCE(COUNT(*)::INTEGER, 0) FROM email_invitations WHERE email = (SELECT email FROM users WHERE id = $1)) AS invitations_count
FROM user_notifications
WHERE user_id = $1
AND read = false
`;
const result = await db.query(q, [req.user?.id]);
const [data] = result.rows;
return res.status(200).send(new ServerResponse(true, data.notifications_count + data.invitations_count));
}
@HandleExceptions()
public static async updateSettings(req: IWorkLenzRequest, res: IWorkLenzResponse): Promise<IWorkLenzResponse> {
const q = `
UPDATE notification_settings
SET email_notifications_enabled = $3,
popup_notifications_enabled = $4,
show_unread_items_count = $5,
daily_digest_enabled = $6
WHERE user_id = $1
AND team_id = $2
RETURNING email_notifications_enabled,
popup_notifications_enabled,
show_unread_items_count,
daily_digest_enabled;
`;
const result = await db.query(q, [
req.user?.id,
req.user?.team_id,
!!req.body.email_notifications_enabled,
!!req.body.popup_notifications_enabled,
!!req.body.show_unread_items_count,
!!req.body.daily_digest_enabled
]);
const [data] = result.rows;
const settings = {
email_notifications_enabled: !!data?.email_notifications_enabled,
popup_notifications_enabled: !!data?.popup_notifications_enabled,
show_unread_items_count: !!data?.show_unread_items_count,
daily_digest_enabled: !!data?.daily_digest_enabled
};
return res.status(200).send(new ServerResponse(true, settings));
}
@HandleExceptions()
public static async update(req: IWorkLenzRequest, res: IWorkLenzResponse): Promise<IWorkLenzResponse> {
const q = `
UPDATE user_notifications
SET read = TRUE
WHERE id = $1
AND user_id = $2;
`;
const result = await db.query(q, [req.params.id, req.user?.id]);
return res.status(200).send(new ServerResponse(true, result.rows));
}
@HandleExceptions()
public static async delete(req: IWorkLenzRequest, res: IWorkLenzResponse): Promise<IWorkLenzResponse> {
const q = `
DELETE
FROM user_notifications
WHERE id = $1
AND user_id = $2
`;
const result = await db.query(q, [req.params.id, req.user?.id]);
return res.status(200).send(new ServerResponse(true, result.rows));
}
@HandleExceptions()
public static async readAll(req: IWorkLenzRequest, res: IWorkLenzResponse): Promise<IWorkLenzResponse> {
const q = `
UPDATE user_notifications
SET read = TRUE
WHERE user_id = $1
AND read IS FALSE;
`;
const result = await db.query(q, [req.user?.id]);
return res.status(200).send(new ServerResponse(true, result.rows));
}
}