FEAT: Atualizado agenda de contatos com canais extras
This commit is contained in:
parent
5a21257191
commit
d495698c02
@ -1,6 +1,17 @@
|
|||||||
import { Body, Controller, Get, Param, Put } from '@nestjs/common';
|
import { Body, Controller, Get, Param, Put } from '@nestjs/common';
|
||||||
import { CustomerContactsService } from './customer-contacts.service';
|
import { CustomerContactsService } from './customer-contacts.service';
|
||||||
|
|
||||||
|
interface SaveContactBody {
|
||||||
|
phone?: string | null;
|
||||||
|
whatsappPhone?: string | null;
|
||||||
|
callSmsPhone?: string | null;
|
||||||
|
email?: string | null;
|
||||||
|
name?: string | null;
|
||||||
|
company?: string | null;
|
||||||
|
note?: string | null;
|
||||||
|
userId?: number | null;
|
||||||
|
}
|
||||||
|
|
||||||
@Controller('contacts')
|
@Controller('contacts')
|
||||||
export class CustomerContactsController {
|
export class CustomerContactsController {
|
||||||
constructor(private readonly customerContactsService: CustomerContactsService) {}
|
constructor(private readonly customerContactsService: CustomerContactsService) {}
|
||||||
@ -18,11 +29,13 @@ export class CustomerContactsController {
|
|||||||
@Put(':chatId')
|
@Put(':chatId')
|
||||||
saveContact(
|
saveContact(
|
||||||
@Param('chatId') chatId: string,
|
@Param('chatId') chatId: string,
|
||||||
@Body() body: { phone?: string | null; name?: string | null; company?: string | null; note?: string | null; userId?: number | null },
|
@Body() body: SaveContactBody,
|
||||||
) {
|
) {
|
||||||
return this.customerContactsService.saveContact({
|
return this.customerContactsService.saveContact({
|
||||||
chatId: decodeURIComponent(chatId),
|
chatId: decodeURIComponent(chatId),
|
||||||
phone: body.phone,
|
phone: body.whatsappPhone || body.phone,
|
||||||
|
callSmsPhone: body.callSmsPhone,
|
||||||
|
email: body.email,
|
||||||
name: body.name,
|
name: body.name,
|
||||||
company: body.company,
|
company: body.company,
|
||||||
note: body.note,
|
note: body.note,
|
||||||
|
|||||||
@ -4,6 +4,8 @@ import { DatabaseService } from '../../infra/database/database.service';
|
|||||||
interface SaveContactInput {
|
interface SaveContactInput {
|
||||||
chatId: string;
|
chatId: string;
|
||||||
phone?: string | null;
|
phone?: string | null;
|
||||||
|
callSmsPhone?: string | null;
|
||||||
|
email?: string | null;
|
||||||
name?: string | null;
|
name?: string | null;
|
||||||
company?: string | null;
|
company?: string | null;
|
||||||
note?: string | null;
|
note?: string | null;
|
||||||
@ -19,6 +21,8 @@ export class CustomerContactsService implements OnModuleInit {
|
|||||||
CREATE TABLE IF NOT EXISTS agenda_contatos (
|
CREATE TABLE IF NOT EXISTS agenda_contatos (
|
||||||
chat_id VARCHAR(255) PRIMARY KEY,
|
chat_id VARCHAR(255) PRIMARY KEY,
|
||||||
phone VARCHAR(80) NOT NULL,
|
phone VARCHAR(80) NOT NULL,
|
||||||
|
call_sms_phone VARCHAR(80),
|
||||||
|
email VARCHAR(255),
|
||||||
name VARCHAR(255),
|
name VARCHAR(255),
|
||||||
company VARCHAR(255),
|
company VARCHAR(255),
|
||||||
note TEXT,
|
note TEXT,
|
||||||
@ -27,12 +31,17 @@ export class CustomerContactsService implements OnModuleInit {
|
|||||||
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP
|
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||||||
);
|
);
|
||||||
`);
|
`);
|
||||||
|
await this.database.query(`
|
||||||
|
ALTER TABLE agenda_contatos
|
||||||
|
ADD COLUMN IF NOT EXISTS call_sms_phone VARCHAR(80),
|
||||||
|
ADD COLUMN IF NOT EXISTS email VARCHAR(255);
|
||||||
|
`);
|
||||||
}
|
}
|
||||||
|
|
||||||
async getContact(chatId: string) {
|
async getContact(chatId: string) {
|
||||||
const result = await this.database.query(
|
const result = await this.database.query(
|
||||||
`
|
`
|
||||||
SELECT chat_id, phone, name, company, note, updated_by_user_id, created_at, updated_at
|
SELECT chat_id, phone, call_sms_phone, email, name, company, note, updated_by_user_id, created_at, updated_at
|
||||||
FROM agenda_contatos
|
FROM agenda_contatos
|
||||||
WHERE chat_id = $1
|
WHERE chat_id = $1
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
@ -46,10 +55,9 @@ export class CustomerContactsService implements OnModuleInit {
|
|||||||
async listContacts() {
|
async listContacts() {
|
||||||
const result = await this.database.query(
|
const result = await this.database.query(
|
||||||
`
|
`
|
||||||
SELECT chat_id, phone, name, company, note, updated_by_user_id, created_at, updated_at
|
SELECT chat_id, phone, call_sms_phone, email, name, company, note, updated_by_user_id, created_at, updated_at
|
||||||
FROM agenda_contatos
|
FROM agenda_contatos
|
||||||
ORDER BY updated_at DESC NULLS LAST, created_at DESC NULLS LAST
|
ORDER BY updated_at DESC NULLS LAST, created_at DESC NULLS LAST
|
||||||
LIMIT 80
|
|
||||||
`,
|
`,
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -60,20 +68,25 @@ export class CustomerContactsService implements OnModuleInit {
|
|||||||
const result = await this.database.query(
|
const result = await this.database.query(
|
||||||
`
|
`
|
||||||
INSERT INTO agenda_contatos (
|
INSERT INTO agenda_contatos (
|
||||||
chat_id, phone, name, company, note, updated_by_user_id, created_at, updated_at
|
chat_id, phone, call_sms_phone, email, name, company, note, updated_by_user_id, created_at, updated_at
|
||||||
)
|
)
|
||||||
VALUES ($1, $2, $3, $4, $5, $6, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
|
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
|
||||||
ON CONFLICT (chat_id) DO UPDATE SET
|
ON CONFLICT (chat_id) DO UPDATE SET
|
||||||
|
phone = EXCLUDED.phone,
|
||||||
|
call_sms_phone = EXCLUDED.call_sms_phone,
|
||||||
|
email = EXCLUDED.email,
|
||||||
name = EXCLUDED.name,
|
name = EXCLUDED.name,
|
||||||
company = EXCLUDED.company,
|
company = EXCLUDED.company,
|
||||||
note = EXCLUDED.note,
|
note = EXCLUDED.note,
|
||||||
updated_by_user_id = EXCLUDED.updated_by_user_id,
|
updated_by_user_id = EXCLUDED.updated_by_user_id,
|
||||||
updated_at = CURRENT_TIMESTAMP
|
updated_at = CURRENT_TIMESTAMP
|
||||||
RETURNING chat_id, phone, name, company, note, updated_by_user_id, created_at, updated_at
|
RETURNING chat_id, phone, call_sms_phone, email, name, company, note, updated_by_user_id, created_at, updated_at
|
||||||
`,
|
`,
|
||||||
[
|
[
|
||||||
input.chatId,
|
input.chatId,
|
||||||
this.normalizePhone(input.phone, input.chatId),
|
this.normalizePhone(input.phone, input.chatId),
|
||||||
|
this.normalizeOptionalPhone(input.callSmsPhone),
|
||||||
|
this.normalizeEmail(input.email),
|
||||||
this.normalizeText(input.name),
|
this.normalizeText(input.name),
|
||||||
this.normalizeText(input.company),
|
this.normalizeText(input.company),
|
||||||
this.normalizeText(input.note),
|
this.normalizeText(input.note),
|
||||||
@ -88,6 +101,8 @@ export class CustomerContactsService implements OnModuleInit {
|
|||||||
return {
|
return {
|
||||||
chat_id: chatId,
|
chat_id: chatId,
|
||||||
phone: this.normalizePhone(null, chatId),
|
phone: this.normalizePhone(null, chatId),
|
||||||
|
call_sms_phone: null,
|
||||||
|
email: null,
|
||||||
name: null,
|
name: null,
|
||||||
company: null,
|
company: null,
|
||||||
note: null,
|
note: null,
|
||||||
@ -103,6 +118,16 @@ export class CustomerContactsService implements OnModuleInit {
|
|||||||
return chatId.endsWith('@lid') ? '' : String(chatId || '').split('@')[0];
|
return chatId.endsWith('@lid') ? '' : String(chatId || '').split('@')[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private normalizeOptionalPhone(phone: string | null | undefined) {
|
||||||
|
const cleanPhone = String(phone || '').replace(/\D/g, '');
|
||||||
|
return cleanPhone || null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private normalizeEmail(value?: string | null) {
|
||||||
|
const email = String(value || '').trim().toLowerCase();
|
||||||
|
return email || null;
|
||||||
|
}
|
||||||
|
|
||||||
private normalizeText(value?: string | null) {
|
private normalizeText(value?: string | null) {
|
||||||
const text = String(value || '').trim();
|
const text = String(value || '').trim();
|
||||||
return text || null;
|
return text || null;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user