import * as Yup from "yup"; import { Request, Response } from "express"; import { getIO } from "../libs/socket"; import ListContactsService from "../services/ContactServices/ListContactsService"; import CreateContactService from "../services/ContactServices/CreateContactService"; import ShowContactService from "../services/ContactServices/ShowContactService"; import UpdateContactService from "../services/ContactServices/UpdateContactService"; import DeleteContactService from "../services/ContactServices/DeleteContactService"; import CheckContactNumber from "../services/WbotServices/CheckNumber" import CheckIsValidContact from "../services/WbotServices/CheckIsValidContact"; import GetProfilePicUrl from "../services/WbotServices/GetProfilePicUrl"; import AppError from "../errors/AppError"; import { searchContactCache } from '../helpers/ContactsCache' import { off } from "process"; type IndexQuery = { searchParam: string; pageNumber: string; }; interface ExtraInfo { name: string; value: string; } interface ContactData { name: string; number: string; email?: string; extraInfo?: ExtraInfo[]; } export const index = async (req: Request, res: Response): Promise => { let { searchParam, pageNumber } = req.query as IndexQuery; // TEST DEL if (searchParam && searchParam.trim().length > 0 && process.env.CACHE) { try { console.log('QUERY CONTACTS FROM CACHE SEARCH PARAM: ', searchParam) const offset = 20 * (+pageNumber - 1); const data = await searchContactCache(searchParam, offset, 20) if (data) { console.log('QUERY CONTACTS FROM CACHE QUERY LENGTH: ', data.length) return res.json({ contacts: data, count: data.length, hasMore: data.length > 0 ? true : false }); } } catch (error) { console.log('There was an error on search ContactController.ts search cache: ', error) } } const { contacts, count, hasMore } = await ListContactsService({ searchParam, pageNumber }); return res.json({ contacts, count, hasMore }); }; export const store = async (req: Request, res: Response): Promise => { const newContact: ContactData = req.body; newContact.number = newContact.number.replace("-", "").replace(" ", ""); const schema = Yup.object().shape({ name: Yup.string().required(), number: Yup.string() .required() .matches(/^\d+$/, "Invalid number format. Only numbers is allowed.") }); try { await schema.validate(newContact); } catch (err) { throw new AppError(err.message); } await CheckIsValidContact(newContact.number); const validNumber: any = await CheckContactNumber(newContact.number) const profilePicUrl = await GetProfilePicUrl(validNumber); let name = newContact.name let number = validNumber let email = newContact.email let extraInfo = newContact.extraInfo const contact = await CreateContactService({ name, number, email, extraInfo, profilePicUrl }); const io = getIO(); io.emit("contact", { action: "create", contact }); return res.status(200).json(contact); }; export const show = async (req: Request, res: Response): Promise => { const { contactId } = req.params; const contact = await ShowContactService(contactId); return res.status(200).json(contact); }; export const update = async ( req: Request, res: Response ): Promise => { const contactData: ContactData = req.body; const schema = Yup.object().shape({ name: Yup.string(), number: Yup.string().matches( /^\d+$/, "Invalid number format. Only numbers is allowed." ) }); try { await schema.validate(contactData); } catch (err) { throw new AppError(err.message); } await CheckIsValidContact(contactData.number); const { contactId } = req.params; const contact = await UpdateContactService({ contactData, contactId }); const io = getIO(); io.emit("contact", { action: "update", contact }); return res.status(200).json(contact); }; export const remove = async ( req: Request, res: Response ): Promise => { const { contactId } = req.params; await DeleteContactService(contactId); const io = getIO(); io.emit("contact", { action: "delete", contactId }); return res.status(200).json({ message: "Contact deleted" }); }; export const contacsBulkInsertOnQueue = async (req: Request, res: Response): Promise => { // console.log('THE BODY: ', req.body) const { adminId, identifier, queueStatus, file } = req.body const io = getIO(); io.emit("contactsBulkInsertOnQueueStatus", { action: "update", insertOnQueue: { adminId: adminId, identifier: identifier, queueStatus: queueStatus, file: file } }); return res.status(200).json({ message: 'ok' }) };