feat: add queue and assoc with whatsapps

This commit is contained in:
canove
2021-01-08 17:41:08 -03:00
parent a12c9db731
commit 9f99245dc4
14 changed files with 217 additions and 7 deletions

View 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);
};

View File

@@ -11,6 +11,7 @@ import UpdateWhatsAppService from "../services/WhatsappService/UpdateWhatsAppSer
interface WhatsappData {
name: string;
queueIds: number[];
status?: string;
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> => {
const { name, status, isDefault }: WhatsappData = req.body;
const { name, status, isDefault, queueIds }: WhatsappData = req.body;
const { whatsapp, oldDefaultWhatsapp } = await CreateWhatsAppService({
name,
status,
isDefault
isDefault,
queueIds
});
StartWhatsAppSession(whatsapp);
// StartWhatsAppSession(whatsapp);
const io = getIO();
io.emit("whatsapp", {

View File

@@ -6,6 +6,8 @@ import Ticket from "../models/Ticket";
import Whatsapp from "../models/Whatsapp";
import ContactCustomField from "../models/ContactCustomField";
import Message from "../models/Message";
import Queue from "../models/Queue";
import WhatsappQueue from "../models/WhatsappQueue";
// eslint-disable-next-line
const dbConfig = require("../config/database");
@@ -20,7 +22,9 @@ const models = [
Message,
Whatsapp,
ContactCustomField,
Setting
Setting,
Queue,
WhatsappQueue
];
sequelize.addModels(models);

View File

@@ -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");
}
};

View File

@@ -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");
}
};

View File

@@ -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");
}
};

View 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;

View File

@@ -10,9 +10,12 @@ import {
Default,
AllowNull,
HasMany,
Unique
Unique,
BelongsToMany
} from "sequelize-typescript";
import Queue from "./Queue";
import Ticket from "./Ticket";
import WhatsappQueue from "./WhatsappQueue";
@Table
class Whatsapp extends Model<Whatsapp> {
@@ -57,6 +60,9 @@ class Whatsapp extends Model<Whatsapp> {
@HasMany(() => Ticket)
tickets: Ticket[];
@BelongsToMany(() => Queue, () => WhatsappQueue)
queues: Array<Queue & { WhatsappQueue: WhatsappQueue }>;
}
export default Whatsapp;

View 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;

View File

@@ -8,6 +8,7 @@ import ticketRoutes from "./ticketRoutes";
import whatsappRoutes from "./whatsappRoutes";
import messageRoutes from "./messageRoutes";
import whatsappSessionRoutes from "./whatsappSessionRoutes";
import queueRoutes from "./queueRoutes";
const routes = Router();
@@ -20,5 +21,6 @@ routes.use(whatsappRoutes);
routes.use(messageRoutes);
routes.use(messageRoutes);
routes.use(whatsappSessionRoutes);
routes.use(queueRoutes);
export default routes;

View 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;

View File

@@ -5,6 +5,7 @@ import Whatsapp from "../../models/Whatsapp";
interface Request {
name: string;
queueIds: number[];
status?: string;
isDefault?: boolean;
}
@@ -17,6 +18,7 @@ interface Response {
const CreateWhatsAppService = async ({
name,
status = "OPENING",
queueIds,
isDefault = false
}: Request): Promise<Response> => {
const schema = Yup.object().shape({
@@ -68,6 +70,8 @@ const CreateWhatsAppService = async ({
isDefault
});
await whatsapp.$set("queues", queueIds);
return { whatsapp, oldDefaultWhatsapp };
};

View File

@@ -1,7 +1,12 @@
import Queue from "../../models/Queue";
import Whatsapp from "../../models/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;
};

View File

@@ -9,6 +9,7 @@ interface WhatsappData {
status?: string;
session?: string;
isDefault?: boolean;
queueIds?: number[];
}
interface Request {
@@ -30,7 +31,7 @@ const UpdateWhatsAppService = async ({
isDefault: Yup.boolean()
});
const { name, status, isDefault, session } = whatsappData;
const { name, status, isDefault, session, queueIds = [] } = whatsappData;
try {
await schema.validate({ name, status, isDefault });
@@ -63,6 +64,8 @@ const UpdateWhatsAppService = async ({
isDefault
});
await whatsapp.$set("queues", queueIds);
return { whatsapp, oldDefaultWhatsapp };
};