Added raw responses and extract utils.
This commit is contained in:
387
util/extract.go
Normal file
387
util/extract.go
Normal file
@@ -0,0 +1,387 @@
|
||||
package util
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"huron.connectingnow.net/fholland/gorm_models/models"
|
||||
)
|
||||
|
||||
func ExtractWithoutAttributes(base models.AnalyticsConversationWithoutAttributes) (models.DBConversation, []models.DBParticipant, []models.DBSession, []models.DBSegment) {
|
||||
|
||||
var startTime *time.Time
|
||||
|
||||
parsedStartTime, err := time.Parse(time.RFC3339, base.ConversationStart)
|
||||
if err != nil {
|
||||
startTime = nil
|
||||
} else {
|
||||
startTime = &parsedStartTime
|
||||
}
|
||||
|
||||
var endTime *time.Time
|
||||
parsedEndTime, err := time.Parse(time.RFC3339, base.ConversationEnd)
|
||||
if err != nil {
|
||||
startTime = nil
|
||||
} else {
|
||||
startTime = &parsedEndTime
|
||||
}
|
||||
|
||||
divisionIdsBytes, err := json.Marshal(base.DivisionIds)
|
||||
if err != nil {
|
||||
divisionIdsBytes = nil
|
||||
}
|
||||
divisionIdsBytesStr := string(divisionIdsBytes)
|
||||
|
||||
currentTime := time.Now()
|
||||
|
||||
conversation := models.DBConversation{
|
||||
DivisionIds: &divisionIdsBytesStr,
|
||||
End: endTime,
|
||||
Id: base.ConversationId,
|
||||
MinMos: &base.MediaStatsMinConversationMos,
|
||||
MinRFactor: &base.MediaStatsMinConversationRFactor,
|
||||
OriginatingDirection: &base.OriginatingDirection,
|
||||
Start: startTime,
|
||||
SemiLiveUpdate: ¤tTime,
|
||||
}
|
||||
var participants []models.DBParticipant
|
||||
var sessions []models.DBSession
|
||||
var segments []models.DBSegment
|
||||
|
||||
for _, p := range base.Participants {
|
||||
|
||||
participant := models.DBParticipant{
|
||||
ConnectedTime: nil,
|
||||
ConversationId: base.ConversationId,
|
||||
EndTime: nil,
|
||||
ExternalContactId: &p.ExternalContactId,
|
||||
Id: p.ParticipantId,
|
||||
Name: &p.ParticipantName,
|
||||
Purpose: &p.Purpose,
|
||||
}
|
||||
participants = append(participants, participant)
|
||||
|
||||
for _, sess := range p.Sessions {
|
||||
mediaEndpointStatsBytes, err := json.Marshal(sess.MediaEndpointStats)
|
||||
if err != nil {
|
||||
mediaEndpointStatsBytes = nil
|
||||
}
|
||||
|
||||
metricsBytes, err := json.Marshal(sess.Metrics)
|
||||
if err != nil {
|
||||
metricsBytes = nil
|
||||
}
|
||||
|
||||
session := models.DBSession{
|
||||
Ani: sess.ANI,
|
||||
Direction: sess.Direction,
|
||||
Dnis: sess.DNIS,
|
||||
EdgeId: sess.EdgeId,
|
||||
Id: fmt.Sprintf("%s_%s", p.ParticipantId, sess.SessionId),
|
||||
MediaEndpointStats: string(mediaEndpointStatsBytes),
|
||||
MediaType: sess.MediaType,
|
||||
Metrics: string(metricsBytes),
|
||||
ParticipantId: p.ParticipantId,
|
||||
ProtocolCallId: sess.ProtocolCallId,
|
||||
Provider: sess.Provider,
|
||||
Recording: sess.Recording,
|
||||
RemoteNameDisplayable: sess.RemoteNameDisplayable,
|
||||
SessionDnis: sess.SessionDNIS,
|
||||
}
|
||||
sessions = append(sessions, session)
|
||||
|
||||
for _, seg := range sess.Segments {
|
||||
|
||||
segmentStart, err := time.Parse(time.RFC3339, seg.SegmentStart)
|
||||
if err != nil {
|
||||
segmentStart = time.Now()
|
||||
}
|
||||
|
||||
segmentEnd, err := time.Parse(time.RFC3339, seg.SegmentEnd)
|
||||
if err != nil {
|
||||
segmentEnd = time.Now()
|
||||
}
|
||||
|
||||
q850ResponseCodesBytes, err := json.Marshal(seg.Q850ResponseCodes)
|
||||
if err != nil {
|
||||
q850ResponseCodesBytes = nil
|
||||
}
|
||||
|
||||
segment := models.DBSegment{
|
||||
Id: fmt.Sprintf("%s_%s", session.Id, seg.SegmentType),
|
||||
Conference: seg.Conference,
|
||||
DisconnectType: seg.DisconnectType,
|
||||
Q850ResponseCodes: string(q850ResponseCodesBytes),
|
||||
SegmentEnd: segmentEnd,
|
||||
SegmentStart: segmentStart,
|
||||
SegmentType: seg.SegmentType,
|
||||
SessionId: sess.SessionId,
|
||||
WrapUpCode: seg.WrapUpCode,
|
||||
}
|
||||
|
||||
segments = append(segments, segment)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return conversation, participants, sessions, segments
|
||||
}
|
||||
|
||||
func ExtractLive(base models.NotificationConversationWithAttributes) (models.DBConversation, []models.DBParticipant, []models.DBCall) {
|
||||
currentTime := time.Now()
|
||||
|
||||
conversation := models.DBConversation{
|
||||
Id: base.Id,
|
||||
Address: &base.Address,
|
||||
ExternalTag: &base.ExternalTag,
|
||||
RecordingState: &base.RecordingState,
|
||||
SecurePause: &base.SecurePause,
|
||||
UtilizationLabelId: &base.UtilizationLabelId,
|
||||
LiveUpdate: ¤tTime,
|
||||
}
|
||||
|
||||
var participants []models.DBParticipant
|
||||
var calls []models.DBCall
|
||||
|
||||
for _, partPayload := range base.Participants {
|
||||
attributesBytes, err := json.Marshal(partPayload.Attributes)
|
||||
if err != nil {
|
||||
attributesBytes = nil
|
||||
}
|
||||
attributesBytesStr := string(attributesBytes)
|
||||
|
||||
mediaRolesBytes, err := json.Marshal(partPayload.MediaRoles)
|
||||
if err != nil {
|
||||
mediaRolesBytes = nil
|
||||
}
|
||||
mediaRolesBytesStr := string(mediaRolesBytes)
|
||||
|
||||
wrapupBytes, err := json.Marshal(partPayload.Wrapup)
|
||||
if err != nil {
|
||||
wrapupBytes = nil
|
||||
}
|
||||
wrapupBytesStr := string(wrapupBytes)
|
||||
|
||||
var connectedTime *time.Time
|
||||
parsedConnectedTime, err := time.Parse(time.RFC3339, partPayload.ConnectedTime)
|
||||
if err != nil {
|
||||
connectedTime = nil
|
||||
} else {
|
||||
connectedTime = &parsedConnectedTime
|
||||
}
|
||||
|
||||
var endTime *time.Time
|
||||
parsedEndTime, err := time.Parse(time.RFC3339, partPayload.EndTime)
|
||||
if err != nil {
|
||||
endTime = nil
|
||||
} else {
|
||||
endTime = &parsedEndTime
|
||||
}
|
||||
|
||||
participant := models.DBParticipant{
|
||||
ConversationId: base.Id,
|
||||
Id: partPayload.Id,
|
||||
Address: &partPayload.Address,
|
||||
Attributes: &attributesBytesStr,
|
||||
ConnectedTime: connectedTime,
|
||||
EndTime: endTime,
|
||||
ExternalContactId: &partPayload.ExternalContactId,
|
||||
ExternalContactInitialDivisionId: &partPayload.ExternalContactInitialDivisionId,
|
||||
MediaRoles: &mediaRolesBytesStr,
|
||||
Name: &partPayload.Name,
|
||||
Purpose: &partPayload.Purpose,
|
||||
QueueId: &partPayload.QueueId,
|
||||
Wrapup: &wrapupBytesStr,
|
||||
WrapupExpected: &partPayload.WrapupExpected,
|
||||
WrapupRequired: &partPayload.WrapupRequired,
|
||||
}
|
||||
participants = append(participants, participant)
|
||||
|
||||
for _, callPayload := range partPayload.Calls {
|
||||
var connectedTime *time.Time
|
||||
parsedConnectedTime, err := time.Parse(time.RFC3339, callPayload.ConnectedTime)
|
||||
if err != nil {
|
||||
connectedTime = nil
|
||||
} else {
|
||||
connectedTime = &parsedConnectedTime
|
||||
}
|
||||
|
||||
var disconnectedTime *time.Time
|
||||
parsedDisconnectedTime, err := time.Parse(time.RFC3339, callPayload.DisconnectedTime)
|
||||
if err != nil {
|
||||
disconnectedTime = nil
|
||||
} else {
|
||||
disconnectedTime = &parsedDisconnectedTime
|
||||
}
|
||||
|
||||
otherBytes, err := json.Marshal(callPayload.Other)
|
||||
if err != nil {
|
||||
otherBytes = nil
|
||||
}
|
||||
|
||||
selfBytes, err := json.Marshal(callPayload.Self)
|
||||
if err != nil {
|
||||
selfBytes = nil
|
||||
}
|
||||
|
||||
disconnectReasonsBytes, err := json.Marshal(callPayload.DisconnectReasons)
|
||||
if err != nil {
|
||||
disconnectReasonsBytes = nil
|
||||
}
|
||||
|
||||
call := models.DBCall{
|
||||
ParticipantId: partPayload.Id,
|
||||
AfterCallWorkRequired: callPayload.AfterCallWorkRequired,
|
||||
Confined: callPayload.Confined,
|
||||
ConnectedTime: connectedTime,
|
||||
DisconnectedTime: disconnectedTime,
|
||||
Direction: callPayload.Direction,
|
||||
DisconnectReasons: string(disconnectReasonsBytes),
|
||||
DisconnectType: callPayload.DisconnectType,
|
||||
Held: callPayload.Held,
|
||||
Id: callPayload.Id,
|
||||
InitialState: callPayload.InitialState,
|
||||
Muted: callPayload.Muted,
|
||||
Other: string(otherBytes),
|
||||
Provider: callPayload.Provider,
|
||||
Recording: callPayload.Recording,
|
||||
RecordingState: callPayload.RecordingState,
|
||||
SecurePause: callPayload.SecurePause,
|
||||
Self: string(selfBytes),
|
||||
State: callPayload.State,
|
||||
}
|
||||
|
||||
calls = append(calls, call)
|
||||
}
|
||||
}
|
||||
|
||||
return conversation, participants, calls
|
||||
|
||||
}
|
||||
|
||||
func ExtractWithAttributes(base models.AnalyticsConversationWithAttributes) (models.DBConversation, []models.DBParticipant, []models.DBSession, []models.DBSegment) {
|
||||
|
||||
var startTime *time.Time
|
||||
parsedStartTime, err := time.Parse(time.RFC3339, base.ConversationStart)
|
||||
if err != nil {
|
||||
startTime = nil
|
||||
} else {
|
||||
startTime = &parsedStartTime
|
||||
}
|
||||
|
||||
var endTime *time.Time
|
||||
parsedEndTime, err := time.Parse(time.RFC3339, base.ConversationEnd)
|
||||
if err != nil {
|
||||
endTime = nil
|
||||
} else {
|
||||
endTime = &parsedEndTime
|
||||
}
|
||||
|
||||
divisionIdsBytes, err := json.Marshal(base.DivisionIds)
|
||||
if err != nil {
|
||||
divisionIdsBytes = nil
|
||||
}
|
||||
divisionIdsBytesStr := string(divisionIdsBytes)
|
||||
|
||||
currentTime := time.Now()
|
||||
|
||||
conversation := models.DBConversation{
|
||||
DivisionIds: &divisionIdsBytesStr,
|
||||
End: endTime,
|
||||
Id: base.ConversationId,
|
||||
MinMos: &base.MediaStatsMinConversationMos,
|
||||
MinRFactor: &base.MediaStatsMinConversationRFactor,
|
||||
OriginatingDirection: &base.OriginatingDirection,
|
||||
Start: startTime,
|
||||
JobUpdate: ¤tTime,
|
||||
}
|
||||
var participants []models.DBParticipant
|
||||
var sessions []models.DBSession
|
||||
var segments []models.DBSegment
|
||||
|
||||
for _, p := range base.Participants {
|
||||
|
||||
attributesBytes, err := json.Marshal(p.Attributes)
|
||||
if err != nil {
|
||||
attributesBytes = nil
|
||||
}
|
||||
attributesBytesStr := string(attributesBytes)
|
||||
|
||||
participant := models.DBParticipant{
|
||||
ConnectedTime: nil,
|
||||
ConversationId: base.ConversationId,
|
||||
EndTime: nil,
|
||||
ExternalContactId: &p.ExternalContactId,
|
||||
Id: p.ParticipantId,
|
||||
Name: &p.ParticipantName,
|
||||
Purpose: &p.Purpose,
|
||||
Attributes: &attributesBytesStr,
|
||||
}
|
||||
participants = append(participants, participant)
|
||||
|
||||
for _, sess := range p.Sessions {
|
||||
mediaEndpointStatsBytes, err := json.Marshal(sess.MediaEndpointStats)
|
||||
if err != nil {
|
||||
mediaEndpointStatsBytes = nil
|
||||
}
|
||||
|
||||
metricsBytes, err := json.Marshal(sess.Metrics)
|
||||
if err != nil {
|
||||
metricsBytes = nil
|
||||
}
|
||||
|
||||
session := models.DBSession{
|
||||
Ani: sess.ANI,
|
||||
Direction: sess.Direction,
|
||||
Dnis: sess.DNIS,
|
||||
EdgeId: sess.EdgeId,
|
||||
Id: fmt.Sprintf("%s_%s", p.ParticipantId, sess.SessionId),
|
||||
MediaEndpointStats: string(mediaEndpointStatsBytes),
|
||||
MediaType: sess.MediaType,
|
||||
Metrics: string(metricsBytes),
|
||||
ParticipantId: p.ParticipantId,
|
||||
ProtocolCallId: sess.ProtocolCallId,
|
||||
Provider: sess.Provider,
|
||||
Recording: sess.Recording,
|
||||
RemoteNameDisplayable: sess.RemoteNameDisplayable,
|
||||
SessionDnis: sess.SessionDnis,
|
||||
}
|
||||
sessions = append(sessions, session)
|
||||
|
||||
for _, seg := range sess.Segments {
|
||||
|
||||
segmentStart, err := time.Parse(time.RFC3339, seg.SegmentStart)
|
||||
if err != nil {
|
||||
segmentStart = time.Now()
|
||||
}
|
||||
|
||||
segmentEnd, err := time.Parse(time.RFC3339, seg.SegmentEnd)
|
||||
if err != nil {
|
||||
segmentEnd = time.Now()
|
||||
}
|
||||
|
||||
q850ResponseCodesBytes, err := json.Marshal(seg.Q850ResponseCodes)
|
||||
if err != nil {
|
||||
q850ResponseCodesBytes = nil
|
||||
}
|
||||
|
||||
segment := models.DBSegment{
|
||||
Id: fmt.Sprintf("%s_%s", session.Id, seg.SegmentType),
|
||||
Conference: seg.Conference,
|
||||
DisconnectType: seg.DisconnectType,
|
||||
Q850ResponseCodes: string(q850ResponseCodesBytes),
|
||||
SegmentEnd: segmentEnd,
|
||||
SegmentStart: segmentStart,
|
||||
SegmentType: seg.SegmentType,
|
||||
SessionId: sess.SessionId,
|
||||
WrapUpCode: seg.WrapUpCode,
|
||||
}
|
||||
|
||||
segments = append(segments, segment)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return conversation, participants, sessions, segments
|
||||
}
|
||||
Reference in New Issue
Block a user