oex2003/evolution-api
0
1import { Auth, ConfigService, ProviderSession } from '@config/env.config';2import { Logger } from '@config/logger.config';3import axios from 'axios';4import { execFileSync } from 'child_process';5 6type ResponseSuccess = { status: number; data?: any };7type ResponseProvider = Promise<[ResponseSuccess?, Error?]>;8 9export class ProviderFiles {10 constructor(private readonly configService: ConfigService) {11 this.baseUrl = `http://${this.config.HOST}:${this.config.PORT}/session/${this.config.PREFIX}`;12 this.globalApiToken = this.configService.get<Auth>('AUTHENTICATION').API_KEY.KEY;13 }14 15 private readonly logger = new Logger('ProviderFiles');16 17 private baseUrl: string;18 private globalApiToken: string;19 20 private readonly config = Object.freeze(this.configService.get<ProviderSession>('PROVIDER'));21 22 get isEnabled() {23 return !!this.config?.ENABLED;24 }25 26 public async onModuleInit() {27 if (this.config.ENABLED) {28 const url = `http://${this.config.HOST}:${this.config.PORT}`;29 try {30 const response = await axios.options(url + '/ping');31 if (response?.data != 'pong') {32 throw new Error('Offline file provider.');33 }34 35 await axios.post(`${url}/session`, { group: this.config.PREFIX }, { headers: { apikey: this.globalApiToken } });36 } catch (error) {37 this.logger.error(['Failed to connect to the file server', error?.message, error?.stack]);38 const pid = process.pid;39 execFileSync('kill', ['-9', `${pid}`]);40 }41 }42 }43 44 public async onModuleDestroy() {45 //46 }47 48 public async create(instance: string): ResponseProvider {49 try {50 const response = await axios.post(51 `${this.baseUrl}`,52 {53 instance,54 },55 { headers: { apikey: this.globalApiToken } },56 );57 return [{ status: response.status, data: response?.data }];58 } catch (error) {59 return [60 {61 status: error?.response?.status,62 data: error?.response?.data,63 },64 error,65 ];66 }67 }68 69 public async write(instance: string, key: string, data: any): ResponseProvider {70 try {71 const response = await axios.post(`${this.baseUrl}/${instance}/${key}`, data, {72 headers: { apikey: this.globalApiToken },73 });74 return [{ status: response.status, data: response?.data }];75 } catch (error) {76 return [77 {78 status: error?.response?.status,79 data: error?.response?.data,80 },81 error,82 ];83 }84 }85 86 public async read(instance: string, key: string): ResponseProvider {87 try {88 const response = await axios.get(`${this.baseUrl}/${instance}/${key}`, {89 headers: { apikey: this.globalApiToken },90 });91 return [{ status: response.status, data: response?.data }];92 } catch (error) {93 return [94 {95 status: error?.response?.status,96 data: error?.response?.data,97 },98 error,99 ];100 }101 }102 103 public async delete(instance: string, key: string): ResponseProvider {104 try {105 const response = await axios.delete(`${this.baseUrl}/${instance}/${key}`, {106 headers: { apikey: this.globalApiToken },107 });108 return [{ status: response.status, data: response?.data }];109 } catch (error) {110 return [111 {112 status: error?.response?.status,113 data: error?.response?.data,114 },115 error,116 ];117 }118 }119 120 public async allInstances(): ResponseProvider {121 try {122 const response = await axios.get(`${this.baseUrl}/list-instances`, { headers: { apikey: this.globalApiToken } });123 return [{ status: response.status, data: response?.data as string[] }];124 } catch (error) {125 return [126 {127 status: error?.response?.status,128 data: error?.response?.data,129 },130 error,131 ];132 }133 }134 135 public async removeSession(instance: string): ResponseProvider {136 try {137 const response = await axios.delete(`${this.baseUrl}/${instance}`, { headers: { apikey: this.globalApiToken } });138 return [{ status: response.status, data: response?.data }];139 } catch (error) {140 return [141 {142 status: error?.response?.status,143 data: error?.response?.data,144 },145 error,146 ];147 }148 }149}150 