|
|
import { InstanceDto } from '@api/dto/instance.dto'; |
|
|
import { TemplateDto } from '@api/dto/template.dto'; |
|
|
import { PrismaRepository } from '@api/repository/repository.service'; |
|
|
import { ConfigService, WaBusiness } from '@config/env.config'; |
|
|
import { Logger } from '@config/logger.config'; |
|
|
import axios from 'axios'; |
|
|
|
|
|
import { WAMonitoringService } from './monitor.service'; |
|
|
|
|
|
export class TemplateService { |
|
|
constructor( |
|
|
private readonly waMonitor: WAMonitoringService, |
|
|
public readonly prismaRepository: PrismaRepository, |
|
|
private readonly configService: ConfigService, |
|
|
) {} |
|
|
|
|
|
private readonly logger = new Logger('TemplateService'); |
|
|
|
|
|
private businessId: string; |
|
|
private token: string; |
|
|
|
|
|
public async find(instance: InstanceDto) { |
|
|
const getInstance = await this.waMonitor.waInstances[instance.instanceName].instance; |
|
|
|
|
|
if (!getInstance) { |
|
|
throw new Error('Instance not found'); |
|
|
} |
|
|
|
|
|
this.businessId = getInstance.businessId; |
|
|
this.token = getInstance.token; |
|
|
|
|
|
const response = await this.requestTemplate({}, 'GET'); |
|
|
|
|
|
if (!response) { |
|
|
throw new Error('Error to create template'); |
|
|
} |
|
|
|
|
|
return response.data; |
|
|
} |
|
|
|
|
|
public async create(instance: InstanceDto, data: TemplateDto) { |
|
|
try { |
|
|
const getInstance = await this.waMonitor.waInstances[instance.instanceName].instance; |
|
|
|
|
|
if (!getInstance) { |
|
|
throw new Error('Instance not found'); |
|
|
} |
|
|
|
|
|
this.businessId = getInstance.businessId; |
|
|
this.token = getInstance.token; |
|
|
|
|
|
const postData = { |
|
|
name: data.name, |
|
|
category: data.category, |
|
|
allow_category_change: data.allowCategoryChange, |
|
|
language: data.language, |
|
|
components: data.components, |
|
|
}; |
|
|
|
|
|
const response = await this.requestTemplate(postData, 'POST'); |
|
|
|
|
|
if (!response || response.error) { |
|
|
|
|
|
if (response && response.error) { |
|
|
|
|
|
const metaError = new Error(response.error.message || 'WhatsApp API Error'); |
|
|
(metaError as any).template = response.error; |
|
|
throw metaError; |
|
|
} |
|
|
throw new Error('Error to create template'); |
|
|
} |
|
|
|
|
|
const template = await this.prismaRepository.template.create({ |
|
|
data: { |
|
|
templateId: response.id, |
|
|
name: data.name, |
|
|
template: response, |
|
|
webhookUrl: data.webhookUrl, |
|
|
instanceId: getInstance.id, |
|
|
}, |
|
|
}); |
|
|
|
|
|
return template; |
|
|
} catch (error) { |
|
|
this.logger.error('Error in create template: ' + error); |
|
|
|
|
|
throw error; |
|
|
} |
|
|
} |
|
|
|
|
|
private async requestTemplate(data: any, method: string) { |
|
|
try { |
|
|
let urlServer = this.configService.get<WaBusiness>('WA_BUSINESS').URL; |
|
|
const version = this.configService.get<WaBusiness>('WA_BUSINESS').VERSION; |
|
|
urlServer = `${urlServer}/${version}/${this.businessId}/message_templates`; |
|
|
const headers = { 'Content-Type': 'application/json', Authorization: `Bearer ${this.token}` }; |
|
|
|
|
|
if (method === 'GET') { |
|
|
const result = await axios.get(urlServer, { headers }); |
|
|
return result.data; |
|
|
} else if (method === 'POST') { |
|
|
const result = await axios.post(urlServer, data, { headers }); |
|
|
return result.data; |
|
|
} |
|
|
} catch (e) { |
|
|
this.logger.error( |
|
|
'WhatsApp API request error: ' + (e.response?.data ? JSON.stringify(e.response?.data) : e.message), |
|
|
); |
|
|
|
|
|
|
|
|
if (e.response?.data) { |
|
|
return e.response.data; |
|
|
} |
|
|
|
|
|
|
|
|
throw new Error(`Connection error: ${e.message}`); |
|
|
} |
|
|
} |
|
|
} |
|
|
|