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