feat: add base structure to EL-IAM integration
parent
279c4697dd
commit
4c7e49fb9a
|
@ -0,0 +1,38 @@
|
|||
# O que fazer?
|
||||
|
||||
- Quando um usuário for criado na plataforma do E-trust Horacius, a aplicação do Omnihit deve criar o mesmo usuário no Banco de Dados do Omnihit.
|
||||
- Criação
|
||||
- Atualização
|
||||
- Exclusão
|
||||
- Quando um usuário for criado com um **profile(role)**, a aplicação do Omnihit deve alterar o profile
|
||||
- Tipos de roles: `admin`, `user`, `supervisor`
|
||||
- Atualização
|
||||
- Exclusão
|
||||
|
||||
# Como fazer?
|
||||
|
||||
- Elaborar forma de autenticação
|
||||
- Criar uma aplicação REST seguindo o protocolo especificado na documentação do Horacius
|
||||
- Níveis
|
||||
- 1: Da para fazer
|
||||
- 2: Tem que analisar
|
||||
- Users
|
||||
- [] CheckUser (1)
|
||||
- [] CreateUser (1)
|
||||
- [] DeleteUser (1)
|
||||
- [] UpdateUser (1)
|
||||
- [] ListAllUsers **OPCIONAL**
|
||||
- [] LockUser (2)
|
||||
- [] UnlockUser (2)
|
||||
- [] ResetPassword (2)
|
||||
- Rights
|
||||
- [] CheckUserRight (1)
|
||||
- [] CreateRight (1)
|
||||
- [] UpdateRight (1)
|
||||
- [] DeleteRight (1)
|
||||
- [] GetAllRights **OPCIONAL**
|
||||
- Users X Rights
|
||||
- [] LinkUserAndUserRight (1)
|
||||
- [] UnlinkUserAndUserRight (1)
|
||||
- [] GetAllUserRights **OPCIONAL**
|
||||
|
|
@ -0,0 +1,314 @@
|
|||
import { Request, Response } from "express";
|
||||
import { getIO } from "../libs/socket";
|
||||
|
||||
import AppError from "../errors/AppError";
|
||||
|
||||
import CreateUserService from "../services/UserServices/CreateUserService";
|
||||
import ListUsersService from "../services/UserServices/ListUsersService";
|
||||
import UpdateUserService from "../services/UserServices/UpdateUserService";
|
||||
import ShowUserService from "../services/UserServices/ShowUserService";
|
||||
import DeleteUserService from "../services/UserServices/DeleteUserService";
|
||||
|
||||
import ListUser from "../services/UserServices/ListUserParamiterService";
|
||||
import { del, get, set } from "../helpers/RedisClient";
|
||||
|
||||
import {
|
||||
startWhoIsOnlineMonitor,
|
||||
stopWhoIsOnlineMonitor
|
||||
} from "../helpers/WhoIsOnlineMonitor";
|
||||
|
||||
import { format, subMonths } from "date-fns";
|
||||
import { ptBR } from "date-fns/locale";
|
||||
import CountTicketsByUserQueue from "../services/UserServices/CountTicketsByUserQueue";
|
||||
import { splitDateTime } from "../helpers/SplitDateTime";
|
||||
import ListUserByWhatsappQueuesService from "../services/UserServices/ListUserByWhatsappQueuesService";
|
||||
import { getSettingValue } from "../helpers/WhaticketSettings";
|
||||
import { setBotInfo } from "../helpers/SetBotInfo";
|
||||
|
||||
type IndexQuery = {
|
||||
searchParam: string;
|
||||
pageNumber: string;
|
||||
profile?: string;
|
||||
userId: string;
|
||||
};
|
||||
|
||||
export const index = async (req: Request, res: Response): Promise<Response> => {
|
||||
const { searchParam, pageNumber, profile } = req.query as IndexQuery;
|
||||
|
||||
const { users, count, hasMore } = await ListUsersService({
|
||||
searchParam,
|
||||
pageNumber,
|
||||
profile
|
||||
});
|
||||
|
||||
if (req.user.profile !== "master") {
|
||||
let auxUsers: Array<object> = [];
|
||||
|
||||
// for (var user of users) {
|
||||
// if (user.profile !== 'master') {
|
||||
// auxUsers.push(user)
|
||||
// }
|
||||
// }
|
||||
|
||||
for (var user of users) {
|
||||
if (user.profile !== "master") {
|
||||
if (req.user.profile == "supervisor" && user.profile == "admin")
|
||||
continue;
|
||||
|
||||
auxUsers.push(user);
|
||||
}
|
||||
}
|
||||
|
||||
return res.json({ users: auxUsers, count, hasMore });
|
||||
}
|
||||
|
||||
return res.json({ users, count, hasMore });
|
||||
|
||||
// const { users, count, hasMore } = await ListUsersService({
|
||||
// searchParam,
|
||||
// pageNumber
|
||||
// });
|
||||
|
||||
// if(req.user.profile!=='master'){
|
||||
|
||||
// let auxUsers: Array<object> = [];
|
||||
|
||||
// for (var user of users) {
|
||||
// if(user.profile!=='master'){
|
||||
// auxUsers.push(user)
|
||||
// }
|
||||
// }
|
||||
|
||||
// return res.json({ users: auxUsers, count, hasMore });
|
||||
// }
|
||||
|
||||
// return res.json({ users, count, hasMore });
|
||||
};
|
||||
|
||||
export const all = async (req: Request, res: Response): Promise<Response> => {
|
||||
let { userId, profile }: any = req.query as IndexQuery;
|
||||
|
||||
console.log(
|
||||
"userId: ",
|
||||
userId,
|
||||
" | profile: ",
|
||||
profile,
|
||||
' | getSettingValue("queueTransferByWhatsappScope")?.value: ',
|
||||
getSettingValue("queueTransferByWhatsappScope")?.value
|
||||
);
|
||||
|
||||
if (getSettingValue("queueTransferByWhatsappScope")?.value == "enabled") {
|
||||
if (!userId) return res.json({ users: [], queues: [] });
|
||||
|
||||
const obj = await ListUserByWhatsappQueuesService(
|
||||
userId,
|
||||
'"admin", "user", "supervisor"'
|
||||
);
|
||||
|
||||
const usersByWhatsqueue = obj.users;
|
||||
const queues = obj.queues;
|
||||
|
||||
let userIds = usersByWhatsqueue.map((w: any) => w.userId);
|
||||
|
||||
const users = await ListUser({
|
||||
userIds
|
||||
});
|
||||
|
||||
return res.json({ users, queues });
|
||||
} else {
|
||||
const users = await ListUser({
|
||||
profile
|
||||
});
|
||||
return res.json({ users });
|
||||
}
|
||||
};
|
||||
|
||||
export const store = async (req: Request, res: Response): Promise<Response> => {
|
||||
const { email, password, name, profile, positionCompany, queueIds } =
|
||||
req.body;
|
||||
|
||||
console.log("===========> req.url: ", req.url);
|
||||
|
||||
if (
|
||||
req.url === "/user" &&
|
||||
getSettingValue("userCreation")?.value == "disabled" &&
|
||||
req.user.profile == "admin"
|
||||
) {
|
||||
throw new AppError("ERR_NO_PERMISSION", 403);
|
||||
} else if (
|
||||
req.url === "/signup" &&
|
||||
getSettingValue("userCreation")?.value == "disabled"
|
||||
) {
|
||||
throw new AppError("ERR_USER_CREATION_DISABLED", 403);
|
||||
} else if (req.user.profile !== "master") {
|
||||
throw new AppError("ERR_NO_PERMISSION", 403);
|
||||
}
|
||||
|
||||
const user = await CreateUserService({
|
||||
email,
|
||||
password,
|
||||
name,
|
||||
positionCompany,
|
||||
profile,
|
||||
queueIds
|
||||
});
|
||||
|
||||
if (user) {
|
||||
const { id, name } = user;
|
||||
await set(`user:${id}`, { id, name });
|
||||
}
|
||||
|
||||
const io = getIO();
|
||||
io.emit("user", {
|
||||
action: "create",
|
||||
user
|
||||
});
|
||||
|
||||
// await stopWhoIsOnlineMonitor()
|
||||
await startWhoIsOnlineMonitor();
|
||||
|
||||
return res.status(200).json(user);
|
||||
};
|
||||
|
||||
export const show = async (req: Request, res: Response): Promise<Response> => {
|
||||
const { userId } = req.params;
|
||||
|
||||
const user = await ShowUserService(userId);
|
||||
|
||||
return res.status(200).json(user);
|
||||
};
|
||||
|
||||
export const logoutUser = async (
|
||||
req: Request,
|
||||
res: Response
|
||||
): Promise<Response> => {
|
||||
const { userId } = req.params;
|
||||
|
||||
await stopWhoIsOnlineMonitor();
|
||||
|
||||
let onlineTime = {
|
||||
userId: userId,
|
||||
status: "logout..."
|
||||
};
|
||||
|
||||
const io = getIO();
|
||||
io.emit("onlineStatus", {
|
||||
action: "logout",
|
||||
userOnlineTime: onlineTime
|
||||
});
|
||||
|
||||
await startWhoIsOnlineMonitor();
|
||||
//
|
||||
|
||||
return res.status(200).json({});
|
||||
};
|
||||
|
||||
export const update = async (
|
||||
req: Request,
|
||||
res: Response
|
||||
): Promise<Response> => {
|
||||
if (
|
||||
req.user.profile !== "admin" &&
|
||||
req.user.profile !== "master" &&
|
||||
req.user.profile !== "supervisor"
|
||||
) {
|
||||
throw new AppError("ERR_NO_PERMISSION", 403);
|
||||
}
|
||||
|
||||
const { userId } = req.params;
|
||||
const userData = req.body;
|
||||
|
||||
const dateToday = splitDateTime(
|
||||
new Date(format(new Date(), "yyyy-MM-dd HH:mm:ss", { locale: ptBR }))
|
||||
);
|
||||
|
||||
const currentDate = new Date();
|
||||
const tenMonthsAgo = subMonths(currentDate, 10);
|
||||
const formattedDate = format(tenMonthsAgo, "yyyy-MM-dd");
|
||||
console.log("dateToday.fullDate: ", dateToday.fullDate);
|
||||
console.log("formattedDate 10 months ago: ", formattedDate);
|
||||
|
||||
const openByUserOnQueue: any[] = await CountTicketsByUserQueue({
|
||||
startDate: formattedDate,
|
||||
endDate: dateToday.fullDate,
|
||||
status: "open",
|
||||
clientChatStart: true,
|
||||
userId: userId
|
||||
});
|
||||
|
||||
// console.log('------> openByUserOnQueue: ', openByUserOnQueue)
|
||||
// console.log()
|
||||
// console.log('------> 1 userData.queueIds: ', userData.queueIds)
|
||||
|
||||
let userQueuesAttendance = [];
|
||||
|
||||
if ((openByUserOnQueue && openByUserOnQueue.length) > 0) {
|
||||
userQueuesAttendance = openByUserOnQueue.filter(
|
||||
(e: any) => !userData.queueIds.includes(e.queueId)
|
||||
);
|
||||
|
||||
if (userQueuesAttendance && userQueuesAttendance.length > 0) {
|
||||
const queueInAttendance = userQueuesAttendance.map(e => e.queueId);
|
||||
|
||||
const mergedSet = new Set([...userData.queueIds, ...queueInAttendance]);
|
||||
|
||||
// Convert the Set back to an array
|
||||
userData.queueIds = Array.from(mergedSet);
|
||||
|
||||
// console.log('------> 2 userData.queueIds: ', userData.queueIds)
|
||||
}
|
||||
}
|
||||
|
||||
let user: any = await UpdateUserService({ userData, userId });
|
||||
|
||||
await setBotInfo(user);
|
||||
|
||||
if (user) {
|
||||
const { id, name } = user;
|
||||
await set(`user:${id}`, { id, name });
|
||||
}
|
||||
|
||||
const io = getIO();
|
||||
io.emit("user", {
|
||||
action: "update",
|
||||
user
|
||||
});
|
||||
|
||||
user.userQueuesAttendance = userQueuesAttendance;
|
||||
|
||||
return res.status(200).json(user);
|
||||
};
|
||||
|
||||
export const remove = async (
|
||||
req: Request,
|
||||
res: Response
|
||||
): Promise<Response> => {
|
||||
const { userId } = req.params;
|
||||
|
||||
if (req.user.profile !== "master") {
|
||||
throw new AppError("ERR_NO_PERMISSION", 403);
|
||||
}
|
||||
|
||||
await DeleteUserService(userId);
|
||||
|
||||
del(`user:${userId}`);
|
||||
|
||||
const io = getIO();
|
||||
io.emit("user", {
|
||||
action: "delete",
|
||||
userId
|
||||
});
|
||||
|
||||
//test del
|
||||
await stopWhoIsOnlineMonitor();
|
||||
|
||||
io.emit("onlineStatus", {
|
||||
action: "delete",
|
||||
userOnlineTime: userId
|
||||
});
|
||||
|
||||
await startWhoIsOnlineMonitor();
|
||||
//
|
||||
|
||||
return res.status(200).json({ message: "User deleted" });
|
||||
};
|
|
@ -0,0 +1,23 @@
|
|||
import { Router } from "express";
|
||||
|
||||
import isAuth from "../middleware/isAuth";
|
||||
import * as IAMControllerEL from "../controllers/IAMControllerEL";
|
||||
|
||||
const iamRoutesEL = Router();
|
||||
|
||||
|
||||
iamRoutesEL.get("/users/all", isAuth, IAMControllerEL.all);
|
||||
|
||||
iamRoutesEL.get("/users", isAuth, IAMControllerEL.index);
|
||||
|
||||
iamRoutesEL.post("/users", isAuth, IAMControllerEL.store);
|
||||
|
||||
iamRoutesEL.put("/users/:userId", isAuth, IAMControllerEL.update);
|
||||
|
||||
iamRoutesEL.get("/users/:userId", isAuth, IAMControllerEL.show);
|
||||
|
||||
iamRoutesEL.get("/users/logout/:userId", isAuth, IAMControllerEL.logoutUser);
|
||||
|
||||
iamRoutesEL.delete("/users/:userId", isAuth, IAMControllerEL.remove);
|
||||
|
||||
export default iamRoutesEL;
|
|
@ -14,10 +14,12 @@ import reportRoutes from "./reportRoutes";
|
|||
import schedulingNotifiyRoutes from "./SchedulingNotifyRoutes";
|
||||
import statusChatEndRoutes from "./statusChatEndRoutes";
|
||||
import wbotMonitorRoutes from "./wbotMonitorRoutes";
|
||||
import iamRoutesEL from "./iamRoutesEL";
|
||||
|
||||
const routes = Router();
|
||||
|
||||
|
||||
routes.use(iamRoutesEL);
|
||||
routes.use(userRoutes);
|
||||
routes.use("/auth", authRoutes);
|
||||
routes.use(settingRoutes);
|
||||
|
|
Loading…
Reference in New Issue