mirror of
https://github.com/hexastack/hexabot
synced 2025-06-26 18:27:28 +00:00
fix: apply feedback updates
This commit is contained in:
parent
f87b2d53ad
commit
60677c0435
@ -28,6 +28,8 @@ export const subscriberInstance: Subscriber = {
|
|||||||
name: 'web-channel',
|
name: 'web-channel',
|
||||||
},
|
},
|
||||||
labels: [],
|
labels: [],
|
||||||
|
avatar: null,
|
||||||
|
context: {},
|
||||||
...modelInstance,
|
...modelInstance,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -80,13 +80,13 @@ export class SubscriberStub extends BaseSchema {
|
|||||||
ref: 'User',
|
ref: 'User',
|
||||||
default: null,
|
default: null,
|
||||||
})
|
})
|
||||||
assignedTo?: unknown;
|
assignedTo: unknown;
|
||||||
|
|
||||||
@Prop({
|
@Prop({
|
||||||
type: Date,
|
type: Date,
|
||||||
default: null,
|
default: null,
|
||||||
})
|
})
|
||||||
assignedAt?: Date | null;
|
assignedAt: Date | null;
|
||||||
|
|
||||||
@Prop({
|
@Prop({
|
||||||
type: Date,
|
type: Date,
|
||||||
@ -110,13 +110,13 @@ export class SubscriberStub extends BaseSchema {
|
|||||||
ref: 'Attachment',
|
ref: 'Attachment',
|
||||||
default: null,
|
default: null,
|
||||||
})
|
})
|
||||||
avatar?: unknown;
|
avatar: unknown;
|
||||||
|
|
||||||
@Prop({
|
@Prop({
|
||||||
type: Object,
|
type: Object,
|
||||||
default: { vars: {} },
|
default: { vars: {} },
|
||||||
})
|
})
|
||||||
context?: SubscriberContext;
|
context: SubscriberContext;
|
||||||
|
|
||||||
static getChannelData<
|
static getChannelData<
|
||||||
C extends ChannelName,
|
C extends ChannelName,
|
||||||
@ -131,11 +131,11 @@ export class Subscriber extends SubscriberStub {
|
|||||||
@Transform(({ obj }) => obj.labels.map((label) => label.toString()))
|
@Transform(({ obj }) => obj.labels.map((label) => label.toString()))
|
||||||
labels: string[];
|
labels: string[];
|
||||||
|
|
||||||
@Transform(({ obj }) => (obj.assignedTo ? obj.assignedTo.toString() : null))
|
@Transform(({ obj }) => obj.assignedTo?.toString() || null)
|
||||||
assignedTo?: string | null;
|
assignedTo: string | null;
|
||||||
|
|
||||||
@Transform(({ obj }) => obj.avatar?.toString() || null)
|
@Transform(({ obj }) => obj.avatar?.toString() || null)
|
||||||
avatar?: string | null;
|
avatar: string | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Schema({ timestamps: true })
|
@Schema({ timestamps: true })
|
||||||
@ -144,7 +144,7 @@ export class SubscriberFull extends SubscriberStub {
|
|||||||
labels: Label[];
|
labels: Label[];
|
||||||
|
|
||||||
@Type(() => User)
|
@Type(() => User)
|
||||||
assignedTo?: User | null;
|
assignedTo: User | null;
|
||||||
|
|
||||||
@Type(() => Attachment)
|
@Type(() => Attachment)
|
||||||
avatar: Attachment | null;
|
avatar: Attachment | null;
|
||||||
|
|||||||
@ -193,11 +193,11 @@ describe('BlockService', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const [block] = await blockService.findAndPopulate({ patterns: ['Hi'] });
|
const [block] = await blockService.findAndPopulate({ patterns: ['Hi'] });
|
||||||
const webSubscriber = await subscriberService.findOne({
|
const webSubscriber = (await subscriberService.findOne({
|
||||||
foreign_id: 'foreign-id-web-1',
|
foreign_id: 'foreign-id-web-1',
|
||||||
});
|
}))!;
|
||||||
|
|
||||||
event.setSender(webSubscriber!);
|
event.setSender(webSubscriber);
|
||||||
|
|
||||||
let hasBotSpoken = false;
|
let hasBotSpoken = false;
|
||||||
const clearMock = jest
|
const clearMock = jest
|
||||||
@ -210,15 +210,15 @@ describe('BlockService', () => {
|
|||||||
isFallback: boolean,
|
isFallback: boolean,
|
||||||
) => {
|
) => {
|
||||||
expect(actualConversation).toEqualPayload({
|
expect(actualConversation).toEqualPayload({
|
||||||
sender: webSubscriber!.id,
|
sender: webSubscriber.id,
|
||||||
active: true,
|
active: true,
|
||||||
next: [],
|
next: [],
|
||||||
context: {
|
context: {
|
||||||
user: {
|
user: {
|
||||||
first_name: webSubscriber!.first_name,
|
first_name: webSubscriber.first_name,
|
||||||
last_name: webSubscriber!.last_name,
|
last_name: webSubscriber.last_name,
|
||||||
language: 'en',
|
language: 'en',
|
||||||
id: webSubscriber!.id,
|
id: webSubscriber.id,
|
||||||
},
|
},
|
||||||
user_location: {
|
user_location: {
|
||||||
lat: 0,
|
lat: 0,
|
||||||
@ -260,10 +260,10 @@ describe('BlockService', () => {
|
|||||||
ipAddress: '1.1.1.1',
|
ipAddress: '1.1.1.1',
|
||||||
agent: 'Chromium',
|
agent: 'Chromium',
|
||||||
});
|
});
|
||||||
const webSubscriber = await subscriberService.findOne({
|
const webSubscriber = (await subscriberService.findOne({
|
||||||
foreign_id: 'foreign-id-web-1',
|
foreign_id: 'foreign-id-web-1',
|
||||||
});
|
}))!;
|
||||||
event.setSender(webSubscriber!);
|
event.setSender(webSubscriber);
|
||||||
|
|
||||||
const clearMock = jest
|
const clearMock = jest
|
||||||
.spyOn(botService, 'handleIncomingMessage')
|
.spyOn(botService, 'handleIncomingMessage')
|
||||||
@ -278,10 +278,10 @@ describe('BlockService', () => {
|
|||||||
active: true,
|
active: true,
|
||||||
context: {
|
context: {
|
||||||
user: {
|
user: {
|
||||||
first_name: webSubscriber!.first_name,
|
first_name: webSubscriber.first_name,
|
||||||
last_name: webSubscriber!.last_name,
|
last_name: webSubscriber.last_name,
|
||||||
language: 'en',
|
language: 'en',
|
||||||
id: webSubscriber!.id,
|
id: webSubscriber.id,
|
||||||
},
|
},
|
||||||
user_location: { lat: 0, lon: 0 },
|
user_location: { lat: 0, lon: 0 },
|
||||||
vars: {},
|
vars: {},
|
||||||
@ -314,10 +314,10 @@ describe('BlockService', () => {
|
|||||||
ipAddress: '1.1.1.1',
|
ipAddress: '1.1.1.1',
|
||||||
agent: 'Chromium',
|
agent: 'Chromium',
|
||||||
});
|
});
|
||||||
const webSubscriber = await subscriberService.findOne({
|
const webSubscriber = (await subscriberService.findOne({
|
||||||
foreign_id: 'foreign-id-web-2',
|
foreign_id: 'foreign-id-web-2',
|
||||||
});
|
}))!;
|
||||||
event.setSender(webSubscriber!);
|
event.setSender(webSubscriber);
|
||||||
const captured = await botService.processConversationMessage(event);
|
const captured = await botService.processConversationMessage(event);
|
||||||
|
|
||||||
expect(captured).toBe(false);
|
expect(captured).toBe(false);
|
||||||
|
|||||||
@ -236,7 +236,7 @@ export default abstract class BaseWebChannelHandler<
|
|||||||
...message,
|
...message,
|
||||||
author: 'chatbot',
|
author: 'chatbot',
|
||||||
read: true, // Temporary fix as read is false in the bd
|
read: true, // Temporary fix as read is false in the bd
|
||||||
mid: anyMessage.mid || 'DEFAULT_MID',
|
mid: anyMessage.mid || this.generateId(),
|
||||||
handover: !!anyMessage.handover,
|
handover: !!anyMessage.handover,
|
||||||
createdAt: anyMessage.createdAt,
|
createdAt: anyMessage.createdAt,
|
||||||
});
|
});
|
||||||
@ -621,7 +621,12 @@ export default abstract class BaseWebChannelHandler<
|
|||||||
size: Buffer.byteLength(data.file),
|
size: Buffer.byteLength(data.file),
|
||||||
type: data.type,
|
type: data.type,
|
||||||
});
|
});
|
||||||
return attachment;
|
|
||||||
|
if (attachment) {
|
||||||
|
return attachment;
|
||||||
|
} else {
|
||||||
|
throw new Error('Unable to retrieve stored attachment');
|
||||||
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
this.logger.error(
|
this.logger.error(
|
||||||
'Web Channel Handler : Unable to store uploaded file',
|
'Web Channel Handler : Unable to store uploaded file',
|
||||||
@ -639,7 +644,7 @@ export default abstract class BaseWebChannelHandler<
|
|||||||
async handleWebUpload(
|
async handleWebUpload(
|
||||||
req: Request,
|
req: Request,
|
||||||
res: Response,
|
res: Response,
|
||||||
): Promise<Attachment | null> {
|
): Promise<Attachment | null | undefined> {
|
||||||
try {
|
try {
|
||||||
const upload = multer({
|
const upload = multer({
|
||||||
limits: {
|
limits: {
|
||||||
@ -665,7 +670,9 @@ export default abstract class BaseWebChannelHandler<
|
|||||||
reject(new Error('Unable to upload file!'));
|
reject(new Error('Unable to upload file!'));
|
||||||
}
|
}
|
||||||
|
|
||||||
resolve(req.file);
|
if (req.file) {
|
||||||
|
resolve(req.file);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
@ -678,12 +685,18 @@ export default abstract class BaseWebChannelHandler<
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const attachment = await this.attachmentService.store(file, {
|
if (file) {
|
||||||
name: file.originalname,
|
const attachment = await this.attachmentService.store(file, {
|
||||||
size: file.size,
|
name: file.originalname,
|
||||||
type: file.mimetype,
|
size: file.size,
|
||||||
});
|
type: file.mimetype,
|
||||||
return attachment;
|
});
|
||||||
|
if (attachment) {
|
||||||
|
return attachment;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Error('Unable to store uploaded file');
|
||||||
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
this.logger.error(
|
this.logger.error(
|
||||||
'Web Channel Handler : Unable to store uploaded file',
|
'Web Channel Handler : Unable to store uploaded file',
|
||||||
@ -703,7 +716,7 @@ export default abstract class BaseWebChannelHandler<
|
|||||||
async handleUpload(
|
async handleUpload(
|
||||||
req: Request | SocketRequest,
|
req: Request | SocketRequest,
|
||||||
res: Response | SocketResponse,
|
res: Response | SocketResponse,
|
||||||
): Promise<Attachment | null> {
|
): Promise<Attachment | null | undefined> {
|
||||||
// Check if any file is provided
|
// Check if any file is provided
|
||||||
if (!req.session.web) {
|
if (!req.session.web) {
|
||||||
this.logger.debug('Web Channel Handler : No session provided');
|
this.logger.debug('Web Channel Handler : No session provided');
|
||||||
|
|||||||
@ -27,26 +27,31 @@ type WebEventAdapter =
|
|||||||
eventType: StdEventType.unknown;
|
eventType: StdEventType.unknown;
|
||||||
messageType: never;
|
messageType: never;
|
||||||
raw: Web.Event;
|
raw: Web.Event;
|
||||||
|
attachment: never;
|
||||||
}
|
}
|
||||||
| {
|
| {
|
||||||
eventType: StdEventType.read;
|
eventType: StdEventType.read;
|
||||||
messageType: never;
|
messageType: never;
|
||||||
raw: Web.StatusReadEvent;
|
raw: Web.StatusReadEvent;
|
||||||
|
attachment: never;
|
||||||
}
|
}
|
||||||
| {
|
| {
|
||||||
eventType: StdEventType.delivery;
|
eventType: StdEventType.delivery;
|
||||||
messageType: never;
|
messageType: never;
|
||||||
raw: Web.StatusDeliveryEvent;
|
raw: Web.StatusDeliveryEvent;
|
||||||
|
attachment: never;
|
||||||
}
|
}
|
||||||
| {
|
| {
|
||||||
eventType: StdEventType.typing;
|
eventType: StdEventType.typing;
|
||||||
messageType: never;
|
messageType: never;
|
||||||
raw: Web.StatusTypingEvent;
|
raw: Web.StatusTypingEvent;
|
||||||
|
attachment: never;
|
||||||
}
|
}
|
||||||
| {
|
| {
|
||||||
eventType: StdEventType.message;
|
eventType: StdEventType.message;
|
||||||
messageType: IncomingMessageType.message;
|
messageType: IncomingMessageType.message;
|
||||||
raw: Web.IncomingMessage<Web.IncomingTextMessage>;
|
raw: Web.IncomingMessage<Web.IncomingTextMessage>;
|
||||||
|
attachment: never;
|
||||||
}
|
}
|
||||||
| {
|
| {
|
||||||
eventType: StdEventType.message;
|
eventType: StdEventType.message;
|
||||||
@ -54,11 +59,13 @@ type WebEventAdapter =
|
|||||||
| IncomingMessageType.postback
|
| IncomingMessageType.postback
|
||||||
| IncomingMessageType.quick_reply;
|
| IncomingMessageType.quick_reply;
|
||||||
raw: Web.IncomingMessage<Web.IncomingPayloadMessage>;
|
raw: Web.IncomingMessage<Web.IncomingPayloadMessage>;
|
||||||
|
attachment: never;
|
||||||
}
|
}
|
||||||
| {
|
| {
|
||||||
eventType: StdEventType.message;
|
eventType: StdEventType.message;
|
||||||
messageType: IncomingMessageType.location;
|
messageType: IncomingMessageType.location;
|
||||||
raw: Web.IncomingMessage<Web.IncomingLocationMessage>;
|
raw: Web.IncomingMessage<Web.IncomingLocationMessage>;
|
||||||
|
attachment: never;
|
||||||
}
|
}
|
||||||
| {
|
| {
|
||||||
eventType: StdEventType.message;
|
eventType: StdEventType.message;
|
||||||
@ -68,11 +75,9 @@ type WebEventAdapter =
|
|||||||
};
|
};
|
||||||
|
|
||||||
// eslint-disable-next-line prettier/prettier
|
// eslint-disable-next-line prettier/prettier
|
||||||
export default class WebEventWrapper<N extends ChannelName> extends EventWrapper<
|
export default class WebEventWrapper<
|
||||||
WebEventAdapter,
|
N extends ChannelName,
|
||||||
Web.Event,
|
> extends EventWrapper<WebEventAdapter, Web.Event, N> {
|
||||||
N
|
|
||||||
> {
|
|
||||||
/**
|
/**
|
||||||
* Constructor : channel's event wrapper
|
* Constructor : channel's event wrapper
|
||||||
*
|
*
|
||||||
|
|||||||
@ -28,6 +28,8 @@ export const subscriberInstance: Subscriber = {
|
|||||||
name: 'web-channel',
|
name: 'web-channel',
|
||||||
},
|
},
|
||||||
labels: [],
|
labels: [],
|
||||||
|
avatar: null,
|
||||||
|
context: {},
|
||||||
...modelInstance,
|
...modelInstance,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -13,16 +13,20 @@ type TSortProps<T> = {
|
|||||||
order?: 'desc' | 'asc';
|
order?: 'desc' | 'asc';
|
||||||
};
|
};
|
||||||
|
|
||||||
type TCreateAt = { createdAt?: string | Date };
|
type TCreatedAt = { createdAt?: string | Date };
|
||||||
|
|
||||||
const sort = <R extends TCreateAt, S, T extends TCreateAt = R & S>({
|
const sort = <R extends TCreatedAt, S, T extends TCreatedAt = R & S>({
|
||||||
row1,
|
row1,
|
||||||
row2,
|
row2,
|
||||||
field = 'createdAt',
|
field = 'createdAt',
|
||||||
order = 'desc',
|
order = 'desc',
|
||||||
}: TSortProps<T>) => (order === 'asc' && row1[field] > row2[field] ? 1 : -1);
|
}: TSortProps<T>) => (order === 'asc' && row1[field] > row2[field] ? 1 : -1);
|
||||||
|
|
||||||
export const sortRowsBy = <R extends TCreateAt, S, T extends TCreateAt = R & S>(
|
export const sortRowsBy = <
|
||||||
|
R extends TCreatedAt,
|
||||||
|
S,
|
||||||
|
T extends TCreatedAt = R & S,
|
||||||
|
>(
|
||||||
row1: T,
|
row1: T,
|
||||||
row2: T,
|
row2: T,
|
||||||
field?: keyof T,
|
field?: keyof T,
|
||||||
|
|||||||
2
api/types/event-emitter.d.ts
vendored
2
api/types/event-emitter.d.ts
vendored
@ -93,7 +93,7 @@ declare module '@nestjs/event-emitter' {
|
|||||||
object,
|
object,
|
||||||
{
|
{
|
||||||
block: BlockFull;
|
block: BlockFull;
|
||||||
passation: Subscriber | null;
|
passation: Subscriber;
|
||||||
'fallback-local': BlockFull;
|
'fallback-local': BlockFull;
|
||||||
'fallback-global': EventWrapper<any, any>;
|
'fallback-global': EventWrapper<any, any>;
|
||||||
intervention: Subscriber;
|
intervention: Subscriber;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user