diff --git a/.gitignore b/.gitignore index 01da7893..f4772bac 100644 --- a/.gitignore +++ b/.gitignore @@ -5,9 +5,11 @@ dist !public/.gitkeep .env .env.test +.env.exemple .cache logs/ WWebJS/ +.vscode/ yarn.lock diff --git a/backend/.env.example b/backend/.env.example deleted file mode 100644 index e8477f2c..00000000 --- a/backend/.env.example +++ /dev/null @@ -1,68 +0,0 @@ -#NODE_ENV=prod - -# ambiente -NODE_ENV=dev - -# URL do backend para construção dos hooks -BACKEND_URL=http://localhost - -# URL do front para liberação do cors -FRONTEND_URL=http://localhost:3003 - -# Porta utilizada para proxy com o serviço do backend -PROXY_PORT=3100 - -# Porta que o serviço do backend deverá ouvir -PORT=3000 - - -# conexão com o banco de dados -DB_DIALECT=postgres -DB_PORT=5432 -POSTGRES_HOST=host.docker.internal -POSTGRES_USER=postgres -POSTGRES_PASSWORD=postgres -POSTGRES_DB=izing - - -# Chaves para criptografia do token jwt -JWT_SECRET=DPHmNRZWZ4isLF9vXkMv1QabvpcA80Rc -JWT_REFRESH_SECRET=EMPehEbrAdi7s8fGSeYzqGQbV5wrjH4i - -# Dados de conexão com o REDIS -IO_REDIS_SERVER=izing-redis -IO_REDIS_PORT='6379' -IO_REDIS_DB_SESSION='2' -#IO_REDIS_PASSWORD= - -#CHROME_BIN=/usr/bin/google-chrome -#CHROME_BIN=/usr/bin/google-chrome-stable -#CHROME_BIN=null - -# tempo para randomização da mensagem de horário de funcionamento -MIN_SLEEP_BUSINESS_HOURS=10000 -MAX_SLEEP_BUSINESS_HOURS=20000 - -# tempo para randomização das mensagens do bot -MIN_SLEEP_AUTO_REPLY=4000 -MAX_SLEEP_AUTO_REPLY=6000 - -# tempo para randomização das mensagens gerais -MIN_SLEEP_INTERVAL=2000 -MAX_SLEEP_INTERVAL=5000 - - -# dados do RabbitMQ / Para não utilizar, basta comentar a var AMQP_URL -RABBITMQ_DEFAULT_USER=admin -RABBITMQ_DEFAULT_PASS=123456 -# AMQP_URL='amqp://admin:123456@host.docker.internal:5672?connection_attempts=5&retry_delay=5' - -# api oficial (integração em desenvolvimento) -API_URL_360=https://waba-sandbox.360dialog.io - -# usado para mosrar opções não disponíveis normalmente. -ADMIN_DOMAIN=izing.io - -# Dados para utilização do canal do facebook -FACEBOOK_APP_ID=3237415623048660 -FACEBOOK_APP_SECRET_KEY=3266214132b8c98ac59f3e957a5efeaaa13500 diff --git a/backend/.gitignore b/backend/.gitignore index c93373d3..1cb4523c 100644 --- a/backend/.gitignore +++ b/backend/.gitignore @@ -5,9 +5,11 @@ dist !public/.gitkeep .env .env.test +.env.exemple .cache logs/ WWebJS/ +.vscode/ yarn.lock diff --git a/backend/.vscode/launch.json b/backend/.vscode/launch.json index 505dc7a9..75d71425 100644 --- a/backend/.vscode/launch.json +++ b/backend/.vscode/launch.json @@ -2,32 +2,13 @@ "version": "0.2.0", "configurations": [ { - "name": "Attach Node.js", - "processId": "${command:PickProcess}", + "name": "Backend", "request": "attach", "restart": true, - "trace": true, - "sourceMaps": true, "skipFiles": [ "/**" ], "type": "node" - }, - { - "type": "node", - "request": "launch", - "restart": true, - "smartStep": true, - "name": "Debug TypeScript in Node.js", - // "preLaunchTask": "npm: build", - "preLaunchTask": "tsc: build - tsconfig.json", - "program": "${workspaceFolder}/src/server.ts", - "cwd": "${workspaceFolder}", - "outputCapture": "std", - "protocol": "inspector", - "outFiles": [ - "${workspaceFolder}/dist/**/*.js" - ] } ] } diff --git a/backend/.vscode/settings.json b/backend/.vscode/settings.json index 1d14a163..3375df39 100644 --- a/backend/.vscode/settings.json +++ b/backend/.vscode/settings.json @@ -9,7 +9,7 @@ "activityBar.activeBorder": "#ee1179", "activityBar.background": "#fbed80", "activityBar.foreground": "#15202b", - "activityBar.inactiveForeground": "#15202b99", + "activityBar.inactiveForeground": "#080b0e99", "activityBarBadge.background": "#06b9a5", "activityBarBadge.foreground": "#15202b", "sash.hoverBorder": "#fbed80", diff --git a/backend/docker-compose.yml b/backend/docker-compose.yml index cf26facd..140ea3f7 100644 --- a/backend/docker-compose.yml +++ b/backend/docker-compose.yml @@ -1,33 +1,10 @@ version: '3' services: - izing-backend: - build: - context: . - dockerfile: ./Dockerfile - env_file: - - ./.env - stdin_open: true - tty: true - extra_hosts: - - "host.docker.internal:host-gateway" - volumes: - - ".:/usr/src/app" - # - "/var/izing-media:/usr/src/app/public/" - networks: - - izing_network - - izing_db_network - depends_on: - - izing-redis - - izing-db - - izing-rabbitmq - izing-redis: container_name: "izing-redis" image: 'redis:latest' restart: always - extra_hosts: - - "host.docker.internal:host-gateway" ports: - "6379:6379" env_file: @@ -37,37 +14,10 @@ services: networks: - izing_db_network - # database containers, one for each db - izing-fixPermissionsPostregres: - image: 'bitnami/postgresql:14' - user: root - command: chown -R 1001:1001 /bitnami/postgresql - volumes: - - "/var/izing/pg:/bitnami/postgresql/data" - - izing-db: - image: 'bitnami/postgresql:14' - restart: always - container_name: "izing-db" - extra_hosts: - - "host.docker.internal:host-gateway" - env_file: - - ./.env - volumes: - - "/var/izing/pg:/bitnami/postgresql/data" - ports: - - "5432:5432" - depends_on: - - izing-fixPermissionsPostregres - networks: - - izing_db_network - izing-rabbitmq: image: rabbitmq:3-management hostname: izing-rabbit restart: always - extra_hosts: - - "host.docker.internal:host-gateway" env_file: - ./.env healthcheck: diff --git a/backend/package-lock.json b/backend/package-lock.json index 8e418ded..264aa06e 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -2475,9 +2475,9 @@ "optional": true }, "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "optional": true, "requires": { "core-util-is": "~1.0.0", @@ -4371,9 +4371,9 @@ "optional": true }, "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "optional": true, "requires": { "core-util-is": "~1.0.0", @@ -8064,9 +8064,9 @@ "optional": true }, "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "optional": true, "requires": { "core-util-is": "~1.0.0", @@ -8853,9 +8853,9 @@ "dev": true }, "node-webpmux": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/node-webpmux/-/node-webpmux-3.1.4.tgz", - "integrity": "sha512-EgKZEB+T5AG7rbs2i39W+HBqU6OmOTz1EvioPRq2LYW+fZen/l3EKTC5ekkU7cl4/OflTCFRPXy0kIhi+4FunQ==" + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/node-webpmux/-/node-webpmux-3.1.5.tgz", + "integrity": "sha512-yfZBMbISp425P8TGKEh2vrOafRBOatwQqiDYDQrEddBYork6gpKPXHbqSU3bOmoIc2fEJ8p+IXiqa1OP+mZPhg==" }, "nodemon": { "version": "2.0.20", @@ -12257,9 +12257,9 @@ "optional": true }, "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "optional": true, "requires": { "core-util-is": "~1.0.0", @@ -12483,9 +12483,9 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "whatsapp-web.js": { - "version": "1.19.4", - "resolved": "https://registry.npmjs.org/whatsapp-web.js/-/whatsapp-web.js-1.19.4.tgz", - "integrity": "sha512-qwfdauW3rKsI2gzRexFU5y+SumXjuZTidyZXFIXaWfPzMe4ejxAkVoj/u27wyNZDqK3Z8tI/Ac3ZJFG60VgA6w==", + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/whatsapp-web.js/-/whatsapp-web.js-1.19.5.tgz", + "integrity": "sha512-tavnhcQEbmlTzzLDVqqxIjWllsOwM0/5hhASame3bKEUT7Wk+q0z8g3cYMk43Eqdip1bK1rqUvwzzD3lDNfwCA==", "requires": { "@pedroslopez/moduleraid": "^5.0.2", "archiver": "^5.3.1", diff --git a/backend/package.json b/backend/package.json index c68f7235..a4a620d9 100644 --- a/backend/package.json +++ b/backend/package.json @@ -37,8 +37,8 @@ "fluent-ffmpeg": "^2.1.2", "helmet": "^4.4.1", "http-graceful-shutdown": "^2.4.0", - "instagram_mqtt": "^1.2.2", "instagram-private-api": "^1.45.3", + "instagram_mqtt": "^1.2.2", "ioredis": "^5.2.4", "is-base64": "^1.1.0", "jsonwebtoken": "^8.5.1", diff --git a/backend/src/controllers/CampaignController.ts b/backend/src/controllers/CampaignController.ts index 0258b2ce..6e14495b 100644 --- a/backend/src/controllers/CampaignController.ts +++ b/backend/src/controllers/CampaignController.ts @@ -62,10 +62,10 @@ export const store = async (req: Request, res: Response): Promise => { export const index = async (req: Request, res: Response): Promise => { const { tenantId } = req.user; - const tags = await ListCampaignService({ + const campaing = await ListCampaignService({ tenantId }); - return res.status(200).json(tags); + return res.status(200).json(campaing); }; export const update = async ( diff --git a/backend/src/controllers/TicketController.ts b/backend/src/controllers/TicketController.ts index 51f4ac4e..ec44d740 100644 --- a/backend/src/controllers/TicketController.ts +++ b/backend/src/controllers/TicketController.ts @@ -156,14 +156,13 @@ export const update = async ( isTransference, userIdRequest }); - - //enviar mensagem de despedida ao encerrar atendimento + //enviar mensagem de despedida ao encerrar atendimento if (ticket.status === "closed") { const whatsapp = await Whatsapp.findOne({ where: { id: ticket.whatsappId, tenantId } - }); + }); if(whatsapp?.farewellMessage){ - await SendWhatsAppMessage({body: generateMessage(`${whatsapp?.farewellMessage}`, ticket), ticket}); + await SendWhatsAppMessage({body: generateMessage(`${whatsapp?.farewellMessage}`, ticket), ticket}); } }; diff --git a/backend/src/models/Contact.ts b/backend/src/models/Contact.ts index 5e7d39a7..2599e29c 100644 --- a/backend/src/models/Contact.ts +++ b/backend/src/models/Contact.ts @@ -92,9 +92,6 @@ class Contact extends Model { @HasMany(() => ContactCustomField) extraInfo: ContactCustomField[]; - // @HasMany(() => ContactTag) - // tags: ContactTag[]; - @BelongsToMany(() => Tags, () => ContactTag, "contactId", "tagId") tags: Tags[]; @@ -128,23 +125,4 @@ class Contact extends Model { instance.profilePicUrl = profilePicUrl; } } - -// Contact.sequelize?.define("Contact", { -// scheduledMessages: { -// type: DataTypes.VIRTUAL, -// async get() { -// const contactId = 4077; -// const messages = await Message.findAll({ -// where: { -// contactId, -// scheduleDate: { [Op.not]: null }, -// status: "pending" -// }, -// logging: console.log -// }); -// return messages; -// } -// } -// }); - export default Contact; diff --git a/backend/src/services/TicketServices/CreateLogTicketService.ts b/backend/src/services/TicketServices/CreateLogTicketService.ts index 50655aaf..0b473b43 100644 --- a/backend/src/services/TicketServices/CreateLogTicketService.ts +++ b/backend/src/services/TicketServices/CreateLogTicketService.ts @@ -1,5 +1,3 @@ -// import AppError from "../../errors/AppError"; -// import socketEmit from "../../helpers/socketEmit"; import LogTicket from "../../models/LogTicket"; type logType = @@ -37,12 +35,6 @@ const CreateLogTicketService = async ({ type, queueId }); - - // socketEmit({ - // tenantId, - // type: "ticket:update", - // payload: ticket - // }); }; export default CreateLogTicketService; diff --git a/backend/src/services/TicketServices/UpdateTicketService.ts b/backend/src/services/TicketServices/UpdateTicketService.ts index 2810896d..8c74c216 100644 --- a/backend/src/services/TicketServices/UpdateTicketService.ts +++ b/backend/src/services/TicketServices/UpdateTicketService.ts @@ -1,14 +1,9 @@ import AppError from "../../errors/AppError"; import CheckContactOpenTickets from "../../helpers/CheckContactOpenTickets"; import SetTicketMessagesAsRead from "../../helpers/SetTicketMessagesAsRead"; -import Contact from "../../models/Contact"; import Ticket from "../../models/Ticket"; -import User from "../../models/User"; import socketEmit from "../../helpers/socketEmit"; import CreateLogTicketService from "./CreateLogTicketService"; -import GetTicketWbot from "../../helpers/GetTicketWbot"; -import { generateMessage } from "../../utils/mustache"; -import Whatsapp from "../../models/Whatsapp"; interface TicketData { status?: string; @@ -41,26 +36,7 @@ const UpdateTicketService = async ({ const { status, userId, tenantId, queueId } = ticketData; const ticket = await Ticket.findOne({ - where: { id: ticketId, tenantId }, - include: [ - { - model: Contact, - as: "contact", - include: [ - "extraInfo", - "tags", - { - association: "wallets", - attributes: ["id", "name"] - } - ] - }, - { - model: User, - as: "user", - attributes: ["id", "name"] - } - ] + where: { id: ticketId, tenantId } }); if (!ticket) { @@ -68,12 +44,8 @@ const UpdateTicketService = async ({ } await SetTicketMessagesAsRead(ticket); - - const wbot = await GetTicketWbot(ticket); - const oldStatus = ticket.status; const oldUserId = ticket.user?.id; - if (oldStatus === "closed") { await CheckContactOpenTickets(ticket.contact.id); } @@ -87,10 +59,6 @@ const UpdateTicketService = async ({ userId }; - const whatsapp = await Whatsapp.findOne({ - where: { id: ticket.whatsappId, tenantId } - }); - // se atendimento for encerrado, informar data da finalização if (statusData === "closed") { data.closedAt = new Date().getTime(); @@ -142,9 +110,9 @@ const UpdateTicketService = async ({ // recebeu o atendimento tansferido if (userId) { await CreateLogTicketService({ + type: "receivedTransfer", userId, - ticketId, - type: "receivedTransfer" + ticketId }); } } @@ -154,15 +122,6 @@ const UpdateTicketService = async ({ if (isTransference) { await ticket.setDataValue("isTransference", true); } - - //enviar mensagem de saudação ao iniciar o atendimento - if (statusData === "open") { - if(whatsapp?.greetingMessage){ - await wbot.sendMessage(`${ticket.contact.number}@${ticket.isGroup ? "g" : "c"}.us`, - generateMessage(`${whatsapp?.greetingMessage}`, ticket), - ) - } - } socketEmit({ tenantId, diff --git a/backend/src/services/UserServices/AuthUserSerice.ts b/backend/src/services/UserServices/AuthUserSerice.ts index 4c3678d1..fe8c4d1a 100644 --- a/backend/src/services/UserServices/AuthUserSerice.ts +++ b/backend/src/services/UserServices/AuthUserSerice.ts @@ -26,16 +26,6 @@ const AuthUserService = async ({ where: { email }, include: [{ model: Queue, as: "queues" }] }); - // attributes: [ - // "id", - // "email", - // "name", - // "lastLogin", - // "profile", - // "tenantId", - // "configs", - // "isOnline" - // ] if (!user) { throw new AppError("ERR_INVALID_CREDENTIALS", 401); diff --git a/backend/src/services/WbotServices/SyncContactsWhatsappInstanceService.ts b/backend/src/services/WbotServices/SyncContactsWhatsappInstanceService.ts index 59ec2f98..d4990112 100644 --- a/backend/src/services/WbotServices/SyncContactsWhatsappInstanceService.ts +++ b/backend/src/services/WbotServices/SyncContactsWhatsappInstanceService.ts @@ -38,28 +38,19 @@ const SyncContactsWhatsappInstanceService = async ( ); if (dataArray.length) { const d = "2022-07-15 14:48:04"; - const query = `INSERT INTO Contacts (number, name, tenantId, createdAt, updatedAt) VALUES + const query = `INSERT INTO "Contacts" ("name", "number", "tenantId") VALUES ${dataArray .map((e: any) => { - return `('${e.number}', - '${e.name}', - '${e.tenantId}', - '${d}'::timestamp, - '${d}'::timestamp)`; + return `('${e.name}', + '${e.number}', + ${e.tenantId})`; }) - .join(",")} - ON CONFLICT (number, tenantId) DO UPDATE SET name = EXCLUDED.name, number = EXCLUDED.number;`; + .join(",")}`; await Contact.sequelize?.query(query, { type: QueryTypes.INSERT, logging: console.log }); - // await Contact.bulkCreate(dataArray, { - // fields: ["number", "name", "tenantId"], - // updateOnDuplicate: ["number", "name"], - // logging: console.log - // }); - console.log("sql contact"); } } catch (error) { console.error(error);