ContactListController.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. import * as Yup from "yup";
  2. import { Request, Response } from "express";
  3. import { getIO } from "../libs/socket";
  4. import ListService from "../services/ContactListService/ListService";
  5. import CreateService from "../services/ContactListService/CreateService";
  6. import ShowService from "../services/ContactListService/ShowService";
  7. import UpdateService from "../services/ContactListService/UpdateService";
  8. import DeleteService from "../services/ContactListService/DeleteService";
  9. import FindService from "../services/ContactListService/FindService";
  10. import { head } from "lodash";
  11. import ContactList from "../models/ContactList";
  12. import AppError from "../errors/AppError";
  13. import { ImportContacts } from "../services/ContactListService/ImportContacts";
  14. type IndexQuery = {
  15. searchParam: string;
  16. pageNumber: string;
  17. companyId: string | number;
  18. };
  19. type StoreData = {
  20. name: string;
  21. companyId: string;
  22. };
  23. type FindParams = {
  24. companyId: string;
  25. };
  26. export const index = async (req: Request, res: Response): Promise<Response> => {
  27. const { searchParam, pageNumber } = req.query as IndexQuery;
  28. const { companyId } = req.user;
  29. const { records, count, hasMore } = await ListService({
  30. searchParam,
  31. pageNumber,
  32. companyId
  33. });
  34. return res.json({ records, count, hasMore });
  35. };
  36. export const store = async (req: Request, res: Response): Promise<Response> => {
  37. const { companyId } = req.user;
  38. const data = req.body as StoreData;
  39. const schema = Yup.object().shape({
  40. name: Yup.string().required()
  41. });
  42. try {
  43. await schema.validate(data);
  44. } catch (err: any) {
  45. throw new AppError(err.message);
  46. }
  47. const record = await CreateService({
  48. ...data,
  49. companyId
  50. });
  51. const io = getIO();
  52. io.to(`company-${companyId}-mainchannel`).emit(`company-${companyId}-ContactList`, {
  53. action: "create",
  54. record
  55. });
  56. return res.status(200).json(record);
  57. };
  58. export const show = async (req: Request, res: Response): Promise<Response> => {
  59. const { id } = req.params;
  60. const record = await ShowService(id);
  61. return res.status(200).json(record);
  62. };
  63. export const update = async (
  64. req: Request,
  65. res: Response
  66. ): Promise<Response> => {
  67. const data = req.body as StoreData;
  68. const { companyId } = req.user;
  69. const schema = Yup.object().shape({
  70. name: Yup.string().required()
  71. });
  72. try {
  73. await schema.validate(data);
  74. } catch (err: any) {
  75. throw new AppError(err.message);
  76. }
  77. const { id } = req.params;
  78. const record = await UpdateService({
  79. ...data,
  80. id
  81. });
  82. const io = getIO();
  83. io.to(`company-${companyId}-mainchannel`).emit(`company-${companyId}-ContactList`, {
  84. action: "update",
  85. record
  86. });
  87. return res.status(200).json(record);
  88. };
  89. export const remove = async (
  90. req: Request,
  91. res: Response
  92. ): Promise<Response> => {
  93. const { id } = req.params;
  94. const { companyId } = req.user;
  95. await DeleteService(id);
  96. const io = getIO();
  97. io.to(`company-${companyId}-mainchannel`).emit(`company-${companyId}-ContactList`, {
  98. action: "delete",
  99. id
  100. });
  101. return res.status(200).json({ message: "Contact list deleted" });
  102. };
  103. export const findList = async (
  104. req: Request,
  105. res: Response
  106. ): Promise<Response> => {
  107. const params = req.query as FindParams;
  108. const records: ContactList[] = await FindService(params);
  109. return res.status(200).json(records);
  110. };
  111. export const upload = async (req: Request, res: Response) => {
  112. const files = req.files as Express.Multer.File[];
  113. const file: Express.Multer.File = head(files) as Express.Multer.File;
  114. const { id } = req.params;
  115. const { companyId } = req.user;
  116. const response = await ImportContacts(+id, companyId, file);
  117. const io = getIO();
  118. io.to(`company-${companyId}-mainchannel`).emit(`company-${companyId}-ContactListItem-${+id}`, {
  119. action: "reload",
  120. records: response
  121. });
  122. return res.status(200).json(response);
  123. };