import { Request, Response } from "express"; import * as Yup from "yup"; // import { getIO } from "../libs/socket"; import authConfig from "../config/auth"; import AppError from "../errors/AppError"; import Company from "../models/Company"; import { verify } from "jsonwebtoken"; import User from "../models/User"; import CreateCompanyService from "../services/CompanyService/CreateCompanyService"; import DeleteCompanyService from "../services/CompanyService/DeleteCompanyService"; import FindAllCompaniesService from "../services/CompanyService/FindAllCompaniesService"; import ListCompaniesPlanService from "../services/CompanyService/ListCompaniesPlanService"; import ListCompaniesService from "../services/CompanyService/ListCompaniesService"; import ShowCompanyService from "../services/CompanyService/ShowCompanyService"; import ShowPlanCompanyService from "../services/CompanyService/ShowPlanCompanyService"; import UpdateCompanyService from "../services/CompanyService/UpdateCompanyService"; import UpdateSchedulesService from "../services/CompanyService/UpdateSchedulesService"; type IndexQuery = { searchParam: string; pageNumber: string; }; interface TokenPayload { id: string; username: string; profile: string; companyId: number; iat: number; exp: number; } type CompanyData = { name: string; id?: number; phone?: string; email?: string; status?: boolean; planId?: number; campaignsEnabled?: boolean; dueDate?: string; recurrence?: string; }; type SchedulesData = { schedules: []; }; export const index = async (req: Request, res: Response): Promise => { const { searchParam, pageNumber } = req.query as IndexQuery; const { companies, count, hasMore } = await ListCompaniesService({ searchParam, pageNumber }); return res.json({ companies, count, hasMore }); }; export const store = async (req: Request, res: Response): Promise => { const newCompany: CompanyData = req.body; const schema = Yup.object().shape({ name: Yup.string().required() }); try { await schema.validate(newCompany); } catch (err: any) { throw new AppError(err.message); } const company = await CreateCompanyService(newCompany); return res.status(200).json(company); }; export const show = async (req: Request, res: Response): Promise => { const { id } = req.params; const company = await ShowCompanyService(id); return res.status(200).json(company); }; export const list = async (req: Request, res: Response): Promise => { const companies: Company[] = await FindAllCompaniesService(); return res.status(200).json(companies); }; export const update = async ( req: Request, res: Response ): Promise => { const companyData: CompanyData = req.body; const schema = Yup.object().shape({ name: Yup.string() }); try { await schema.validate(companyData); } catch (err: any) { throw new AppError(err.message); } const { id } = req.params; const company = await UpdateCompanyService({ id, ...companyData }); return res.status(200).json(company); }; export const updateSchedules = async ( req: Request, res: Response ): Promise => { const { schedules }: SchedulesData = req.body; const { id } = req.params; const company = await UpdateSchedulesService({ id, schedules }); return res.status(200).json(company); }; export const remove = async ( req: Request, res: Response ): Promise => { const { id } = req.params; const company = await DeleteCompanyService(id); return res.status(200).json(company); }; export const listPlan = async (req: Request, res: Response): Promise => { const { id } = req.params; const authHeader = req.headers.authorization; const [, token] = authHeader.split(" "); const decoded = verify(token, authConfig.secret); const { id: requestUserId, profile, companyId } = decoded as TokenPayload; const requestUser = await User.findByPk(requestUserId); if (requestUser.super === true) { const company = await ShowPlanCompanyService(id); return res.status(200).json(company); } else if (companyId.toString() !== id) { return res.status(400).json({ error: "Você não possui permissão para acessar este recurso!" }); } else { const company = await ShowPlanCompanyService(id); return res.status(200).json(company); } }; export const indexPlan = async (req: Request, res: Response): Promise => { const { searchParam, pageNumber } = req.query as IndexQuery; const authHeader = req.headers.authorization; const [, token] = authHeader.split(" "); const decoded = verify(token, authConfig.secret); const { id, profile, companyId } = decoded as TokenPayload; // const company = await Company.findByPk(companyId); const requestUser = await User.findByPk(id); if (requestUser.super === true) { const companies = await ListCompaniesPlanService(); return res.json({ companies }); } else { return res.status(400).json({ error: "Você não possui permissão para acessar este recurso!" }); } };