mirror of
https://github.com/cheveguerra/whaticket-community.git
synced 2026-04-19 20:29:17 +00:00
feat: add queue and assoc with whatsapps
This commit is contained in:
19
backend/src/controllers/QueueController.ts
Normal file
19
backend/src/controllers/QueueController.ts
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import { Request, Response } from "express";
|
||||||
|
import Queue from "../models/Queue";
|
||||||
|
|
||||||
|
// import { getIO } from "../libs/socket";
|
||||||
|
// import AppError from "../errors/AppError";
|
||||||
|
|
||||||
|
export const index = async (req: Request, res: Response): Promise<Response> => {
|
||||||
|
const queues = await Queue.findAll();
|
||||||
|
|
||||||
|
return res.status(200).json(queues);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const store = async (req: Request, res: Response): Promise<Response> => {
|
||||||
|
const { name, color } = req.body;
|
||||||
|
|
||||||
|
const queue = await Queue.create({ name, color });
|
||||||
|
|
||||||
|
return res.status(200).json(queue);
|
||||||
|
};
|
||||||
@@ -11,6 +11,7 @@ import UpdateWhatsAppService from "../services/WhatsappService/UpdateWhatsAppSer
|
|||||||
|
|
||||||
interface WhatsappData {
|
interface WhatsappData {
|
||||||
name: string;
|
name: string;
|
||||||
|
queueIds: number[];
|
||||||
status?: string;
|
status?: string;
|
||||||
isDefault?: boolean;
|
isDefault?: boolean;
|
||||||
}
|
}
|
||||||
@@ -22,15 +23,16 @@ export const index = async (req: Request, res: Response): Promise<Response> => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const store = async (req: Request, res: Response): Promise<Response> => {
|
export const store = async (req: Request, res: Response): Promise<Response> => {
|
||||||
const { name, status, isDefault }: WhatsappData = req.body;
|
const { name, status, isDefault, queueIds }: WhatsappData = req.body;
|
||||||
|
|
||||||
const { whatsapp, oldDefaultWhatsapp } = await CreateWhatsAppService({
|
const { whatsapp, oldDefaultWhatsapp } = await CreateWhatsAppService({
|
||||||
name,
|
name,
|
||||||
status,
|
status,
|
||||||
isDefault
|
isDefault,
|
||||||
|
queueIds
|
||||||
});
|
});
|
||||||
|
|
||||||
StartWhatsAppSession(whatsapp);
|
// StartWhatsAppSession(whatsapp);
|
||||||
|
|
||||||
const io = getIO();
|
const io = getIO();
|
||||||
io.emit("whatsapp", {
|
io.emit("whatsapp", {
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ import Ticket from "../models/Ticket";
|
|||||||
import Whatsapp from "../models/Whatsapp";
|
import Whatsapp from "../models/Whatsapp";
|
||||||
import ContactCustomField from "../models/ContactCustomField";
|
import ContactCustomField from "../models/ContactCustomField";
|
||||||
import Message from "../models/Message";
|
import Message from "../models/Message";
|
||||||
|
import Queue from "../models/Queue";
|
||||||
|
import WhatsappQueue from "../models/WhatsappQueue";
|
||||||
|
|
||||||
// eslint-disable-next-line
|
// eslint-disable-next-line
|
||||||
const dbConfig = require("../config/database");
|
const dbConfig = require("../config/database");
|
||||||
@@ -20,7 +22,9 @@ const models = [
|
|||||||
Message,
|
Message,
|
||||||
Whatsapp,
|
Whatsapp,
|
||||||
ContactCustomField,
|
ContactCustomField,
|
||||||
Setting
|
Setting,
|
||||||
|
Queue,
|
||||||
|
WhatsappQueue
|
||||||
];
|
];
|
||||||
|
|
||||||
sequelize.addModels(models);
|
sequelize.addModels(models);
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
import { QueryInterface, DataTypes } from "sequelize";
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
up: (queryInterface: QueryInterface) => {
|
||||||
|
return queryInterface.createTable("Queues", {
|
||||||
|
id: {
|
||||||
|
type: DataTypes.INTEGER,
|
||||||
|
autoIncrement: true,
|
||||||
|
primaryKey: true,
|
||||||
|
allowNull: false
|
||||||
|
},
|
||||||
|
name: {
|
||||||
|
type: DataTypes.STRING,
|
||||||
|
allowNull: false,
|
||||||
|
unique: true
|
||||||
|
},
|
||||||
|
color: {
|
||||||
|
type: DataTypes.STRING,
|
||||||
|
allowNull: false,
|
||||||
|
unique: true
|
||||||
|
},
|
||||||
|
createdAt: {
|
||||||
|
type: DataTypes.DATE,
|
||||||
|
allowNull: false
|
||||||
|
},
|
||||||
|
updatedAt: {
|
||||||
|
type: DataTypes.DATE,
|
||||||
|
allowNull: false
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
down: (queryInterface: QueryInterface) => {
|
||||||
|
return queryInterface.dropTable("Queues");
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
import { QueryInterface, DataTypes } from "sequelize";
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
up: (queryInterface: QueryInterface) => {
|
||||||
|
return queryInterface.addColumn("Tickets", "queueId", {
|
||||||
|
type: DataTypes.INTEGER,
|
||||||
|
references: { model: "Queues", key: "id" },
|
||||||
|
onUpdate: "CASCADE",
|
||||||
|
onDelete: "SET NULL"
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
down: (queryInterface: QueryInterface) => {
|
||||||
|
return queryInterface.removeColumn("Tickets", "queueId");
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
import { QueryInterface, DataTypes } from "sequelize";
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
up: (queryInterface: QueryInterface) => {
|
||||||
|
return queryInterface.createTable("WhatsappQueues", {
|
||||||
|
whatsappId: {
|
||||||
|
type: DataTypes.INTEGER,
|
||||||
|
primaryKey: true
|
||||||
|
},
|
||||||
|
queueId: {
|
||||||
|
type: DataTypes.INTEGER,
|
||||||
|
primaryKey: true
|
||||||
|
},
|
||||||
|
createdAt: {
|
||||||
|
type: DataTypes.DATE,
|
||||||
|
allowNull: false
|
||||||
|
},
|
||||||
|
updatedAt: {
|
||||||
|
type: DataTypes.DATE,
|
||||||
|
allowNull: false
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
down: (queryInterface: QueryInterface) => {
|
||||||
|
return queryInterface.dropTable("WhatsappQueues");
|
||||||
|
}
|
||||||
|
};
|
||||||
44
backend/src/models/Queue.ts
Normal file
44
backend/src/models/Queue.ts
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
import {
|
||||||
|
Table,
|
||||||
|
Column,
|
||||||
|
CreatedAt,
|
||||||
|
UpdatedAt,
|
||||||
|
Model,
|
||||||
|
PrimaryKey,
|
||||||
|
AutoIncrement,
|
||||||
|
AllowNull,
|
||||||
|
Unique,
|
||||||
|
BelongsToMany
|
||||||
|
} from "sequelize-typescript";
|
||||||
|
|
||||||
|
import Whatsapp from "./Whatsapp";
|
||||||
|
import WhatsappQueue from "./WhatsappQueue";
|
||||||
|
|
||||||
|
@Table
|
||||||
|
class Queue extends Model<Queue> {
|
||||||
|
@PrimaryKey
|
||||||
|
@AutoIncrement
|
||||||
|
@Column
|
||||||
|
id: number;
|
||||||
|
|
||||||
|
@AllowNull(false)
|
||||||
|
@Unique
|
||||||
|
@Column
|
||||||
|
name: string;
|
||||||
|
|
||||||
|
@AllowNull(false)
|
||||||
|
@Unique
|
||||||
|
@Column
|
||||||
|
color: string;
|
||||||
|
|
||||||
|
@CreatedAt
|
||||||
|
createdAt: Date;
|
||||||
|
|
||||||
|
@UpdatedAt
|
||||||
|
updatedAt: Date;
|
||||||
|
|
||||||
|
@BelongsToMany(() => Whatsapp, () => WhatsappQueue)
|
||||||
|
whatsapps: Array<Whatsapp & { WhatsappQueue: WhatsappQueue }>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Queue;
|
||||||
@@ -10,9 +10,12 @@ import {
|
|||||||
Default,
|
Default,
|
||||||
AllowNull,
|
AllowNull,
|
||||||
HasMany,
|
HasMany,
|
||||||
Unique
|
Unique,
|
||||||
|
BelongsToMany
|
||||||
} from "sequelize-typescript";
|
} from "sequelize-typescript";
|
||||||
|
import Queue from "./Queue";
|
||||||
import Ticket from "./Ticket";
|
import Ticket from "./Ticket";
|
||||||
|
import WhatsappQueue from "./WhatsappQueue";
|
||||||
|
|
||||||
@Table
|
@Table
|
||||||
class Whatsapp extends Model<Whatsapp> {
|
class Whatsapp extends Model<Whatsapp> {
|
||||||
@@ -57,6 +60,9 @@ class Whatsapp extends Model<Whatsapp> {
|
|||||||
|
|
||||||
@HasMany(() => Ticket)
|
@HasMany(() => Ticket)
|
||||||
tickets: Ticket[];
|
tickets: Ticket[];
|
||||||
|
|
||||||
|
@BelongsToMany(() => Queue, () => WhatsappQueue)
|
||||||
|
queues: Array<Queue & { WhatsappQueue: WhatsappQueue }>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default Whatsapp;
|
export default Whatsapp;
|
||||||
|
|||||||
29
backend/src/models/WhatsappQueue.ts
Normal file
29
backend/src/models/WhatsappQueue.ts
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
import {
|
||||||
|
Table,
|
||||||
|
Column,
|
||||||
|
CreatedAt,
|
||||||
|
UpdatedAt,
|
||||||
|
Model,
|
||||||
|
ForeignKey
|
||||||
|
} from "sequelize-typescript";
|
||||||
|
import Queue from "./Queue";
|
||||||
|
import Whatsapp from "./Whatsapp";
|
||||||
|
|
||||||
|
@Table
|
||||||
|
class WhatsappQueue extends Model<WhatsappQueue> {
|
||||||
|
@ForeignKey(() => Whatsapp)
|
||||||
|
@Column
|
||||||
|
whatsappId: number;
|
||||||
|
|
||||||
|
@ForeignKey(() => Queue)
|
||||||
|
@Column
|
||||||
|
queueId: number;
|
||||||
|
|
||||||
|
@CreatedAt
|
||||||
|
createdAt: Date;
|
||||||
|
|
||||||
|
@UpdatedAt
|
||||||
|
updatedAt: Date;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default WhatsappQueue;
|
||||||
@@ -8,6 +8,7 @@ import ticketRoutes from "./ticketRoutes";
|
|||||||
import whatsappRoutes from "./whatsappRoutes";
|
import whatsappRoutes from "./whatsappRoutes";
|
||||||
import messageRoutes from "./messageRoutes";
|
import messageRoutes from "./messageRoutes";
|
||||||
import whatsappSessionRoutes from "./whatsappSessionRoutes";
|
import whatsappSessionRoutes from "./whatsappSessionRoutes";
|
||||||
|
import queueRoutes from "./queueRoutes";
|
||||||
|
|
||||||
const routes = Router();
|
const routes = Router();
|
||||||
|
|
||||||
@@ -20,5 +21,6 @@ routes.use(whatsappRoutes);
|
|||||||
routes.use(messageRoutes);
|
routes.use(messageRoutes);
|
||||||
routes.use(messageRoutes);
|
routes.use(messageRoutes);
|
||||||
routes.use(whatsappSessionRoutes);
|
routes.use(whatsappSessionRoutes);
|
||||||
|
routes.use(queueRoutes);
|
||||||
|
|
||||||
export default routes;
|
export default routes;
|
||||||
|
|||||||
12
backend/src/routes/queueRoutes.ts
Normal file
12
backend/src/routes/queueRoutes.ts
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import { Router } from "express";
|
||||||
|
import isAuth from "../middleware/isAuth";
|
||||||
|
|
||||||
|
import * as QueueController from "../controllers/QueueController";
|
||||||
|
|
||||||
|
const queueRoutes = Router();
|
||||||
|
|
||||||
|
queueRoutes.get("/queue", isAuth, QueueController.index);
|
||||||
|
|
||||||
|
queueRoutes.post("/queue", isAuth, QueueController.store);
|
||||||
|
|
||||||
|
export default queueRoutes;
|
||||||
@@ -5,6 +5,7 @@ import Whatsapp from "../../models/Whatsapp";
|
|||||||
|
|
||||||
interface Request {
|
interface Request {
|
||||||
name: string;
|
name: string;
|
||||||
|
queueIds: number[];
|
||||||
status?: string;
|
status?: string;
|
||||||
isDefault?: boolean;
|
isDefault?: boolean;
|
||||||
}
|
}
|
||||||
@@ -17,6 +18,7 @@ interface Response {
|
|||||||
const CreateWhatsAppService = async ({
|
const CreateWhatsAppService = async ({
|
||||||
name,
|
name,
|
||||||
status = "OPENING",
|
status = "OPENING",
|
||||||
|
queueIds,
|
||||||
isDefault = false
|
isDefault = false
|
||||||
}: Request): Promise<Response> => {
|
}: Request): Promise<Response> => {
|
||||||
const schema = Yup.object().shape({
|
const schema = Yup.object().shape({
|
||||||
@@ -68,6 +70,8 @@ const CreateWhatsAppService = async ({
|
|||||||
isDefault
|
isDefault
|
||||||
});
|
});
|
||||||
|
|
||||||
|
await whatsapp.$set("queues", queueIds);
|
||||||
|
|
||||||
return { whatsapp, oldDefaultWhatsapp };
|
return { whatsapp, oldDefaultWhatsapp };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,12 @@
|
|||||||
|
import Queue from "../../models/Queue";
|
||||||
import Whatsapp from "../../models/Whatsapp";
|
import Whatsapp from "../../models/Whatsapp";
|
||||||
|
|
||||||
const ListWhatsAppsService = async (): Promise<Whatsapp[]> => {
|
const ListWhatsAppsService = async (): Promise<Whatsapp[]> => {
|
||||||
const whatsapps = await Whatsapp.findAll();
|
const whatsapps = await Whatsapp.findAll({
|
||||||
|
include: [
|
||||||
|
{ model: Queue, as: "queues", attributes: ["id", "name", "color"] }
|
||||||
|
]
|
||||||
|
});
|
||||||
|
|
||||||
return whatsapps;
|
return whatsapps;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ interface WhatsappData {
|
|||||||
status?: string;
|
status?: string;
|
||||||
session?: string;
|
session?: string;
|
||||||
isDefault?: boolean;
|
isDefault?: boolean;
|
||||||
|
queueIds?: number[];
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Request {
|
interface Request {
|
||||||
@@ -30,7 +31,7 @@ const UpdateWhatsAppService = async ({
|
|||||||
isDefault: Yup.boolean()
|
isDefault: Yup.boolean()
|
||||||
});
|
});
|
||||||
|
|
||||||
const { name, status, isDefault, session } = whatsappData;
|
const { name, status, isDefault, session, queueIds = [] } = whatsappData;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await schema.validate({ name, status, isDefault });
|
await schema.validate({ name, status, isDefault });
|
||||||
@@ -63,6 +64,8 @@ const UpdateWhatsAppService = async ({
|
|||||||
isDefault
|
isDefault
|
||||||
});
|
});
|
||||||
|
|
||||||
|
await whatsapp.$set("queues", queueIds);
|
||||||
|
|
||||||
return { whatsapp, oldDefaultWhatsapp };
|
return { whatsapp, oldDefaultWhatsapp };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user