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"; export default class TeamsController extends WorklenzControllerBase { @HandleExceptions() public static async create(req: IWorkLenzRequest, res: IWorkLenzResponse): Promise { const { name } = req.body; const checkAvailabilityq = `SELECT * from teams WHERE user_id = $2 AND name = $1`; const check = await db.query(checkAvailabilityq, [name, req.user?.id]); if (check.rows.length) return res.status(200).send(new ServerResponse(false, null, "Team name already exist. Try anothor!")); const q = `SELECT create_new_team($1, $2);`; const result = await db.query(q, [name, req.user?.id]); const [data] = result.rows; return res.status(200).send(new ServerResponse(true, data)); } @HandleExceptions() public static async get(req: IWorkLenzRequest, res: IWorkLenzResponse): Promise { const q = ` SELECT id, name, created_at, (id = $2) AS active, (user_id = $1) AS owner, EXISTS(SELECT 1 FROM email_invitations WHERE team_id = teams.id AND team_member_id = (SELECT id FROM team_members WHERE team_members.user_id = $1 AND team_members.team_id = teams.id)) AS pending_invitation, (CASE WHEN user_id = $1 THEN 'You' ELSE (SELECT name FROM users WHERE id = teams.user_id) END ) AS owns_by FROM teams WHERE user_id = $1 OR id IN (SELECT team_id FROM team_members WHERE team_members.user_id = $1 AND team_members.active IS TRUE) ORDER BY name; `; const result = await db.query(q, [req.user?.id, req.user?.team_id ?? null]); return res.status(200).send(new ServerResponse(true, result.rows)); } @HandleExceptions() public static async getTeamInvites(req: IWorkLenzRequest, res: IWorkLenzResponse): Promise { const q = ` SELECT id, team_id, team_member_id, (SELECT name FROM teams WHERE id = team_id) AS team_name, (SELECT name FROM users WHERE id = (SELECT user_id FROM teams WHERE id = team_id)) AS team_owner FROM email_invitations WHERE email = (SELECT email FROM users WHERE id = $1); `; const result = await db.query(q, [req.user?.id]); return res.status(200).send(new ServerResponse(true, result.rows)); } @HandleExceptions() public static async update(req: IWorkLenzRequest, res: IWorkLenzResponse): Promise { const q = `SELECT accept_invitation($1, $2, $3) AS invitation;`; const result = await db.query(q, [ req.user?.email, req.body.team_member_id, req.user?.id, ]); const [data] = result.rows; if (req.body.show_alert) { return res.status(200).send(new ServerResponse(true, data.invitation, "Team invitation accepted")); } return res.status(200).send(new ServerResponse(true, data.invitation)); } @HandleExceptions() public static async activate(req: IWorkLenzRequest, res: IWorkLenzResponse): Promise { const q = `SELECT activate_team($1, $2)`; await db.query(q, [req.body.id, req.user?.id ?? null]); return res.status(200).send(new ServerResponse(true, { subdomain: null })); } @HandleExceptions({ raisedExceptions: { "TEAM_NAME_EXISTS_ERROR": "Team name already taken. Please enter a different name." } }) public static async updateNameOnce(req: IWorkLenzRequest, res: IWorkLenzResponse): Promise { const q = `SELECT update_team_name_once($1, $2, $3);`; const result = await db.query(q, [req.user?.id, req.user?.team_id, req.body.name || null]); return res.status(200).send(new ServerResponse(true, result.rows)); } }