@botonic/plugin-hubtype-analytics 0.22.0-alpha.3 → 0.22.0-alpha.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/README.md +9 -4
  2. package/lib/cjs/event-models/ht-event-agent-rating.d.ts +6 -0
  3. package/lib/cjs/event-models/ht-event-agent-rating.js +12 -0
  4. package/lib/cjs/event-models/ht-event-agent-rating.js.map +1 -0
  5. package/lib/cjs/event-models/ht-event-bot-ai-model.d.ts +6 -0
  6. package/lib/cjs/event-models/ht-event-bot-ai-model.js +15 -0
  7. package/lib/cjs/event-models/ht-event-bot-ai-model.js.map +1 -0
  8. package/lib/cjs/event-models/ht-event-bot-faq.d.ts +6 -0
  9. package/lib/cjs/event-models/ht-event-bot-faq.js +12 -0
  10. package/lib/cjs/event-models/ht-event-bot-faq.js.map +1 -0
  11. package/lib/cjs/event-models/ht-event-bot-keyword-model.d.ts +6 -0
  12. package/lib/cjs/event-models/ht-event-bot-keyword-model.js +13 -0
  13. package/lib/cjs/event-models/ht-event-bot-keyword-model.js.map +1 -0
  14. package/lib/cjs/event-models/ht-event-bot-rating.d.ts +6 -0
  15. package/lib/cjs/event-models/ht-event-bot-rating.js +14 -0
  16. package/lib/cjs/event-models/ht-event-bot-rating.js.map +1 -0
  17. package/lib/cjs/event-models/ht-event-channel-rating.d.ts +6 -0
  18. package/lib/cjs/event-models/ht-event-channel-rating.js +12 -0
  19. package/lib/cjs/event-models/ht-event-channel-rating.js.map +1 -0
  20. package/lib/cjs/event-models/ht-event-faq-useful.d.ts +6 -0
  21. package/lib/cjs/event-models/ht-event-faq-useful.js +13 -0
  22. package/lib/cjs/event-models/ht-event-faq-useful.js.map +1 -0
  23. package/lib/cjs/event-models/ht-event-handoff-fail.d.ts +6 -0
  24. package/lib/cjs/event-models/ht-event-handoff-fail.js +14 -0
  25. package/lib/cjs/event-models/ht-event-handoff-fail.js.map +1 -0
  26. package/lib/cjs/event-models/ht-event-handoff-success.d.ts +6 -0
  27. package/lib/cjs/event-models/ht-event-handoff-success.js +14 -0
  28. package/lib/cjs/event-models/ht-event-handoff-success.js.map +1 -0
  29. package/lib/cjs/event-models/ht-event.d.ts +7 -0
  30. package/lib/cjs/event-models/ht-event.js +19 -0
  31. package/lib/cjs/event-models/ht-event.js.map +1 -0
  32. package/lib/cjs/index.d.ts +7 -4
  33. package/lib/cjs/index.js +22 -11
  34. package/lib/cjs/index.js.map +1 -1
  35. package/lib/cjs/types.d.ts +70 -59
  36. package/lib/cjs/types.js.map +1 -1
  37. package/lib/cjs/utils.d.ts +3 -0
  38. package/lib/cjs/utils.js +46 -0
  39. package/lib/cjs/utils.js.map +1 -0
  40. package/lib/esm/event-models/ht-event-agent-rating.d.ts +6 -0
  41. package/lib/esm/event-models/ht-event-agent-rating.js +8 -0
  42. package/lib/esm/event-models/ht-event-agent-rating.js.map +1 -0
  43. package/lib/esm/event-models/ht-event-bot-ai-model.d.ts +6 -0
  44. package/lib/esm/event-models/ht-event-bot-ai-model.js +11 -0
  45. package/lib/esm/event-models/ht-event-bot-ai-model.js.map +1 -0
  46. package/lib/esm/event-models/ht-event-bot-faq.d.ts +6 -0
  47. package/lib/esm/event-models/ht-event-bot-faq.js +8 -0
  48. package/lib/esm/event-models/ht-event-bot-faq.js.map +1 -0
  49. package/lib/esm/event-models/ht-event-bot-keyword-model.d.ts +6 -0
  50. package/lib/esm/event-models/ht-event-bot-keyword-model.js +9 -0
  51. package/lib/esm/event-models/ht-event-bot-keyword-model.js.map +1 -0
  52. package/lib/esm/event-models/ht-event-bot-rating.d.ts +6 -0
  53. package/lib/esm/event-models/ht-event-bot-rating.js +10 -0
  54. package/lib/esm/event-models/ht-event-bot-rating.js.map +1 -0
  55. package/lib/esm/event-models/ht-event-channel-rating.d.ts +6 -0
  56. package/lib/esm/event-models/ht-event-channel-rating.js +8 -0
  57. package/lib/esm/event-models/ht-event-channel-rating.js.map +1 -0
  58. package/lib/esm/event-models/ht-event-faq-useful.d.ts +6 -0
  59. package/lib/esm/event-models/ht-event-faq-useful.js +9 -0
  60. package/lib/esm/event-models/ht-event-faq-useful.js.map +1 -0
  61. package/lib/esm/event-models/ht-event-handoff-fail.d.ts +6 -0
  62. package/lib/esm/event-models/ht-event-handoff-fail.js +10 -0
  63. package/lib/esm/event-models/ht-event-handoff-fail.js.map +1 -0
  64. package/lib/esm/event-models/ht-event-handoff-success.d.ts +6 -0
  65. package/lib/esm/event-models/ht-event-handoff-success.js +10 -0
  66. package/lib/esm/event-models/ht-event-handoff-success.js.map +1 -0
  67. package/lib/esm/event-models/ht-event.d.ts +7 -0
  68. package/lib/esm/event-models/ht-event.js +15 -0
  69. package/lib/esm/event-models/ht-event.js.map +1 -0
  70. package/lib/esm/index.d.ts +7 -4
  71. package/lib/esm/index.js +22 -11
  72. package/lib/esm/index.js.map +1 -1
  73. package/lib/esm/types.d.ts +70 -59
  74. package/lib/esm/types.js.map +1 -1
  75. package/lib/esm/utils.d.ts +3 -0
  76. package/lib/esm/utils.js +42 -0
  77. package/lib/esm/utils.js.map +1 -0
  78. package/package.json +2 -2
  79. package/src/event-models/ht-event-agent-rating.ts +16 -0
  80. package/src/event-models/ht-event-bot-ai-model.ts +19 -0
  81. package/src/event-models/ht-event-bot-faq.ts +16 -0
  82. package/src/event-models/ht-event-bot-keyword-model.ts +17 -0
  83. package/src/event-models/ht-event-bot-rating.ts +18 -0
  84. package/src/event-models/ht-event-channel-rating.ts +16 -0
  85. package/src/event-models/ht-event-faq-useful.ts +17 -0
  86. package/src/event-models/ht-event-handoff-fail.ts +18 -0
  87. package/src/event-models/ht-event-handoff-success.ts +18 -0
  88. package/src/event-models/ht-event.ts +20 -0
  89. package/src/index.ts +30 -18
  90. package/src/types.ts +76 -49
  91. package/src/utils.ts +46 -0
@@ -0,0 +1,17 @@
1
+ import {
2
+ BaseEventData,
3
+ EventBotKeywordModel,
4
+ EventDataBotKeywordModel,
5
+ RequestData,
6
+ } from '../types'
7
+ import { HtEvent } from './ht-event'
8
+
9
+ export class HtEventBotKeywordModel extends HtEvent {
10
+ event_data: BaseEventData & EventDataBotKeywordModel
11
+
12
+ constructor(event: EventBotKeywordModel, requestData: RequestData) {
13
+ super(event, requestData)
14
+ this.event_data.confidence_successful =
15
+ event.event_data.confidence_successful
16
+ }
17
+ }
@@ -0,0 +1,18 @@
1
+ import {
2
+ BaseEventData,
3
+ EventBotRating,
4
+ EventDataBotRating,
5
+ RequestData,
6
+ } from '../types'
7
+ import { HtEvent } from './ht-event'
8
+
9
+ export class HtEventBotRating extends HtEvent {
10
+ event_data: BaseEventData & EventDataBotRating
11
+
12
+ constructor(event: EventBotRating, requestData: RequestData) {
13
+ super(event, requestData)
14
+ this.event_data.rating = event.event_data.rating
15
+ this.event_data.free_comment = event.event_data.free_comment
16
+ this.event_data.selected_options = event.event_data.selected_options
17
+ }
18
+ }
@@ -0,0 +1,16 @@
1
+ import {
2
+ BaseEventData,
3
+ EventChannelRating,
4
+ EventDataRating,
5
+ RequestData,
6
+ } from '../types'
7
+ import { HtEvent } from './ht-event'
8
+
9
+ export class HtEventChannelRating extends HtEvent {
10
+ event_data: BaseEventData & EventDataRating
11
+
12
+ constructor(event: EventChannelRating, requestData: RequestData) {
13
+ super(event, requestData)
14
+ this.event_data.rating = event.event_data.rating
15
+ }
16
+ }
@@ -0,0 +1,17 @@
1
+ import {
2
+ BaseEventData,
3
+ EventDataUseful,
4
+ EventFaqUseful,
5
+ RequestData,
6
+ } from '../types'
7
+ import { HtEvent } from './ht-event'
8
+
9
+ export class HtEventFaqUseful extends HtEvent {
10
+ event_data: BaseEventData & EventDataUseful
11
+
12
+ constructor(event: EventFaqUseful, requestData: RequestData) {
13
+ super(event, requestData)
14
+ this.event_data.faq_name = event.event_data.faq_name
15
+ this.event_data.useful = event.event_data.useful
16
+ }
17
+ }
@@ -0,0 +1,18 @@
1
+ import {
2
+ BaseEventData,
3
+ EventDataHandoff,
4
+ EventHandoffFail,
5
+ RequestData,
6
+ } from '../types'
7
+ import { HtEvent } from './ht-event'
8
+
9
+ export class HtEventHandoffFail extends HtEvent {
10
+ event_data: BaseEventData & EventDataHandoff
11
+
12
+ constructor(event: EventHandoffFail, requestData: RequestData) {
13
+ super(event, requestData)
14
+ this.event_data.queue_open = event.event_data.queue_open
15
+ this.event_data.available_agents = event.event_data.available_agents
16
+ this.event_data.threshold_reached = event.event_data.threshold_reached
17
+ }
18
+ }
@@ -0,0 +1,18 @@
1
+ import {
2
+ BaseEventData,
3
+ EventDataHandoff,
4
+ EventHandoffSuccess,
5
+ RequestData,
6
+ } from '../types'
7
+ import { HtEvent } from './ht-event'
8
+
9
+ export class HtEventHandoffSuccess extends HtEvent {
10
+ event_data: BaseEventData & EventDataHandoff
11
+
12
+ constructor(event: EventHandoffSuccess, requestData: RequestData) {
13
+ super(event, requestData)
14
+ this.event_data.queue_open = event.event_data.queue_open
15
+ this.event_data.available_agents = event.event_data.available_agents
16
+ this.event_data.threshold_reached = event.event_data.threshold_reached
17
+ }
18
+ }
@@ -0,0 +1,20 @@
1
+ import { BaseEventData, EventName, HtEventProps, RequestData } from '../types'
2
+
3
+ export class HtEvent {
4
+ chat: string
5
+ event_type: EventName
6
+ event_data: BaseEventData
7
+
8
+ constructor(event: HtEventProps, requestData: RequestData) {
9
+ this.chat = requestData.userId
10
+ this.event_type = event.event_type
11
+ this.event_data = {
12
+ channel: requestData.provider,
13
+ event_datetime: new Date().toISOString(),
14
+ enduser_language: requestData.language,
15
+ enduser_country: requestData.country,
16
+ format_version: 1,
17
+ // flow_version?: string
18
+ }
19
+ }
20
+ }
package/src/index.ts CHANGED
@@ -1,20 +1,30 @@
1
1
  import { BotRequest, Plugin } from '@botonic/core'
2
2
  import axios from 'axios'
3
3
 
4
- import { HtEvent } from './types'
4
+ import { HtEventProps, RequestData } from './types'
5
+ import { createHtEvent } from './utils'
5
6
 
6
7
  export interface HubtypeAnalyticsOptions {
7
- baseUrl: string
8
+ getLaguange?: (request: BotRequest) => string
9
+ getCountry?: (request: BotRequest) => string
10
+ }
11
+
12
+ function getDefaultLanguage(request: BotRequest): string {
13
+ return request.session.user.extra_data.language
14
+ }
15
+
16
+ function getDefaultCountry(request: BotRequest): string {
17
+ return request.session.user.extra_data.country
8
18
  }
9
19
 
10
20
  export default class BotonicPluginHubtypeAnalytics implements Plugin {
11
21
  baseUrl: string
22
+ getLaguange: (request: BotRequest) => string
23
+ getCountry: (request: BotRequest) => string
12
24
  constructor(options: HubtypeAnalyticsOptions) {
13
- this.baseUrl = options.baseUrl
14
- }
15
-
16
- pre(): void {
17
- return
25
+ this.baseUrl = process.env.HUBTYPE_API_URL || 'https://api.hubtype.com'
26
+ this.getLaguange = options.getLaguange || getDefaultLanguage
27
+ this.getCountry = options.getCountry || getDefaultCountry
18
28
  }
19
29
 
20
30
  post(): void {
@@ -25,19 +35,21 @@ export default class BotonicPluginHubtypeAnalytics implements Plugin {
25
35
  return `${this.baseUrl}/external/v1/conversational_apps/${request.session.bot.id}/bot_event/`
26
36
  }
27
37
 
28
- async trackEvent(request: BotRequest, event: HtEvent) {
29
- const url = this.getUrl(request)
30
- const data = {
31
- chat: request.session.user.id,
32
- event_type: event.event_type,
33
- event_data: {
34
- ...event.event_data,
35
- event_datetime: new Date().toISOString(),
36
- channel: request.session.user.provider,
37
- },
38
+ getRequestData(request: BotRequest): RequestData {
39
+ return {
40
+ language: this.getLaguange(request),
41
+ country: this.getCountry(request),
42
+ provider: request.session.user.provider,
43
+ userId: request.session.user.id,
38
44
  }
45
+ }
46
+
47
+ async trackEvent(request: BotRequest, htEventProps: HtEventProps) {
48
+ const url = this.getUrl(request)
49
+ const requestData = this.getRequestData(request)
50
+ const event = createHtEvent(requestData, htEventProps)
39
51
  const headers = { Authorization: `Bearer ${request.session._access_token}` }
40
52
  const config = { headers }
41
- return axios.post(url, data, config)
53
+ return axios.post(url, event, config)
42
54
  }
43
55
  }
package/src/types.ts CHANGED
@@ -1,3 +1,11 @@
1
+ import { PROVIDER } from '@botonic/core'
2
+
3
+ export interface Event {
4
+ chat: string
5
+ event_type: EventName
6
+ event_data: BaseEventData
7
+ }
8
+
1
9
  export enum EventName {
2
10
  botAgentRating = 'bot_agent_rating',
3
11
  botChannelRating = 'bot_channel_rating',
@@ -13,101 +21,113 @@ export enum EventName {
13
21
  handoffSuccess = 'handoff_success',
14
22
  handoffFail = 'handoff_fail',
15
23
  }
16
-
17
- interface EventData {
18
- enduser_country?: string
24
+ export interface BaseEventData {
25
+ channel: string
26
+ event_datetime: string
19
27
  enduser_language: string
28
+ enduser_country?: string
20
29
  format_version?: number
21
30
  bot_version?: string
22
31
  flow_version?: string
23
32
  }
24
33
 
25
- export interface EventAgentRating {
26
- event_type: EventName.botAgentRating
27
- event_data: EventData & { rating: number }
34
+ export interface HtBaseEventProps {
35
+ event_type: EventName
28
36
  }
29
37
 
30
- export interface EventChannelRating {
38
+ export interface EventAgentRating extends HtBaseEventProps {
39
+ event_type: EventName.botAgentRating
40
+ event_data: EventDataRating
41
+ }
42
+ export interface EventChannelRating extends HtBaseEventProps {
31
43
  event_type: EventName.botChannelRating
32
- event_data: EventData & { rating: number }
44
+ event_data: EventDataRating
45
+ }
46
+
47
+ export interface EventDataRating {
48
+ rating: number
33
49
  }
34
50
 
35
- export interface EventFaqUseful {
51
+ export interface EventFaqUseful extends HtBaseEventProps {
36
52
  event_type: EventName.botFaqUseful
37
- event_data: EventData & { faq_name: string; useful: boolean }
53
+ event_data: EventDataUseful
38
54
  }
39
55
 
40
- export interface EventBotRating {
56
+ export interface EventDataUseful {
57
+ faq_name: string
58
+ useful: boolean
59
+ }
60
+ export interface EventBotRating extends HtBaseEventProps {
41
61
  event_type: EventName.botRating
42
- event_data: EventData & {
43
- faq_name: string
44
- useful: boolean
45
- rating: number
46
- free_comment: string
47
- selected_options: string[]
48
- }
62
+ event_data: EventDataBotRating
63
+ }
64
+
65
+ export interface EventDataBotRating {
66
+ rating: number
67
+ free_comment?: string
68
+ selected_options?: string[]
49
69
  }
50
70
 
51
- export interface EventBotFaq {
71
+ export interface EventBotFaq extends HtBaseEventProps {
52
72
  event_type: EventName.botFaq
53
- event_data: EventData & { faq_name: string }
73
+ event_data: EventDataBotFaq
54
74
  }
55
75
 
56
- export interface EventBotStart {
76
+ export interface EventDataBotFaq {
77
+ faq_name: string
78
+ }
79
+ export interface EventBotStart extends HtBaseEventProps {
57
80
  event_type: EventName.botStart
58
- event_data: EventData
59
81
  }
60
82
 
61
83
  export interface EventBotOpen {
62
84
  event_type: EventName.botOpen
63
- event_data: EventData
64
85
  }
65
86
 
66
87
  export interface EventBotAiModel {
67
88
  event_type: EventName.botAiModel
68
- event_data: EventData & {
69
- intent: string
70
- confidence: number
71
- confidence_successful: boolean
72
- }
89
+ event_data: EventDataBotAiModel
90
+ }
91
+
92
+ export interface EventDataBotAiModel {
93
+ intent: string
94
+ confidence: number
95
+ confidence_successful: boolean
73
96
  }
74
97
 
75
- export interface EventBotKeywordModel {
98
+ export interface EventBotKeywordModel extends HtBaseEventProps {
76
99
  event_type: EventName.botKeywordsModel
77
- event_data: EventData & {
78
- confidence_successful: boolean
79
- }
100
+ event_data: EventDataBotKeywordModel
80
101
  }
81
102
 
82
- export interface EventFallback {
103
+ export interface EventDataBotKeywordModel {
104
+ confidence_successful: boolean
105
+ }
106
+ export interface EventFallback extends HtBaseEventProps {
83
107
  event_type: EventName.fallback
84
- event_data: EventData
85
108
  }
86
109
 
87
- export interface EventHandoffOption {
110
+ export interface EventHandoffOption extends HtBaseEventProps {
88
111
  event_type: EventName.handoffOption
89
- event_data: EventData
90
112
  }
91
113
 
92
- export interface EventHandoffSuccess {
114
+ export interface EventHandoffSuccess extends HtBaseEventProps {
93
115
  event_type: EventName.handoffSuccess
94
- event_data: EventData & {
95
- queue_open: boolean
96
- available_agents: boolean
97
- threshold_reached: boolean
98
- }
116
+ event_data: EventDataHandoff
99
117
  }
100
118
 
101
- export interface EventHandoffFail {
119
+ export interface EventHandoffFail extends HtBaseEventProps {
102
120
  event_type: EventName.handoffFail
103
- event_data: EventData & {
104
- queue_open: boolean
105
- available_agents: boolean
106
- threshold_reached: boolean
107
- }
121
+ event_data: EventDataHandoff
122
+ }
123
+
124
+ export interface EventDataHandoff {
125
+ queue_open: boolean
126
+ available_agents: boolean
127
+ threshold_reached: boolean
108
128
  }
109
129
 
110
- export type HtEvent =
130
+ export type HtEventProps =
111
131
  | EventAgentRating
112
132
  | EventChannelRating
113
133
  | EventFaqUseful
@@ -121,3 +141,10 @@ export type HtEvent =
121
141
  | EventHandoffOption
122
142
  | EventHandoffSuccess
123
143
  | EventHandoffFail
144
+
145
+ export interface RequestData {
146
+ language: string
147
+ country: string
148
+ provider: PROVIDER
149
+ userId: string
150
+ }
package/src/utils.ts ADDED
@@ -0,0 +1,46 @@
1
+ import { HtEvent } from './event-models/ht-event'
2
+ import { HtEventAgentRating } from './event-models/ht-event-agent-rating'
3
+ import { HtEventBotAiModel } from './event-models/ht-event-bot-ai-model'
4
+ import { HtEventBotFaq } from './event-models/ht-event-bot-faq'
5
+ import { HtEventBotKeywordModel } from './event-models/ht-event-bot-keyword-model'
6
+ import { HtEventBotRating } from './event-models/ht-event-bot-rating'
7
+ import { HtEventChannelRating } from './event-models/ht-event-channel-rating'
8
+ import { HtEventFaqUseful } from './event-models/ht-event-faq-useful'
9
+ import { HtEventHandoffFail } from './event-models/ht-event-handoff-fail'
10
+ import { HtEventHandoffSuccess } from './event-models/ht-event-handoff-success'
11
+ import { EventName, HtEventProps, RequestData } from './types'
12
+
13
+ export function createHtEvent(
14
+ requestData: RequestData,
15
+ htEventProps: HtEventProps
16
+ ): HtEvent {
17
+ if (htEventProps.event_type === EventName.botAgentRating) {
18
+ return new HtEventAgentRating(htEventProps, requestData)
19
+ }
20
+ if (htEventProps.event_type === EventName.botChannelRating) {
21
+ return new HtEventChannelRating(htEventProps, requestData)
22
+ }
23
+ if (htEventProps.event_type === EventName.botFaqUseful) {
24
+ return new HtEventFaqUseful(htEventProps, requestData)
25
+ }
26
+ if (htEventProps.event_type === EventName.botRating) {
27
+ return new HtEventBotRating(htEventProps, requestData)
28
+ }
29
+ if (htEventProps.event_type === EventName.botFaq) {
30
+ return new HtEventBotFaq(htEventProps, requestData)
31
+ }
32
+ if (htEventProps.event_type === EventName.botAiModel) {
33
+ return new HtEventBotAiModel(htEventProps, requestData)
34
+ }
35
+ if (htEventProps.event_type === EventName.botKeywordsModel) {
36
+ return new HtEventBotKeywordModel(htEventProps, requestData)
37
+ }
38
+ if (htEventProps.event_type === EventName.handoffSuccess) {
39
+ return new HtEventHandoffSuccess(htEventProps, requestData)
40
+ }
41
+ if (htEventProps.event_type === EventName.handoffFail) {
42
+ return new HtEventHandoffFail(htEventProps, requestData)
43
+ }
44
+
45
+ return new HtEvent(htEventProps, requestData)
46
+ }