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 schedulingNotifiyRoutes from "./SchedulingNotifyRoutes";
|
||||||
import statusChatEndRoutes from "./statusChatEndRoutes";
|
import statusChatEndRoutes from "./statusChatEndRoutes";
|
||||||
import wbotMonitorRoutes from "./wbotMonitorRoutes";
|
import wbotMonitorRoutes from "./wbotMonitorRoutes";
|
||||||
|
import iamRoutesEL from "./iamRoutesEL";
|
||||||
|
|
||||||
const routes = Router();
|
const routes = Router();
|
||||||
|
|
||||||
|
|
||||||
|
routes.use(iamRoutesEL);
|
||||||
routes.use(userRoutes);
|
routes.use(userRoutes);
|
||||||
routes.use("/auth", authRoutes);
|
routes.use("/auth", authRoutes);
|
||||||
routes.use(settingRoutes);
|
routes.use(settingRoutes);
|
||||||
|
|
Loading…
Reference in New Issue