diff --git a/util/extract.go b/util/extract.go index c27ecfe..ad4e08d 100644 --- a/util/extract.go +++ b/util/extract.go @@ -262,125 +262,123 @@ func ExtractLive(base models.NotificationConversationWithAttributes) (models.DBC } -//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) -// -// conversation := models.DBConversation{ -// DivisionIds: &divisionIdsBytesStr, -// End: endTime, -// Id: base.ConversationId, -// MinMos: &base.MediaStatsMinConversationMos, -// MinRFactor: &base.MediaStatsMinConversationRFactor, -// OriginatingDirection: &base.OriginatingDirection, -// Start: startTime, -// } -// 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 -//} +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) + + conversation := models.DBConversation{ + DivisionIds: &divisionIdsBytesStr, + End: endTime, + Id: base.ConversationId, + MinMos: &base.MediaStatsMinConversationMos, + MinRFactor: &base.MediaStatsMinConversationRFactor, + OriginatingDirection: &base.OriginatingDirection, + Start: startTime, + } + 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{ + ConversationId: base.ConversationId, + 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 idx, 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_%d", session.Id, seg.SegmentType, idx), + 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 +}