AnnouncementController.ts 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. import * as Yup from "yup";
  2. import { Request, Response } from "express";
  3. import { getIO } from "../libs/socket";
  4. import { head } from "lodash";
  5. import fs from "fs";
  6. import path from "path";
  7. import ListService from "../services/AnnouncementService/ListService";
  8. import CreateService from "../services/AnnouncementService/CreateService";
  9. import ShowService from "../services/AnnouncementService/ShowService";
  10. import UpdateService from "../services/AnnouncementService/UpdateService";
  11. import DeleteService from "../services/AnnouncementService/DeleteService";
  12. import FindService from "../services/AnnouncementService/FindService";
  13. import Announcement from "../models/Announcement";
  14. import AppError from "../errors/AppError";
  15. type IndexQuery = {
  16. searchParam: string;
  17. pageNumber: string;
  18. companyId: string | number;
  19. };
  20. type StoreData = {
  21. priority: string;
  22. title: string;
  23. text: string;
  24. status: string;
  25. companyId: number;
  26. mediaPath?: string;
  27. mediaName?: string;
  28. };
  29. type FindParams = {
  30. companyId: string;
  31. };
  32. export const index = async (req: Request, res: Response): Promise<Response> => {
  33. const { searchParam, pageNumber } = req.query as IndexQuery;
  34. const { records, count, hasMore } = await ListService({
  35. searchParam,
  36. pageNumber
  37. });
  38. return res.json({ records, count, hasMore });
  39. };
  40. export const store = async (req: Request, res: Response): Promise<Response> => {
  41. const { companyId } = req.user;
  42. const data = req.body as StoreData;
  43. const schema = Yup.object().shape({
  44. title: Yup.string().required()
  45. });
  46. try {
  47. await schema.validate(data);
  48. } catch (err: any) {
  49. throw new AppError(err.message);
  50. }
  51. const record = await CreateService({
  52. ...data,
  53. companyId
  54. });
  55. const io = getIO();
  56. io.emit(`company-announcement`, {
  57. action: "create",
  58. record
  59. });
  60. return res.status(200).json(record);
  61. };
  62. export const show = async (req: Request, res: Response): Promise<Response> => {
  63. const { id } = req.params;
  64. const record = await ShowService(id);
  65. return res.status(200).json(record);
  66. };
  67. export const update = async (
  68. req: Request,
  69. res: Response
  70. ): Promise<Response> => {
  71. const data = req.body as StoreData;
  72. const schema = Yup.object().shape({
  73. title: Yup.string().required()
  74. });
  75. try {
  76. await schema.validate(data);
  77. } catch (err: any) {
  78. throw new AppError(err.message);
  79. }
  80. const { id } = req.params;
  81. const record = await UpdateService({
  82. ...data,
  83. id
  84. });
  85. const io = getIO();
  86. io.emit(`company-announcement`, {
  87. action: "update",
  88. record
  89. });
  90. return res.status(200).json(record);
  91. };
  92. export const remove = async (
  93. req: Request,
  94. res: Response
  95. ): Promise<Response> => {
  96. const { id } = req.params;
  97. const { companyId } = req.user;
  98. await DeleteService(id);
  99. const io = getIO();
  100. io.to(`company-${companyId}-mainchannel`).emit(`company-${companyId}-announcement`, {
  101. action: "delete",
  102. id
  103. });
  104. return res.status(200).json({ message: "Announcement deleted" });
  105. };
  106. export const findList = async (
  107. req: Request,
  108. res: Response
  109. ): Promise<Response> => {
  110. const params = req.query as FindParams;
  111. const records: Announcement[] = await FindService(params);
  112. return res.status(200).json(records);
  113. };
  114. export const mediaUpload = async (
  115. req: Request,
  116. res: Response
  117. ): Promise<Response> => {
  118. const { id } = req.params;
  119. const files = req.files as Express.Multer.File[];
  120. const file = head(files);
  121. try {
  122. const announcement = await Announcement.findByPk(id);
  123. await announcement.update({
  124. mediaPath: file.filename,
  125. mediaName: file.originalname
  126. });
  127. await announcement.reload();
  128. const io = getIO();
  129. io.emit(`company-announcement`, {
  130. action: "update",
  131. record: announcement
  132. });
  133. return res.send({ mensagem: "Mensagem enviada" });
  134. } catch (err: any) {
  135. throw new AppError(err.message);
  136. }
  137. };
  138. export const deleteMedia = async (
  139. req: Request,
  140. res: Response
  141. ): Promise<Response> => {
  142. const { id } = req.params;
  143. try {
  144. const announcement = await Announcement.findByPk(id);
  145. const filePath = path.resolve("public", announcement.mediaPath);
  146. const fileExists = fs.existsSync(filePath);
  147. if (fileExists) {
  148. fs.unlinkSync(filePath);
  149. }
  150. await announcement.update({
  151. mediaPath: null,
  152. mediaName: null
  153. });
  154. await announcement.reload();
  155. const io = getIO();
  156. io.emit(`company-announcement`, {
  157. action: "update",
  158. record: announcement
  159. });
  160. return res.send({ mensagem: "Arquivo excluído" });
  161. } catch (err: any) {
  162. throw new AppError(err.message);
  163. }
  164. };